diffx icon indicating copy to clipboard operation
diffx copied to clipboard

Returning `IdenticalValue` for a case class

Open AvaPL opened this issue 3 years ago • 2 comments

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.

AvaPL avatar Oct 28 '22 12:10 AvaPL

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.

ghostbuster91 avatar Oct 31 '22 07:10 ghostbuster91

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.

AvaPL avatar Oct 31 '22 11:10 AvaPL