function testPatchMake() { const text1 = 'The quick brown fox jumps over the lazy dog.'; const text2 = 'That quick brown fox jumped over a lazy dog.'; let expectedPatch = '@@ -1,8 +1,7 @@\n Th\n-at\n+e\n qui\n@@ -21,17 +21,18 @@\n jump\n-ed\n+s\n over \n-a\n+the\n laz\n'; let patches = dmp.patch_make(text2, text1); assertEquals(expectedPatch, dmp.patch_toText(patches)); // Method 1 expectedPatch = '@@ -1,11 +1,12 @@\n Th\n-e\n+at\n quick b\n@@ -22,18 +22,17 @@\n jump\n-s\n+ed\n over \n-the\n+a\n laz\n'; patches = dmp.patch_make(text1, text2); assertEquals(expectedPatch, dmp.patch_toText(patches)); // Method 2 const diffs = dmp.diff_main(text1, text2, false); patches = dmp.patch_make(diffs); assertEquals(expectedPatch, dmp.patch_toText(patches)); // Method 3 patches = dmp.patch_make(text1, diffs); assertEquals(expectedPatch, dmp.patch_toText(patches)); // Method 4 patches = dmp.patch_make(text1, text2, diffs); assertEquals(expectedPatch, dmp.patch_toText(patches)); }
function testDiffMain() { assertEquivalent([], dmp.diff_main('', '', false)); dmp.Diff_Timeout = 0; // Simple cases. assertEquivalent([[DIFF_DELETE, 'a'], [DIFF_INSERT, 'b']], dmp.diff_main('a', 'b', false)); }
function testDiffMainEach() { const oldValue = "hello world, how are you?"; const newValue = "hello again world. how have you been?"; const diffEngine = new DiffMatchPatch.diff_match_patch(); const diffs = diffEngine.diff_main(oldValue, newValue); diffEngine.diff_cleanupSemantic(diffs); let changes = ""; let pattern = ""; diffs.forEach((diff) => { const operation = diff[0]; // Operation (insert, delete, equal) const text = diff[1]; // Text of change switch (operation) { case DiffMatchPatch.DIFF_INSERT: pattern += "I"; break; case DiffMatchPatch.DIFF_DELETE: pattern += "D"; break; case DiffMatchPatch.DIFF_EQUAL: pattern += "E"; break; } changes += text; }); }
function testPatchApply() { dmp.Match_Distance = 1000; dmp.Match_Threshold = 0.5; dmp.Patch_DeleteThreshold = 0.5; const patches = dmp.patch_make('The quick brown fox jumps over the lazy dog.', 'That quick brown fox jumped over a lazy dog.'); const results = dmp.patch_apply(patches, 'The quick brown fox jumps over the lazy dog.'); assertEquivalent(['That quick brown fox jumped over a lazy dog.', [true, true]], results); }
function testDiffHalfMatch() { dmp.Diff_Timeout = 1; assertEquals(null, dmp.diff_halfMatch_('1234567890', 'abcdef')); assertEquivalent(['12', '90', 'a', 'z', '345678'], dmp.diff_halfMatch_('1234567890', 'a345678z')); assertEquivalent(['12123', '123121', 'a', 'z', '1234123451234'], dmp.diff_halfMatch_('121231234123451234123121', 'a1234123451234z')); }
function testDiffDelta() { const diffs: DiffMatchPatch.Diff[] = [[DIFF_EQUAL, 'jump'], [DIFF_DELETE, 's'], [DIFF_INSERT, 'ed'], [DIFF_EQUAL, ' over '], [DIFF_DELETE, 'the'], [DIFF_INSERT, 'a'], [DIFF_EQUAL, ' lazy'], [DIFF_INSERT, 'old dog']]; const text1 = dmp.diff_text1(diffs); assertEquals('jumps over the lazy', text1); const delta = dmp.diff_toDelta(diffs); assertEquals('=4\t-1\t+ed\t=6\t-3\t+a\t=5\t+old dog', delta); assertEquivalent(diffs, dmp.diff_fromDelta(text1, delta)); }
function testPatchSplitMax() { const patches = dmp.patch_make('abcdefghijklmnopqrstuvwxyz01234567890', 'XabXcdXefXghXijXklXmnXopXqrXstXuvXwxXyzX01X23X45X67X89X0'); dmp.patch_splitMax(patches); assertEquals( [ '@@ -1,32 +1,46 @@\n', '+X\n ab\n+X\n cd\n+X\n ef\n+X\n gh\n+X\n ij\n+X\n kl\n+X\n mn\n+X\n op\n+X\n qr\n+X\n st\n+X\nuv\n+X\n wx\n+X\n yz\n+X\n 012345\n', '@@ -25,13 +39,18 @@', '\n zX01\n+X\n 23\n+X\n 45\n+X\n 67\n+X\n 89\n+X\n 0\n' ].join(''), dmp.patch_toText(patches)); }
function testMatchAlphabet() { const expected: {[char: string]: number} = {}; expected['a'] = 4; expected['b'] = 2; expected['c'] = 1; assertEquivalent(expected, dmp.match_alphabet_('abc')); }
function testDiffCleanupEfficiency() { dmp.Diff_EditCost = 4; const diffs: DiffMatchPatch.Diff[] = [[DIFF_DELETE, 'ab'], [DIFF_INSERT, '12'], [DIFF_EQUAL, 'wxyz'], [DIFF_DELETE, 'cd'], [DIFF_INSERT, '34']]; dmp.diff_cleanupEfficiency(diffs); assertEquivalent([[DIFF_DELETE, 'ab'], [DIFF_INSERT, '12'], [DIFF_EQUAL, 'wxyz'], [DIFF_DELETE, 'cd'], [DIFF_INSERT, '34']], diffs); }
protected processResults(output: string): TextEdit[] { const diffs: Diff[] = this.differ.diff_main(this.originalText, output); const edits: TextEdit[] = []; // VSCode wants TextEdits on the original document // this means position only gets moved for DIFF_EQUAL and DIFF_DELETE // as insert is new and doesn't have a position in the original let position = 0; for (let diff of diffs) { const [num, str] = diff; const startPos = this.document.positionAt(position); switch (num) { case DIFF_DELETE: edits.push({ range: { start: startPos, end: this.document.positionAt(position + str.length), }, newText: '', }); position += str.length; break; case DIFF_INSERT: edits.push({ range: { start: startPos, end: startPos }, newText: str, }); break; case DIFF_EQUAL: position += str.length; break; } // If we have a range we are doing a selection format. Thus, // only apply patches that start within the selected range if (this.range && num !== DIFF_EQUAL && !this.checkPositionInRange(startPos)) { edits.pop(); } } return edits; }