From da6976eb0ad82904865f47ca524c7f4be453deaa Mon Sep 17 00:00:00 2001 From: Ferdinando Papale <4850119+papafe@users.noreply.github.com> Date: Tue, 16 Apr 2024 13:00:19 +0200 Subject: [PATCH 1/5] Fixed equality comparison for collections in mixed --- Realm/Realm/DatabaseTypes/RealmValue.cs | 2 + .../Database/RealmValueWithCollections.cs | 49 ++++++++++--------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/Realm/Realm/DatabaseTypes/RealmValue.cs b/Realm/Realm/DatabaseTypes/RealmValue.cs index 0943fddb4a..f94deaefee 100644 --- a/Realm/Realm/DatabaseTypes/RealmValue.cs +++ b/Realm/Realm/DatabaseTypes/RealmValue.cs @@ -1533,6 +1533,8 @@ public bool Equals(RealmValue other) RealmValueType.ObjectId => AsObjectId() == other.AsObjectId(), RealmValueType.Guid => AsGuid() == other.AsGuid(), RealmValueType.Object => AsIRealmObject().Equals(other.AsIRealmObject()), + RealmValueType.List => AsList().Equals(other.AsList()), + RealmValueType.Dictionary => AsDictionary().Equals(other.AsDictionary()), RealmValueType.Null => true, _ => false, }; diff --git a/Tests/Realm.Tests/Database/RealmValueWithCollections.cs b/Tests/Realm.Tests/Database/RealmValueWithCollections.cs index 9a2d318d5c..75310f3513 100644 --- a/Tests/Realm.Tests/Database/RealmValueWithCollections.cs +++ b/Tests/Realm.Tests/Database/RealmValueWithCollections.cs @@ -89,28 +89,36 @@ public void List_WhenRetrieved_WorksWithAllTypes([Values(true, false)] bool isMa Assert.That(rv.As>(), Is.EqualTo(originalList).Using(_rvComparer)); } + [Test] - public void List_InRealmValue_NotEqualToAnything([Values(true, false)] bool isManaged) + public void List_Equality([Values(true, false)] bool isManaged) { - var innerList = ListGenerator(1); - var innerDict = DictGenerator(1); + var originalList = new List { 1, true, "string" }; + + RealmValue rv = originalList; + + if (isManaged) + { + rv = PersistAndFind(rv).RealmValueProperty; + } + + Assert.That(rv.Type, Is.EqualTo(RealmValueType.List)); + Assert.That(rv != RealmValue.Null); + + Assert.That(rv.AsList(), Is.EqualTo(originalList).Using(_rvComparer)); + Assert.That(rv.AsAny(), Is.EqualTo(originalList).Using(_rvComparer)); + Assert.That(rv.As>(), Is.EqualTo(originalList).Using(_rvComparer)); + } + [Test] + public void List_InRealmValue_Equality([Values(true, false)] bool isManaged) + { var originalList = new List { RealmValue.Null, 1, true, - "string", - new byte[] { 0, 1, 2 }, - new DateTimeOffset(1234, 5, 6, 7, 8, 9, TimeSpan.Zero), - 1f, - 2d, - 3m, - new ObjectId("5f63e882536de46d71877979"), - Guid.Parse("3809d6d9-7618-4b3d-8044-2aa35fd02f31"), - new InternalObject { IntProperty = 10, StringProperty = "brown" }, - innerList, - innerDict, + "string" }; RealmValue rv = originalList; @@ -120,8 +128,8 @@ public void List_InRealmValue_NotEqualToAnything([Values(true, false)] bool isMa rv = PersistAndFind(rv).RealmValueProperty; } - Assert.That(rv == originalList, Is.False); - Assert.That(rv.Equals(originalList), Is.False); + Assert.That(rv == originalList, isManaged ? Is.False : Is.True); + Assert.That(rv.Equals(originalList), isManaged ? Is.False : Is.True); } [Test] @@ -579,14 +587,9 @@ public void Dictionary_WhenRetrieved_WorksWithAllTypes([Values(true, false)] boo [Test] public void Dictionary_InRealmValue_NotEqualToAnything([Values(true, false)] bool isManaged) { - var innerList = ListGenerator(1); - var innerDict = DictGenerator(1); - var originalDict = new Dictionary { { "c", new InternalObject { IntProperty = 10, StringProperty = "brown" } }, - { "d", innerList }, - { "e", innerDict }, }; RealmValue rv = originalDict; @@ -596,8 +599,8 @@ public void Dictionary_InRealmValue_NotEqualToAnything([Values(true, false)] boo rv = PersistAndFind(rv).RealmValueProperty; } - Assert.That(rv == originalDict, Is.False); - Assert.That(rv.Equals(originalDict), Is.False); + Assert.That(rv == originalDict, isManaged ? Is.False : Is.True); + Assert.That(rv.Equals(originalDict), isManaged ? Is.False : Is.True); } [Test] From c245d19f62d6173c4a695fb8e89bb4bff3ec2034 Mon Sep 17 00:00:00 2001 From: Ferdinando Papale <4850119+papafe@users.noreply.github.com> Date: Tue, 16 Apr 2024 13:03:37 +0200 Subject: [PATCH 2/5] Fix --- Tests/Realm.Tests/Database/RealmValueWithCollections.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Tests/Realm.Tests/Database/RealmValueWithCollections.cs b/Tests/Realm.Tests/Database/RealmValueWithCollections.cs index 75310f3513..1e64d35aa8 100644 --- a/Tests/Realm.Tests/Database/RealmValueWithCollections.cs +++ b/Tests/Realm.Tests/Database/RealmValueWithCollections.cs @@ -128,6 +128,9 @@ public void List_InRealmValue_Equality([Values(true, false)] bool isManaged) rv = PersistAndFind(rv).RealmValueProperty; } +#pragma warning disable CS1718 // Comparison made to same variable + Assert.That(rv == rv, Is.True); +#pragma warning restore CS1718 // Comparison made to same variable Assert.That(rv == originalList, isManaged ? Is.False : Is.True); Assert.That(rv.Equals(originalList), isManaged ? Is.False : Is.True); } @@ -599,6 +602,9 @@ public void Dictionary_InRealmValue_NotEqualToAnything([Values(true, false)] boo rv = PersistAndFind(rv).RealmValueProperty; } +#pragma warning disable CS1718 // Comparison made to same variable + Assert.That(rv == rv, Is.True); +#pragma warning restore CS1718 // Comparison made to same variable Assert.That(rv == originalDict, isManaged ? Is.False : Is.True); Assert.That(rv.Equals(originalDict), isManaged ? Is.False : Is.True); } From cdbf7f6c2f569a50e19b695ee935da74cecf3398 Mon Sep 17 00:00:00 2001 From: Ferdinando Papale <4850119+papafe@users.noreply.github.com> Date: Tue, 16 Apr 2024 13:09:23 +0200 Subject: [PATCH 3/5] Corrections --- .../Database/RealmValueWithCollections.cs | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/Tests/Realm.Tests/Database/RealmValueWithCollections.cs b/Tests/Realm.Tests/Database/RealmValueWithCollections.cs index 1e64d35aa8..0f5252fdb0 100644 --- a/Tests/Realm.Tests/Database/RealmValueWithCollections.cs +++ b/Tests/Realm.Tests/Database/RealmValueWithCollections.cs @@ -89,27 +89,6 @@ public void List_WhenRetrieved_WorksWithAllTypes([Values(true, false)] bool isMa Assert.That(rv.As>(), Is.EqualTo(originalList).Using(_rvComparer)); } - - [Test] - public void List_Equality([Values(true, false)] bool isManaged) - { - var originalList = new List { 1, true, "string" }; - - RealmValue rv = originalList; - - if (isManaged) - { - rv = PersistAndFind(rv).RealmValueProperty; - } - - Assert.That(rv.Type, Is.EqualTo(RealmValueType.List)); - Assert.That(rv != RealmValue.Null); - - Assert.That(rv.AsList(), Is.EqualTo(originalList).Using(_rvComparer)); - Assert.That(rv.AsAny(), Is.EqualTo(originalList).Using(_rvComparer)); - Assert.That(rv.As>(), Is.EqualTo(originalList).Using(_rvComparer)); - } - [Test] public void List_InRealmValue_Equality([Values(true, false)] bool isManaged) { @@ -588,7 +567,7 @@ public void Dictionary_WhenRetrieved_WorksWithAllTypes([Values(true, false)] boo } [Test] - public void Dictionary_InRealmValue_NotEqualToAnything([Values(true, false)] bool isManaged) + public void Dictionary_InRealmValue_Equality([Values(true, false)] bool isManaged) { var originalDict = new Dictionary { From d943397c8b41039f691b158f7a73b34a9b59d920 Mon Sep 17 00:00:00 2001 From: Ferdinando Papale <4850119+papafe@users.noreply.github.com> Date: Tue, 16 Apr 2024 15:34:46 +0200 Subject: [PATCH 4/5] Reinstatet cases --- .../Database/RealmValueWithCollections.cs | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Tests/Realm.Tests/Database/RealmValueWithCollections.cs b/Tests/Realm.Tests/Database/RealmValueWithCollections.cs index 0f5252fdb0..2a165edd65 100644 --- a/Tests/Realm.Tests/Database/RealmValueWithCollections.cs +++ b/Tests/Realm.Tests/Database/RealmValueWithCollections.cs @@ -92,12 +92,25 @@ public void List_WhenRetrieved_WorksWithAllTypes([Values(true, false)] bool isMa [Test] public void List_InRealmValue_Equality([Values(true, false)] bool isManaged) { + var innerList = ListGenerator(1); + var innerDict = DictGenerator(1); + var originalList = new List { RealmValue.Null, 1, true, - "string" + "string", + new byte[] { 0, 1, 2 }, + new DateTimeOffset(1234, 5, 6, 7, 8, 9, TimeSpan.Zero), + 1f, + 2d, + 3m, + new ObjectId("5f63e882536de46d71877979"), + Guid.Parse("3809d6d9-7618-4b3d-8044-2aa35fd02f31"), + new InternalObject { IntProperty = 10, StringProperty = "brown" }, + innerList, + innerDict, }; RealmValue rv = originalList; @@ -569,9 +582,14 @@ public void Dictionary_WhenRetrieved_WorksWithAllTypes([Values(true, false)] boo [Test] public void Dictionary_InRealmValue_Equality([Values(true, false)] bool isManaged) { + var innerList = ListGenerator(1); + var innerDict = DictGenerator(1); + var originalDict = new Dictionary { { "c", new InternalObject { IntProperty = 10, StringProperty = "brown" } }, + { "d", innerList }, + { "e", innerDict }, }; RealmValue rv = originalDict; From 746e17dd3c7b313537fcc2c9ef6a6a4e416bffd0 Mon Sep 17 00:00:00 2001 From: Ferdinando Papale <4850119+papafe@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:00:08 +0200 Subject: [PATCH 5/5] Added missing cases plus explanation --- .../Database/RealmValueWithCollections.cs | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/Tests/Realm.Tests/Database/RealmValueWithCollections.cs b/Tests/Realm.Tests/Database/RealmValueWithCollections.cs index 2a165edd65..436746b165 100644 --- a/Tests/Realm.Tests/Database/RealmValueWithCollections.cs +++ b/Tests/Realm.Tests/Database/RealmValueWithCollections.cs @@ -113,7 +113,26 @@ public void List_InRealmValue_Equality([Values(true, false)] bool isManaged) innerDict, }; + var copyOriginalList = new List + { + RealmValue.Null, + 1, + true, + "string", + new byte[] { 0, 1, 2 }, + new DateTimeOffset(1234, 5, 6, 7, 8, 9, TimeSpan.Zero), + 1f, + 2d, + 3m, + new ObjectId("5f63e882536de46d71877979"), + Guid.Parse("3809d6d9-7618-4b3d-8044-2aa35fd02f31"), + new InternalObject { IntProperty = 10, StringProperty = "brown" }, + innerList, + innerDict, + }; + RealmValue rv = originalList; + RealmValue rv2 = copyOriginalList; if (isManaged) { @@ -123,6 +142,13 @@ public void List_InRealmValue_Equality([Values(true, false)] bool isManaged) #pragma warning disable CS1718 // Comparison made to same variable Assert.That(rv == rv, Is.True); #pragma warning restore CS1718 // Comparison made to same variable + Assert.That(rv.Equals(rv), Is.True); + + // They contains the same values, but the collections do not point to the same object reference + Assert.That(rv == rv2, Is.False); + Assert.That(rv.Equals(rv2), Is.False); + + // If the object is unmanaged, the RealmValue just wraps the collection Assert.That(rv == originalList, isManaged ? Is.False : Is.True); Assert.That(rv.Equals(originalList), isManaged ? Is.False : Is.True); } @@ -592,7 +618,15 @@ public void Dictionary_InRealmValue_Equality([Values(true, false)] bool isManage { "e", innerDict }, }; + var copyOriginalDict = new Dictionary + { + { "c", new InternalObject { IntProperty = 10, StringProperty = "brown" } }, + { "d", innerList }, + { "e", innerDict }, + }; + RealmValue rv = originalDict; + RealmValue rv2 = copyOriginalDict; if (isManaged) { @@ -602,6 +636,13 @@ public void Dictionary_InRealmValue_Equality([Values(true, false)] bool isManage #pragma warning disable CS1718 // Comparison made to same variable Assert.That(rv == rv, Is.True); #pragma warning restore CS1718 // Comparison made to same variable + Assert.That(rv.Equals(rv), Is.True); + + // They contains the same values, but the collections do not point to the same object reference + Assert.That(rv == rv2, Is.False); + Assert.That(rv.Equals(rv2), Is.False); + + // If the object is unmanaged, the RealmValue just wraps the collection Assert.That(rv == originalDict, isManaged ? Is.False : Is.True); Assert.That(rv.Equals(originalDict), isManaged ? Is.False : Is.True); }