Skip to content

Instantly share code, notes, and snippets.

@aslakhellesoy
Created December 3, 2014 12:59
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aslakhellesoy/5236fd92080e386df9e7 to your computer and use it in GitHub Desktop.
Save aslakhellesoy/5236fd92080e386df9e7 to your computer and use it in GitHub Desktop.
// Translates a Google diff-match-patch diff to an array of ottypes textv1 ops
// Pretty straight-forward!
module.exports = function (diff) {
var ops = [];
for(var i = 0; i < diff.length; i++) {
var diffComp = diff[i];
switch(diffComp[0]) {
case -1: // DELETION
ops.push({d:diffComp[1].length});
break;
case 0: // EQUALITY
if (i != diff.length -1) { // ottypes doesn't like a skip op at the end
ops.push(diffComp[1].length);
}
break;
case 1: // INSERTION
ops.push(diffComp[1]);
}
}
return ops;
};
var fmt = require('util').format;
var assert = require('assert');
var livedb = require('livedb');
var diff2textv1 = require('../lib/diff2textv1');
var Dmp = require('diff-match-patch');
var dmp = new Dmp();
function assertTransform(before, after) {
var diff = dmp.diff_main(before, after);
var ops = diff2textv1(diff);
var data = {
type: 'http://sharejs.org/types/textv1',
data: before
};
var err = livedb.ot.apply(data, {op: ops});
if (data.data != after) {
console.error(before);
console.error(after);
console.error(diff);
console.error(ops);
if (err) throw new Error(err);
assert.equal(data.data, after);
}
}
function randomInt(range) {
return Math.floor(Math.random() * range);
}
function randomText(length) {
var text = "";
var possible = "ABCDEFGH";
for( var i=0; i < length; i++ ) {
text += possible.charAt(randomInt(possible.length));
}
return text;
}
describe('diff2textv1', function () {
it('handles insertion at end', function () {
var before = 'Hello\n';
var after = 'Hello\nWorld\n';
assertTransform(before, after);
});
it('handles deletion at end', function () {
var before = 'Hello\nWorld\n';
var after = 'Hello\n';
assertTransform(before, after);
});
it('handles deletion at beginning', function () {
var before = 'Hello\nWorld\n';
var after = 'World\n';
assertTransform(before, after);
});
it('handles complicated stuff', function () {
var before = 'mouse';
var after = 'sofas';
assertTransform(before, after);
});
// fuzzing
for(var i = 0; i < 20; i++) {
var before = randomText(randomInt(10));
var after = randomText(randomInt(10));
it(fmt("handles '%s' => '%s'", before, after), function () {
assertTransform(before, after);
});
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment