var assert = require('assert') var patchArray = require('./patch-array') var tests = [ { a: ['a', 'b', 'c', 'd', 'e'] , b: ['a', 'e', 'c', 'd', 'b'] , ops: [ ['swap', 4, 1] ] } , { a: ['a', 'b', 'c', 'd', 'e'] , b: ['e', 'd', 'c', 'b', 'a'] , ops: [ ['swap', 4, 0] , ['swap', 3, 1] ] } , { a: ['a', 'b', 'c', 'd', 'e', 'f'] , b: ['f', 'e', 'd', 'c', 'b', 'a'] , ops: [ ['swap', 5, 0] , ['swap', 4, 1] , ['swap', 3, 2] ] } , { a: ['a', 'b', 'c', 'd', 'e', 'f'] , b: ['f', 'e'] , ops: [ ['remove', 0] , ['remove', 0] , ['remove', 0] , ['remove', 0] , ['swap', 1, 0] ] } , { a: ['a', 'b', 'c', 'd', 'e', 'f'] , b: ['f', 'a'] , ops: [ ['remove', 1] , ['remove', 1] , ['remove', 1] , ['remove', 1] , ['swap', 1, 0] ] } , { a: [] , b: ['a', 'b', 'c', 'd', 'e', 'f'] , ops: [ ['insert', 0, 'a'] , ['insert', 1, 'b'] , ['insert', 2, 'c'] , ['insert', 3, 'd'] , ['insert', 4, 'e'] , ['insert', 5, 'f'] ] } , { a: ['a', 'd'] , b: ['a', 'b', 'c', 'd', 'e', 'f'] , ops: [ ['insert', 1, 'b'] , ['insert', 2, 'c'] , ['insert', 4, 'e'] , ['insert', 5, 'f'] ] } , { a: ['b', 'd', 'a'] , b: ['a', 'b', 'c', 'd', 'e', 'f'] , ops: [ ['swap', 2, 0] , ['swap', 2, 1] , ['insert', 2, 'c'] , ['insert', 4, 'e'] , ['insert', 5, 'f'] ] } ] function verify(a, b, ops) { var c = [].concat(a) ops.forEach(function(op) { switch (op[0]) { case 'swap': var temp = c[op[1]] c[op[1]] = c[op[2]] c[op[2]] = temp break case 'move': c.splice(op[2] + 1, 0, c[op[1]]) c.splice(op[1], 1) break case 'insert': c.splice(op[1], 0, op[2]) break case 'remove': c.splice(op[1], 1) break default: throw new Error('Unknown op ' + op[0]) } }) assert.deepEqual(c, b) } tests.forEach(function(test) { console.log('Running test:') console.log(' <- ', test.a) console.log(' -> ', test.b) console.log('Verifying test expectations') verify(test.a, test.b, test.ops) console.log('Verifying patchArray') var patch = patchArray(test.a, test.b) console.log(' patch', patch) verify(test.a, test.b, patch) })