|
var json_diff = require('./json-diff.js');
|
|
|
|
var failures = 0;
|
|
|
|
function expect(a, b, c) {
|
|
var d = json_diff.diff(a, b);
|
|
var ok = JSON.stringify(c) === JSON.stringify(d);
|
|
console.log(JSON.stringify(a) + ' ' + JSON.stringify(b) + ': ' +
|
|
(ok ? 'ok' : 'FAILURE: ') );
|
|
if (!ok) {
|
|
console.log('Expected: ' + JSON.stringify(c));
|
|
console.log('Got: ' + JSON.stringify(d));
|
|
failures++;
|
|
}
|
|
}
|
|
|
|
expect({}, {}, [])
|
|
expect([], [], [])
|
|
expect([1], [1], [])
|
|
expect(['a'], ['a'], [])
|
|
expect([null], [null], [])
|
|
expect([true], [true], [])
|
|
expect([false], [false], [])
|
|
expect({a: 'a', b: 'b'}, {b: 'b', a: 'a'}, [])
|
|
expect([1, 2, 3], [1, 2, 3], [])
|
|
|
|
expect({}, {'//~~': ''}, [{op: 'add', path: '/~1~1~0~0', value: ''}])
|
|
|
|
expect(null, 1, [{op: 'replace', path: '/', value: 1}])
|
|
expect(1, null, [{op: 'replace', path: '/', value: null}])
|
|
|
|
expect([1], 1, [{op: 'replace', path: '/', value: 1}])
|
|
expect(1, [1], [{op: 'replace', path: '/', value: [1]}])
|
|
|
|
expect({a: 1}, 1, [{op: 'replace', path: '/', value: 1}])
|
|
expect(1, {a: 1}, [{op: 'replace', path: '/', value: {a: 1}}])
|
|
|
|
expect({a: 'a'}, {},
|
|
[{op: 'remove', path: '/a'}])
|
|
expect({}, {a: 'a'},
|
|
[{op: 'add', path: '/a', value: 'a'}])
|
|
|
|
expect([[1]], [],
|
|
[{op: 'remove', path: '/0'}])
|
|
expect([], [1],
|
|
[{op: 'add', path: '/0', value: 1}])
|
|
|
|
expect([], [[1]],
|
|
[{op: 'add', path: '/0', value: [1]}])
|
|
expect([[]], [[1]],
|
|
[{op: 'add', path: '/0/0', value: 1}])
|
|
expect({}, [],
|
|
[{op: 'replace', path: '/', value: []}])
|
|
|
|
expect([2, 3], [1, 2, 3], [{op: 'add', path: '/0', value: 1}])
|
|
expect([1, 3], [1, 2, 3], [{op: 'add', path: '/1', value: 2}])
|
|
expect([1, 2], [1, 2, 3], [{op: 'add', path: '/2', value: 3}])
|
|
expect([1, 2, 3], [1, 4, 3], [{op: 'replace', path: '/1', value: 4}])
|
|
|
|
expect({a: [9, 8, 7], b: 2, c: 3}, {a: [9, 7], b: 2, c: 4, d: 5},
|
|
[{op: 'remove', path: '/a/1'}, {op: 'replace', path: '/c', value: 4}, {op: 'add', path: '/d', value: 5}])
|
|
|
|
expect([1, 0, 0], [1, 1, 0], [{op: 'replace', path: '/1', value: 1}]);
|
|
expect([1, 1, 0], [1, 0, 0], [{op: 'replace', path: '/1', value: 0}]);
|
|
|
|
// Reverse examples from RFC 6902, as far as applicable:
|
|
expect({foo: 'bar'}, {baz: 'qux', foo: 'bar'}, [{op: 'add', path: '/baz', value: 'qux'}])
|
|
expect({foo: ['bar', 'baz']}, {foo: ['bar', 'qux', 'baz']}, [{op: 'add', path: '/foo/1', value: 'qux'}])
|
|
expect({baz: 'qux', foo: 'bar'}, {foo: 'bar'}, [{op: 'remove', path: '/baz'}])
|
|
expect({foo: ['bar', 'qux', 'baz']}, {foo: ['bar', 'baz']}, [{op: 'remove', path: '/foo/1'}])
|
|
expect({baz: 'qux', foo: 'bar'}, {baz: 'boo', foo: 'bar'}, [{op: 'replace', path: '/baz', value: 'boo'}])
|
|
expect({foo: 'bar'}, {foo: 'bar', child: {grandchild: {}}}, [{op: 'add', path: '/child', value: {'grandchild': {}}}])
|
|
expect({foo: ['bar']}, {foo: ['bar', ['abc', 'def']]}, [{op: 'add', path: '/foo/1', value: ['abc', 'def']}])
|
|
|
|
// In this case, it would be better to replace the entire array:
|
|
expect([0, 0], [1, 1],
|
|
[{op: 'replace', path: '/0', value: 1}, {op: 'replace', path: '/1', value: 1}]);
|
|
// [{op: 'replace', path: '/', value: [1, 1]}]
|
|
|
|
// In this example, the array element at index 0 is actually undefined, but
|
|
// JSON.stringify({op:"add",path:"/0",value:undefined}) would result in
|
|
// '{"op":"add","path":"/0"}' which is invalid, so we must cast such undefined
|
|
// values to null.
|
|
expect([], [,1], [{"op":"add","path":"/0","value":null},{"op":"add","path":"/1","value":1}]);
|
|
|
|
if (failures) {
|
|
console.log(failures + ' FAILURE(S)');
|
|
process.exit(1);
|
|
}
|