Skip to content

Instantly share code, notes, and snippets.

@etorreborre
Last active May 27, 2016 21:08
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save etorreborre/5699231208c47ee78d6eee0f015e5a1b to your computer and use it in GitHub Desktop.
ai.x.diff with a Matcher
import org.specs2.matcher._, MatchersImplicits._
def beSimilarTo[T : DiffShow](expected: T): Matcher[T] = { actual: T =>
val difference = DiffShow[T].diff(actual, expected)
difference match {
case Identical(_) => (true, difference.string)
case Different(_) => (false, difference.string)
}
}
sealed trait Parent
case class Bar( s: String, i: Int ) extends Parent
case class Foo( bar: Bar, b: List[Int], parent: Option[Parent] ) extends Parent
val before: Foo = Foo(
Bar( "asdf", 5 ),
List( 123, 1234 ),
Some( Bar( "asdf", 5 ) )
)
val after: Foo = Foo(
Bar( "asdf", 66 ),
List( 1234 ),
Some( Bar( "qwer", 5 ) )
)
before must beSimilarTo(after)
[error] ! before must beSimilarTo(after)
[error] java.lang.Exception: Cannot find DiffShow[de.zalando.artmc.mi.config.Parent] to diff values (Bar(asdf,5), Bar(qwer,5)) (diff.scala:112)
[error] ai.x.diff.DiffShowInstancesLowPriority$$anonfun$fallbackException$4.apply(diff.scala:112)
[error] ai.x.diff.DiffShowInstancesLowPriority$$anonfun$fallbackException$4.apply(diff.scala:112)
[error] ai.x.diff.DiffShowInstancesLowPriority$$anon$3.diff(diff.scala:105)
[error] ai.x.diff.DiffShow$.diff(diff.scala:51)
[error] ai.x.diff.DiffShowFields$$anon$2.diff(diff.scala:93)
[error] ai.x.diff.DiffShowFields$$anon$2.diff(diff.scala:89)
[error] ai.x.diff.DiffShowInstances$CaseClassDiffShow.diff(diff.scala:287)
[error] ai.x.diff.DiffShowInstances$$anon$6.diff(diff.scala:253)
[error] ai.x.diff.DiffShowInstances$$anon$6.diff(diff.scala:244)
[error] ai.x.diff.DiffShowInstances$$anon$6.diff(diff.scala:254)
[error] ai.x.diff.DiffShowInstances$$anon$6.diff(diff.scala:244)
[error] ai.x.diff.DiffShowInstances$$anon$7.diff(diff.scala:267)
[error] ai.x.diff.DiffShow$.diff(diff.scala:51)
[error] ai.x.diff.DiffShowFields$$anon$2.diff(diff.scala:93)
[error] ai.x.diff.DiffShowFields$$anon$2.diff(diff.scala:89)
[error] ai.x.diff.DiffShowFields$$anon$2.diff(diff.scala:93)
[error] ai.x.diff.DiffShowFields$$anon$2.diff(diff.scala:89)
[error] ai.x.diff.DiffShowFields$$anon$2.diff(diff.scala:93)
[error] ai.x.diff.DiffShowFields$$anon$2.diff(diff.scala:89)
[error] ai.x.diff.DiffShowInstances$CaseClassDiffShow.diff(diff.scala:287)
@cvogt
Copy link

cvogt commented May 27, 2016

Works for me with this code

import ai.x.diff._
import org.specs2.mutable.Specification
class DateRangeSpec extends Specification {

  "foo" should {
    import org.specs2.matcher._, MatchersImplicits._

    def beSimilarTo[T: DiffShow]( expected: T ): Matcher[T] = { actual: T =>
      val difference = DiffShow[T].diff( actual, expected )
      difference match {
        case Identical( _ ) => ( true, difference.string )
        case Different( _ ) => ( false, difference.string )
      }
    }

    sealed trait Parent
    case class Bar( s: String, i: Int ) extends Parent
    case class Foo( bar: Bar, b: List[Int], parent: Option[Parent] ) extends Parent

    val before: Foo = Foo(
      Bar( "asdf", 5 ),
      List( 123, 1234 ),
      Some( Bar( "asdf", 5 ) )
    )

    val after: Foo = Foo(
      Bar( "asdf", 66 ),
      List( 1234 ),
      Some( Bar( "qwer", 5 ) )
    )

    before must beSimilarTo( after )
  }
}

@cvogt
Copy link

cvogt commented May 27, 2016

screen shot 2016-05-27 at 16 56 54

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment