11using FluentAssertions ;
22
3- namespace Generator . Equals . Tests . Diff . Classes ;
3+ namespace Generator . Equals . Tests . Classes . Diff ;
44
55/// <summary>
66/// Diff tests for collection properties: ordered, unordered, set, and dictionary.
77/// </summary>
88public partial class CollectionDiffTests
99{
10+ static ( string Path , object ? Left , object ? Right ) Diff ( string path , object ? left , object ? right )
11+ => ( path , left , right ) ;
12+
1013 [ Equatable ]
1114 public partial class Sample
1215 {
@@ -41,10 +44,7 @@ public void OrderedCollection_DifferentItem_ReportsIndex()
4144
4245 var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
4346
44- diffs . Should ( ) . ContainSingle ( ) ;
45- diffs [ 0 ] . Path . Should ( ) . Be ( "Items[1]" ) ;
46- diffs [ 0 ] . Left . Should ( ) . Be ( 2 ) ;
47- diffs [ 0 ] . Right . Should ( ) . Be ( 99 ) ;
47+ diffs . Should ( ) . BeEquivalentTo ( new [ ] { Diff ( "Items[1]" , 2 , 99 ) } ) ;
4848 }
4949
5050 [ Fact ]
@@ -55,10 +55,7 @@ public void OrderedCollection_ExtraItemInRight_ReportsNullLeft()
5555
5656 var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
5757
58- diffs . Should ( ) . ContainSingle ( ) ;
59- diffs [ 0 ] . Path . Should ( ) . Be ( "Items[2]" ) ;
60- diffs [ 0 ] . Left . Should ( ) . BeNull ( ) ;
61- diffs [ 0 ] . Right . Should ( ) . Be ( 3 ) ;
58+ diffs . Should ( ) . BeEquivalentTo ( new [ ] { Diff ( "Items[2]" , null , 3 ) } ) ;
6259 }
6360
6461 [ Fact ]
@@ -69,10 +66,22 @@ public void OrderedCollection_ExtraItemInLeft_ReportsNullRight()
6966
7067 var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
7168
72- diffs . Should ( ) . ContainSingle ( ) ;
73- diffs [ 0 ] . Path . Should ( ) . Be ( "Items[2]" ) ;
74- diffs [ 0 ] . Left . Should ( ) . Be ( 3 ) ;
75- diffs [ 0 ] . Right . Should ( ) . BeNull ( ) ;
69+ diffs . Should ( ) . BeEquivalentTo ( new [ ] { Diff ( "Items[2]" , 3 , null ) } ) ;
70+ }
71+
72+ [ Fact ]
73+ public void OrderedCollection_MultipleDifferences_ReportsAll ( )
74+ {
75+ var a = new Sample { Items = [ 1 , 2 , 3 ] } ;
76+ var b = new Sample { Items = [ 9 , 2 , 8 ] } ;
77+
78+ var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
79+
80+ diffs . Should ( ) . BeEquivalentTo ( new [ ]
81+ {
82+ Diff ( "Items[0]" , 1 , 9 ) ,
83+ Diff ( "Items[2]" , 3 , 8 )
84+ } ) ;
7685 }
7786
7887 #endregion
@@ -98,10 +107,7 @@ public void UnorderedSet_AddedItem_ReportsAddition()
98107
99108 var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
100109
101- diffs . Should ( ) . ContainSingle ( ) ;
102- diffs [ 0 ] . Path . Should ( ) . Be ( "Tags[+]" ) ;
103- diffs [ 0 ] . Left . Should ( ) . BeNull ( ) ;
104- diffs [ 0 ] . Right . Should ( ) . Be ( "c" ) ;
110+ diffs . Should ( ) . BeEquivalentTo ( new [ ] { Diff ( "Tags[+]" , null , "c" ) } ) ;
105111 }
106112
107113 [ Fact ]
@@ -112,10 +118,7 @@ public void UnorderedSet_RemovedItem_ReportsRemoval()
112118
113119 var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
114120
115- diffs . Should ( ) . ContainSingle ( ) ;
116- diffs [ 0 ] . Path . Should ( ) . Be ( "Tags[-]" ) ;
117- diffs [ 0 ] . Left . Should ( ) . Be ( "c" ) ;
118- diffs [ 0 ] . Right . Should ( ) . BeNull ( ) ;
121+ diffs . Should ( ) . BeEquivalentTo ( new [ ] { Diff ( "Tags[-]" , "c" , null ) } ) ;
119122 }
120123
121124 [ Fact ]
@@ -126,9 +129,11 @@ public void UnorderedSet_MultipleChanges_ReportsAllChanges()
126129
127130 var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
128131
129- diffs . Should ( ) . HaveCount ( 2 ) ;
130- diffs . Should ( ) . Contain ( d => d . Path == "Tags[-]" && ( string ? ) d . Left == "a" ) ;
131- diffs . Should ( ) . Contain ( d => d . Path == "Tags[+]" && ( string ? ) d . Right == "c" ) ;
132+ diffs . Should ( ) . BeEquivalentTo ( new [ ]
133+ {
134+ Diff ( "Tags[-]" , "a" , null ) ,
135+ Diff ( "Tags[+]" , null , "c" )
136+ } ) ;
132137 }
133138
134139 #endregion
@@ -154,10 +159,7 @@ public void Dictionary_AddedKey_ReportsAddition()
154159
155160 var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
156161
157- diffs . Should ( ) . ContainSingle ( ) ;
158- diffs [ 0 ] . Path . Should ( ) . Be ( "Properties[y]" ) ;
159- diffs [ 0 ] . Left . Should ( ) . BeNull ( ) ;
160- diffs [ 0 ] . Right . Should ( ) . Be ( 2 ) ;
162+ diffs . Should ( ) . BeEquivalentTo ( new [ ] { Diff ( "Properties[y]" , null , 2 ) } ) ;
161163 }
162164
163165 [ Fact ]
@@ -168,10 +170,7 @@ public void Dictionary_RemovedKey_ReportsRemoval()
168170
169171 var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
170172
171- diffs . Should ( ) . ContainSingle ( ) ;
172- diffs [ 0 ] . Path . Should ( ) . Be ( "Properties[y]" ) ;
173- diffs [ 0 ] . Left . Should ( ) . Be ( 2 ) ;
174- diffs [ 0 ] . Right . Should ( ) . BeNull ( ) ;
173+ diffs . Should ( ) . BeEquivalentTo ( new [ ] { Diff ( "Properties[y]" , 2 , null ) } ) ;
175174 }
176175
177176 [ Fact ]
@@ -182,10 +181,7 @@ public void Dictionary_ChangedValue_ReportsChange()
182181
183182 var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
184183
185- diffs . Should ( ) . ContainSingle ( ) ;
186- diffs [ 0 ] . Path . Should ( ) . Be ( "Properties[x]" ) ;
187- diffs [ 0 ] . Left . Should ( ) . Be ( 1 ) ;
188- diffs [ 0 ] . Right . Should ( ) . Be ( 99 ) ;
184+ diffs . Should ( ) . BeEquivalentTo ( new [ ] { Diff ( "Properties[x]" , 1 , 99 ) } ) ;
189185 }
190186
191187 [ Fact ]
@@ -196,9 +192,11 @@ public void Dictionary_NullVsNonNull_ReportsAllKeysAdded()
196192
197193 var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
198194
199- diffs . Should ( ) . HaveCount ( 2 ) ;
200- diffs . Should ( ) . Contain ( d => d . Path == "Properties[x]" && d . Left == null && ( int ? ) d . Right == 1 ) ;
201- diffs . Should ( ) . Contain ( d => d . Path == "Properties[y]" && d . Left == null && ( int ? ) d . Right == 2 ) ;
195+ diffs . Should ( ) . BeEquivalentTo ( new [ ]
196+ {
197+ Diff ( "Properties[x]" , null , 1 ) ,
198+ Diff ( "Properties[y]" , null , 2 )
199+ } ) ;
202200 }
203201
204202 [ Fact ]
@@ -209,9 +207,27 @@ public void Dictionary_NonNullVsNull_ReportsAllKeysRemoved()
209207
210208 var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
211209
212- diffs . Should ( ) . HaveCount ( 2 ) ;
213- diffs . Should ( ) . Contain ( d => d . Path == "Properties[x]" && ( int ? ) d . Left == 1 && d . Right == null ) ;
214- diffs . Should ( ) . Contain ( d => d . Path == "Properties[y]" && ( int ? ) d . Left == 2 && d . Right == null ) ;
210+ diffs . Should ( ) . BeEquivalentTo ( new [ ]
211+ {
212+ Diff ( "Properties[x]" , 1 , null ) ,
213+ Diff ( "Properties[y]" , 2 , null )
214+ } ) ;
215+ }
216+
217+ [ Fact ]
218+ public void Dictionary_MultipleChanges_ReportsAll ( )
219+ {
220+ var a = new Sample { Properties = new Dictionary < string , int > { [ "x" ] = 1 , [ "y" ] = 2 } } ;
221+ var b = new Sample { Properties = new Dictionary < string , int > { [ "x" ] = 99 , [ "z" ] = 3 } } ;
222+
223+ var diffs = Sample . EqualityComparer . Default . Diff ( a , b ) . ToList ( ) ;
224+
225+ diffs . Should ( ) . BeEquivalentTo ( new [ ]
226+ {
227+ Diff ( "Properties[x]" , 1 , 99 ) ,
228+ Diff ( "Properties[y]" , 2 , null ) ,
229+ Diff ( "Properties[z]" , null , 3 )
230+ } ) ;
215231 }
216232
217233 #endregion
0 commit comments