immutablediff
Version:
Create RFC 6902 style patches between Immutable.JS data structures
243 lines (197 loc) • 6.8 kB
JavaScript
;
var diff = require('../src/diff');
var Immutable = require('immutable');
var JSC = require('jscheck');
var assert = require('assert');
describe('Sequence diff', function() {
var failure = null;
before(function () {
JSC.on_report(function (report) {
console.log(report);
});
JSC.on_fail(function (jsc_failure) {
failure = jsc_failure;
});
});
afterEach(function () {
if(failure){
console.error(failure);
throw failure;
}
});
it('check properties', function () {
JSC.test(
'returns [] when equal',
function(veredict, array){
var list1 = Immutable.fromJS(array);
var list2 = Immutable.fromJS(array);
var result = diff(list1, list2);
return veredict(result.count() === 0);
},
[
JSC.array(5, JSC.integer())
]
);
});
it('returns add operation', function () {
var list1 = Immutable.fromJS([1,2,3,4]);
var list2 = Immutable.fromJS([1,2,3,4,5]);
var result = diff(list1, list2);
var expected = Immutable.fromJS([{op: 'add', path: '/4', value: 5}]);
assert.ok(Immutable.is(result, expected));
});
it('returns remove operation', function () {
var list1 = Immutable.fromJS([1,2,3,4]);
var list2 = Immutable.fromJS([1,2,4]);
var result = diff(list1, list2);
var expected = Immutable.fromJS([{op: 'remove', path: '/2'}]);
assert.ok(Immutable.is(result, expected));
});
it('returns add/remove operations', function () {
var list1 = Immutable.fromJS([1,2,3,4]);
var list2 = Immutable.fromJS([1,2,4,5]);
var result = diff(list1, list2);
var expected = Immutable.fromJS([
{op: 'replace', path: '/2', value: 4},
{op: 'replace', path: '/3', value: 5}
]);
assert.ok(Immutable.is(result, expected));
});
it('returns correct diff when removing sequenced items in large list', function(){
var list1 = Immutable.Range(1, 1000);
var list2 = Immutable.Range(1, 900);
var expected = Immutable.Repeat(Immutable.Map({ op: 'remove', path: '/899' }), 100);
var result = diff(list1, list2);
assert.ok(Immutable.is(result, expected));
});
it('returns correct diff when removing multiple sequenced items in large list', function(){
var list1 = Immutable.Range(1, 1000);
var list2 = Immutable.Range(1, 900).concat(Immutable.Range(950, 955));
var expected = Immutable.List([
Immutable.Map({ op: "replace", path: "/899", value: 950 }),
Immutable.Map({ op: "replace", path: "/900", value: 951 }),
Immutable.Map({ op: "replace", path: "/901", value: 952 }),
Immutable.Map({ op: "replace", path: "/902", value: 953 }),
Immutable.Map({ op: "replace", path: "/903", value: 954 })
]).concat(Immutable.Repeat(Immutable.Map({ op: 'remove', path: '/904' }), 95));
console.log(result);
var result = diff(list1, list2);
assert.ok(Immutable.is(result, expected));
});
it('JSCheck', function () {
JSC.test(
'returns add when value is inserted in the middle of sequence',
function(veredict, array, addIdx, newValue){
var list1 = Immutable.fromJS(array);
var list2 = Immutable.fromJS(array);
var modifiedList = list2.splice(addIdx, 0, newValue);
var result = diff(list1, modifiedList);
var expected = Immutable.fromJS([
{op: 'add', path: '/'+addIdx, value: newValue}
]);
return veredict(Immutable.is(result, expected));
},
[
JSC.array(10, JSC.integer()),
JSC.integer(0, 9),
JSC.integer()
]
);
JSC.test(
'returns remove',
function(veredict, array, removeIdx){
var list1 = Immutable.fromJS(array);
var list2 = Immutable.fromJS(array);
var modifiedList = list2.splice(removeIdx, 1);
var result = diff(list1, modifiedList);
var expected = Immutable.fromJS([
{op: 'remove', path: '/'+removeIdx}
]);
return veredict(Immutable.is(result, expected));
},
[
JSC.array(10, JSC.integer()),
JSC.integer(0, 9)
]
);
JSC.test(
'returns sequential removes',
function(veredict, array, nRemoves){
var list1 = Immutable.fromJS(array);
var list2 = Immutable.fromJS(array);
var modifiedList = list2.skip(nRemoves);
var result = diff(list1, modifiedList);
var expected = Immutable.Repeat(Immutable.Map({op: 'remove', path: '/0'}), nRemoves);
return veredict(Immutable.is(result, expected));
},
[
JSC.array(10, JSC.integer()),
JSC.integer(1, 5)
]
);
JSC.test(
'returns replace operations',
function(veredict, array, replaceIdx, newValue){
var list1 = Immutable.fromJS(array);
var list2 = Immutable.fromJS(array);
var modifiedList = list2.set(replaceIdx, newValue);
var result = diff(list1, modifiedList);
var expected = Immutable.fromJS([
{op: 'replace', path: '/'+replaceIdx, value: newValue}
]);
return veredict(Immutable.is(result, expected));
},
[
JSC.array(10, JSC.integer()),
JSC.integer(0, 9),
JSC.integer()
]
);
});
it('large sequence diff', function() {
JSC.test(
'returns add',
function(veredict, array, newValue){
var list1 = Immutable.fromJS(array);
var list2 = Immutable.fromJS(array);
var modifiedList = list2.push(newValue);
var result = diff(list1, modifiedList);
var expected = Immutable.fromJS([
{op: 'add', path: '/'+array.length, value: newValue}
]);
return veredict(Immutable.is(result, expected));
},
[
JSC.array(150, JSC.integer()),
JSC.integer()
]
);
JSC.test(
'returns replace',
function(veredict, array, newValue){
var list1 = Immutable.fromJS(array);
var list2 = Immutable.fromJS(array);
var idx = 100;
var modifiedList = list2.set(idx, newValue);
var result = diff(list1, modifiedList);
var expected = Immutable.fromJS([
{op: 'replace', path: '/'+idx, value: newValue}
]);
return veredict(Immutable.is(result, expected));
},
[
JSC.array(150, JSC.integer()),
JSC.integer()
]
);
});
it('Seq test', function(){
var setDiff = diff(Immutable.Set(['1']), Immutable.Set(['1']));
assert.equal(setDiff.size, 0);
setDiff = diff(Immutable.Set([1]), Immutable.Set([1,2,3]));
var expected = Immutable.fromJS([
{op: 'replace', path: '/', value: Immutable.Set([1,2,3])}
]);
assert.ok(Immutable.is(setDiff, expected));
});
});