softwaremill / diffx

Pretty diffs for scala case classes
Apache License 2.0
345 stars 30 forks source link

Returning `IdenticalValue` for a case class #420

Open AvaPL opened 1 year ago

AvaPL commented 1 year ago

Hi,

I have a question regarding the behaviour of the diff for case classes. Here is a short example:

  import com.softwaremill.diffx._

  case class FooBar(
    foo: String,
    bar: String
  )

  object FooBar {
    implicit val fooBarDiff: Diff[FooBar] = Diff.derived
  }

  "compare" should "return IdenticalValue for the same instance" in {
    val fooBarInstance = FooBar("a", "b")
    val diffResult = compare(fooBarInstance, fooBarInstance)
    diffResult shouldBe IdenticalValue(fooBarInstance)
  }

In a case like this, it was obvious that I'd receive IdenticalValue. Instead, the test fails with:

DiffResultObject(FooBar,ListMap(foo -> IdenticalValue(a), bar -> IdenticalValue(b))) was not equal to IdenticalValue(FooBar(a,b))

Is it intended behaviour? If it is, is there any alternative that will allow me to receive an IdenticalValue when the fields are identical and DiffResultObject when the fields are different? Of course, my example is simplified. My real scenario contains a larger hierarchy of nested objects, so manually creating a Diff will be quite hard.

I know that I can use isIdentical but I'd like to extract the whole identical entity from the diff. DiffResultObject contains only the name and a map of fields.

When I was using version 0.4.5 it worked as expected. My current diffx version is 0.8.0.

ghostbuster91 commented 1 year ago

Hi,

Yes, the change was made deliberately to improve rendering of big structures when they are identical but contain some ignored fields inside.

Atm there is no way to retrieve the full original entity. This is a use-case that I didn't take into account.

Could you shed some light on what for do you actually need that identical instance? Maybe there is some bigger issue that we should aim to resolve instead.

AvaPL commented 1 year ago

My use case was to do a diff on an entity and then produce an event with the entity based on the result. For identical entities, it was just an IdentitcalEntityEvent with the entity itself. Now, when I get a DiffResultObject, I cannot extract this entity and produce the event easily.