-
Notifications
You must be signed in to change notification settings - Fork 5
/
test.js
95 lines (82 loc) · 2.45 KB
/
test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
var expect = require('expect.js');
var arrayDiff = require('./index');
var InsertDiff = arrayDiff.InsertDiff;
var RemoveDiff = arrayDiff.RemoveDiff;
var MoveDiff = arrayDiff.MoveDiff;
function insert(array, index, values) {
array.splice.apply(array, [index, 0].concat(values));
}
function remove(array, index, howMany) {
return array.splice(index, howMany);
}
function move(array, from, to, howMany) {
var values = remove(array, from, howMany);
insert(array, to, values);
}
function applyDiff(before, diff) {
var out = before.slice();
for (var i = 0; i < diff.length; i++) {
var item = diff[i];
// console.log 'applying:', out, item
if (item instanceof InsertDiff) {
insert(out, item.index, item.values);
} else if (item instanceof RemoveDiff) {
remove(out, item.index, item.howMany);
} else if (item instanceof MoveDiff) {
move(out, item.from, item.to, item.howMany);
}
}
return out;
}
function randomWhole(max) {
return Math.floor(Math.random() * (max + 1));
}
function randomArray(maxLength, maxValues) {
if (maxLength == null) maxLength = 20;
if (maxValues == null) maxValues = maxLength;
var results = [];
for (var i = randomWhole(maxLength); i--;) {
results.push(randomWhole(maxValues));
}
return results;
}
function testDiff(before, after, equalFn) {
// console.log()
// console.log 'before =', before
// console.log 'after =', after
var diff = arrayDiff(before, after, equalFn);
var expected = applyDiff(before, diff);
expect(expected).to.eql(after);
}
describe('arrayDiff', function() {
it('diffs empty arrays', function() {
testDiff([], []);
testDiff([], [0, 1, 2]);
testDiff([0, 1, 2], []);
});
it('supports custom equality comparisons', function() {
var before = [{id: 1}, {id: 2}];
var after = [{id: 1}];
testDiff(before, after, function(a, b) {
return a.id === b.id;
});
});
it('diffs randomly rearranged arrays of numbers', function() {
function randomSort() {
return Math.random() - 0.5;
}
for (var i = 1000; i--;) {
// before = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
var before = randomArray(50);
var after = before.slice().sort(randomSort);
testDiff(before, after);
}
});
it('diffs random arrays of numbers', function() {
for (var i = 1000; i--;) {
var before = randomArray(50, 20);
var after = randomArray(50, 20);
testDiff(before, after);
}
});
});