@@ -99,8 +99,18 @@ pub fn match_json(value1: &Value, value2: &Value) -> Mismatch {
99
99
100
100
let mismatch: Vec < _ > = replaced
101
101
. into_iter ( )
102
- . flat_map ( |( o, ol, n, _nl) | {
103
- ( 0 ..ol) . map ( move |i| ( o + i, match_json ( & a[ o + i] , & b[ n + i] ) . keys_in_both ) )
102
+ . flat_map ( |( o, ol, n, nl) | {
103
+ let max_length = ol. max ( nl) ;
104
+ ( 0 ..max_length) . map ( move |i| {
105
+ (
106
+ o + i,
107
+ match_json (
108
+ a. get ( o + i) . unwrap_or ( & Value :: Null ) ,
109
+ b. get ( n + i) . unwrap_or ( & Value :: Null ) ,
110
+ )
111
+ . keys_in_both ,
112
+ )
113
+ } )
104
114
} )
105
115
. collect ( ) ;
106
116
@@ -277,6 +287,22 @@ mod tests {
277
287
assert_eq ! ( diff. left_only_keys, KeyNode :: Nil ) ;
278
288
}
279
289
290
+ #[ test]
291
+ fn long_insertion_modification ( ) {
292
+ let data1 = r#"["a","b","a"]"# ;
293
+ let data2 = r#"["a","c","c","c","a"]"# ;
294
+ let diff = compare_jsons ( data1, data2) . unwrap ( ) ;
295
+ let diffs = diff. keys_in_both . absolute_keys_to_vec ( None ) ;
296
+ // 1. is b!=c, second is a!=c, third is missing in data1 but c in data2
297
+ assert_eq ! ( diffs. len( ) , 3 ) ;
298
+ assert_eq ! (
299
+ diffs. last( ) . unwrap( ) . to_string( ) ,
300
+ r#"[l: 3] -> { null != "c" }"#
301
+ ) ;
302
+ assert_eq ! ( diff. right_only_keys, KeyNode :: Nil ) ;
303
+ assert_eq ! ( diff. left_only_keys, KeyNode :: Nil ) ;
304
+ }
305
+
280
306
#[ test]
281
307
fn test_arrays_object_extra ( ) {
282
308
let data1 = r#"["a","b"]"# ;
0 commit comments