@@ -193,6 +193,49 @@ public void Diff_EfficientArrayDiffDifferentHeadAdded_ValidDiff()
193
193
Assert . IsNotNull ( diff [ "0" ] ) ;
194
194
}
195
195
196
+ [ Test ]
197
+ public void Diff_EfficientArrayDiffTailMovedToHead_IgnoreMove_NoChange ( )
198
+ {
199
+ var jdp = new JsonDiffPatch ( new Options { ArrayDiff = ArrayDiffMode . Efficient , DiffArrayOptions = new ArrayOptions { DetectMove = true , IncludeValueOnMove = false } } ) ;
200
+ var left = JToken . Parse ( @"[1,2,3,4,5,6,7,8,9,10]" ) ;
201
+ var right = JToken . Parse ( @"[4,1,2,3,7,5,6,8,10,9]" ) ;
202
+
203
+ var diff = jdp . Diff ( left , right ) ;
204
+
205
+ Assert . IsNull ( diff ) ;
206
+ }
207
+
208
+ [ Test ]
209
+ public void Diff_EfficientArrayDiffTailHeadMovedToTail_IncludeMove_ValidDiff ( )
210
+ {
211
+ var jdp = new JsonDiffPatch ( new Options { ArrayDiff = ArrayDiffMode . Efficient , DiffArrayOptions = new ArrayOptions { DetectMove = true , IncludeValueOnMove = true } } ) ;
212
+ var left = JToken . Parse ( @"[1,2,3,4]" ) ;
213
+ var right = JToken . Parse ( @"[2,3,4,1]" ) ;
214
+
215
+ JObject diff = jdp . Diff ( left , right ) as JObject ;
216
+
217
+ Assert . IsNotNull ( diff ) ;
218
+ Assert . AreEqual ( 2 , diff . Properties ( ) . Count ( ) ) ;
219
+ Assert . AreEqual ( diff [ "_0" ] , JToken . Parse ( "['', 3, 3]" ) ) ;
220
+ }
221
+
222
+ [ Test ]
223
+ public void Diff_EfficientArrayDiffWithComplexObjects_IncludeMove_ValidDiff ( )
224
+ {
225
+ var jdp = new JsonDiffPatch ( new Options { ArrayDiff = ArrayDiffMode . Efficient , ObjectHash = ( jObj ) => jObj [ "Id" ] . Value < string > ( ) , DiffArrayOptions = new ArrayOptions { DetectMove = true , IncludeValueOnMove = true } } ) ;
226
+ //var jdp = new JsonDiffPatch(new Options { ArrayDiff = ArrayDiffMode.Efficient });
227
+ var left = JToken . Parse ( @"[{""Id"" : ""F12B21EF-F57D-4958-ADDC-A3F52EC25EC8"", ""p"":false}, {""Id"" : ""F12B21EF-F57D-4958-ADDC-A3F52EC25EC9"", ""p"":true}, {""Id"" : ""F12B21EF-F57D-4958-ADDC-A3F52EC25EC10"", ""p"":true}]" ) ;
228
+ var right = JToken . Parse ( @"[{""Id"" : ""F12B21EF-F57D-4958-ADDC-A3F52EC25EC10"", ""p"":false}, {""Id"" : ""F12B21EF-F57D-4958-ADDC-A3F52EC25EC8"", ""p"":true}, {""Id"" : ""F12B21EF-F57D-4958-ADDC-A3F52EC25EC9"", ""p"":true}]" ) ;
229
+
230
+ JObject diff = jdp . Diff ( left , right ) as JObject ;
231
+
232
+ Assert . IsNotNull ( diff ) ;
233
+ Assert . AreEqual ( 4 , diff . Properties ( ) . Count ( ) ) ;
234
+ Assert . AreEqual ( diff [ "_2" ] , JToken . Parse ( "['', 0, 3]" ) ) ;
235
+ Assert . AreEqual ( diff [ "0" ] [ "p" ] , JToken . Parse ( "[true, false]" ) ) ;
236
+ Assert . AreEqual ( diff [ "1" ] [ "p" ] , JToken . Parse ( "[false, true]" ) ) ;
237
+ }
238
+
196
239
[ Test ]
197
240
public void Diff_EfficientArrayDiffDifferentTailAdded_ValidDiff ( )
198
241
{
@@ -250,22 +293,6 @@ public void Diff_EfficientArrayDiffWithComplexObject_ValidDiff()
250
293
Assert . AreEqual ( 4 , diff . Properties ( ) . Count ( ) ) ;
251
294
}
252
295
253
- [ Test ]
254
- public void Diff_EfficientArrayDiffWithComplexObjectHash_ValidDiff ( )
255
- {
256
- var jdp = new JsonDiffPatch ( new Options { ArrayDiff = ArrayDiffMode . Efficient , ObjectHash = ( jObj ) => jObj [ "Id" ] . Value < string > ( ) } ) ;
257
- var left = JToken . Parse ( @"[{""Id"": ""22ff56c7-2307-414b-8a3a-9bf1cdba2095"",""city"":""São Paulo""},{""Id"":""3fca9cdb-dd9b-4b7c-afc1-587751e25bd6"",""city"":""abc""},{""Id"":""1fe6a0f9-3974-427f-81cb-6004748cb179"",""city"":""xyz""}]" ) ;
258
- var right = JToken . Parse ( @"[{""Id"":""3fca9cdb-dd9b-4b7c-afc1-587751e25bd6"",""city"":""abc""},{""Id"":""1fe6a0f9-3974-427f-81cb-6004748cb179"",""city"":""xyz""}, {""Id"":""3fca9cdb-dd9b-4b7c-afc1-587751e25b44"",""city"":""new""}]" ) ;
259
-
260
- JObject diff = jdp . Diff ( left , right ) as JObject ;
261
-
262
- Assert . IsNotNull ( diff ) ;
263
- Assert . AreEqual ( 3 , diff . Properties ( ) . Count ( ) ) ;
264
- Assert . IsNotNull ( diff [ "_0" ] ) ;
265
- Assert . IsNotNull ( diff [ "2" ] ) ;
266
- Assert . AreEqual ( ( ( JArray ) diff [ "2" ] ) [ 0 ] . Value < string > ( "city" ) , "new" ) ;
267
- }
268
-
269
296
[ Test ]
270
297
public void Diff_EfficientArrayDiffSameWithObject_NoDiff ( )
271
298
{
@@ -313,6 +340,50 @@ public void Diff_EfficientArrayDiffHugeArrays_NoStackOverflow()
313
340
Assert . That ( JToken . DeepEquals ( restored , right ) ) ;
314
341
}
315
342
343
+ [ Test ]
344
+ public void Diff_EfficientArrayDiffHugeArrays_OnlyIgnoredMoves_NoStackOverflow ( )
345
+ {
346
+ const int arraySize = 1000 ;
347
+
348
+ Func < JToken > shuffledArrayFunc = ( ) =>
349
+ {
350
+ Random rng = new Random ( ) ;
351
+ var builder = new StringBuilder ( "[" ) ;
352
+
353
+ var randomList = new List < int > ( ) ;
354
+ for ( int i = 0 ; i < arraySize ; i ++ )
355
+ {
356
+ randomList . Add ( i ) ;
357
+ }
358
+
359
+ // Shuffle array
360
+ int n = arraySize - 1 ;
361
+ while ( n > 1 )
362
+ {
363
+ n -- ;
364
+ int k = rng . Next ( n + 1 ) ;
365
+ int val = randomList [ k ] ;
366
+ randomList [ k ] = randomList [ n ] ;
367
+ randomList [ n ] = val ;
368
+ }
369
+
370
+ foreach ( var i in randomList )
371
+ {
372
+ builder . Append ( $ "{ i } ,") ;
373
+ }
374
+ builder . Append ( "]" ) ;
375
+
376
+ return JToken . Parse ( builder . ToString ( ) ) ;
377
+ } ;
378
+
379
+ var jdp = new JsonDiffPatch ( new Options { ArrayDiff = ArrayDiffMode . Efficient , DiffArrayOptions = new ArrayOptions { DetectMove = true , IncludeValueOnMove = false } } ) ;
380
+ var left = shuffledArrayFunc ( ) ;
381
+ var right = shuffledArrayFunc ( ) ;
382
+
383
+ JToken diff = jdp . Diff ( left , right ) ;
384
+ Assert . IsNull ( diff ) ;
385
+ }
386
+
316
387
[ Test ]
317
388
public void Diff_IntStringDiff_ValidPatch ( )
318
389
{
0 commit comments