1ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski/* 2ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * Test harness for diff_match_patch.java 3ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * 4ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * Copyright 2006 Google Inc. 5ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * http://code.google.com/p/google-diff-match-patch/ 6ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * 7ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * Licensed under the Apache License, Version 2.0 (the "License"); 8ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * you may not use this file except in compliance with the License. 9ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * You may obtain a copy of the License at 10ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * 11ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * http://www.apache.org/licenses/LICENSE-2.0 12ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * 13ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * Unless required by applicable law or agreed to in writing, software 14ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * distributed under the License is distributed on an "AS IS" BASIS, 15ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * See the License for the specific language governing permissions and 17ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski * limitations under the License. 18ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski */ 19ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 20ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskipackage name.fraser.neil.plaintext; 21ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 22ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiimport junit.framework.TestCase; 23ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 24ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiimport java.util.ArrayList; 25ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiimport java.util.Arrays; 26ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiimport java.util.HashMap; 27ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiimport java.util.HashSet; 28ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiimport java.util.LinkedList; 29ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiimport java.util.List; 30ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiimport java.util.Map; 31ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiimport java.util.Set; 32ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 33ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiimport name.fraser.neil.plaintext.diff_match_patch.Diff; 34ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiimport name.fraser.neil.plaintext.diff_match_patch.LinesToCharsResult; 35ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiimport name.fraser.neil.plaintext.diff_match_patch.Patch; 36ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 37ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskipublic class diff_match_patch_test extends TestCase { 38ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 39ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski private diff_match_patch dmp; 40ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski private diff_match_patch.Operation DELETE = diff_match_patch.Operation.DELETE; 41ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski private diff_match_patch.Operation EQUAL = diff_match_patch.Operation.EQUAL; 42ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski private diff_match_patch.Operation INSERT = diff_match_patch.Operation.INSERT; 43ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 44ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski protected void setUp() { 45ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Create an instance of the diff_match_patch object. 46ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp = new diff_match_patch(); 47ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 48ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 49ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 50ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // DIFF TEST FUNCTIONS 51ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 52ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 53ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffCommonPrefix() { 54ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Detect and remove any common prefix. 55ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_commonPrefix: Null case.", 0, dmp.diff_commonPrefix("abc", "xyz")); 56ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 57ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_commonPrefix: Non-null case.", 4, dmp.diff_commonPrefix("1234abcdef", "1234xyz")); 58ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 59ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_commonPrefix: Whole case.", 4, dmp.diff_commonPrefix("1234", "1234xyz")); 60ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 61ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 62ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffCommonSuffix() { 63ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Detect and remove any common suffix. 64ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_commonSuffix: Null case.", 0, dmp.diff_commonSuffix("abc", "xyz")); 65ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 66ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_commonSuffix: Non-null case.", 4, dmp.diff_commonSuffix("abcdef1234", "xyz1234")); 67ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 68ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_commonSuffix: Whole case.", 4, dmp.diff_commonSuffix("1234", "xyz1234")); 69ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 70ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 71ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffHalfmatch() { 72ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Detect a halfmatch. 73ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertNull("diff_halfMatch: No match.", dmp.diff_halfMatch("1234567890", "abcdef")); 74ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 75ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertArrayEquals("diff_halfMatch: Single Match #1.", new String[]{"12", "90", "a", "z", "345678"}, dmp.diff_halfMatch("1234567890", "a345678z")); 76ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 77ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertArrayEquals("diff_halfMatch: Single Match #2.", new String[]{"a", "z", "12", "90", "345678"}, dmp.diff_halfMatch("a345678z", "1234567890")); 78ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 79ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertArrayEquals("diff_halfMatch: Multiple Matches #1.", new String[]{"12123", "123121", "a", "z", "1234123451234"}, dmp.diff_halfMatch("121231234123451234123121", "a1234123451234z")); 80ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 81ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertArrayEquals("diff_halfMatch: Multiple Matches #2.", new String[]{"", "-=-=-=-=-=", "x", "", "x-=-=-=-=-=-=-="}, dmp.diff_halfMatch("x-=-=-=-=-=-=-=-=-=-=-=-=", "xx-=-=-=-=-=-=-=")); 82ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 83ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertArrayEquals("diff_halfMatch: Multiple Matches #3.", new String[]{"-=-=-=-=-=", "", "", "y", "-=-=-=-=-=-=-=y"}, dmp.diff_halfMatch("-=-=-=-=-=-=-=-=-=-=-=-=y", "-=-=-=-=-=-=-=yy")); 84ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 85ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 86ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffLinesToChars() { 87ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Convert lines down to characters. 88ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski ArrayList<String> tmpVector = new ArrayList<String>(); 89ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add(""); 90ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add("alpha\n"); 91ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add("beta\n"); 92ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertLinesToCharsResultEquals("diff_linesToChars:", new LinesToCharsResult("\u0001\u0002\u0001", "\u0002\u0001\u0002", tmpVector), dmp.diff_linesToChars("alpha\nbeta\nalpha\n", "beta\nalpha\nbeta\n")); 93ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 94ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.clear(); 95ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add(""); 96ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add("alpha\r\n"); 97ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add("beta\r\n"); 98ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add("\r\n"); 99ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertLinesToCharsResultEquals("diff_linesToChars:", new LinesToCharsResult("", "\u0001\u0002\u0003\u0003", tmpVector), dmp.diff_linesToChars("", "alpha\r\nbeta\r\n\r\n\r\n")); 100ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 101ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.clear(); 102ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add(""); 103ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add("a"); 104ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add("b"); 105ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertLinesToCharsResultEquals("diff_linesToChars:", new LinesToCharsResult("\u0001", "\u0002", tmpVector), dmp.diff_linesToChars("a", "b")); 106ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 107ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // More than 256 to reveal any 8-bit limitations. 108ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski int n = 300; 109ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.clear(); 110ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski StringBuilder lineList = new StringBuilder(); 111ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski StringBuilder charList = new StringBuilder(); 112ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski for (int x = 1; x < n + 1; x++) { 113ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add(x + "\n"); 114ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski lineList.append(x + "\n"); 115ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski charList.append(String.valueOf((char) x)); 116ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 117ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals(n, tmpVector.size()); 118ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String lines = lineList.toString(); 119ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String chars = charList.toString(); 120ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals(n, chars.length()); 121ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add(0, ""); 122ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertLinesToCharsResultEquals("diff_linesToChars: More than 256.", new LinesToCharsResult(chars, "", tmpVector), dmp.diff_linesToChars(lines, "")); 123ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 124ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 125ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffCharsToLines() { 126ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // First check that Diff equality works. 127ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertTrue("diff_charsToLines:", new Diff(EQUAL, "a").equals(new Diff(EQUAL, "a"))); 128ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 129ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_charsToLines:", new Diff(EQUAL, "a"), new Diff(EQUAL, "a")); 130ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 131ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Convert chars up to lines 132ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = diffList(new Diff(EQUAL, "\u0001\u0002\u0001"), new Diff(INSERT, "\u0002\u0001\u0002")); 133ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski ArrayList<String> tmpVector = new ArrayList<String>(); 134ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add(""); 135ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add("alpha\n"); 136ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add("beta\n"); 137ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_charsToLines(diffs, tmpVector); 138ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_charsToLines:", diffList(new Diff(EQUAL, "alpha\nbeta\nalpha\n"), new Diff(INSERT, "beta\nalpha\nbeta\n")), diffs); 139ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 140ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // More than 256 to reveal any 8-bit limitations. 141ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski int n = 300; 142ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.clear(); 143ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski StringBuilder lineList = new StringBuilder(); 144ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski StringBuilder charList = new StringBuilder(); 145ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski for (int x = 1; x < n + 1; x++) { 146ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add(x + "\n"); 147ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski lineList.append(x + "\n"); 148ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski charList.append(String.valueOf((char) x)); 149ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 150ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals(n, tmpVector.size()); 151ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String lines = lineList.toString(); 152ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String chars = charList.toString(); 153ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals(n, chars.length()); 154ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski tmpVector.add(0, ""); 155ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, chars)); 156ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_charsToLines(diffs, tmpVector); 157ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_charsToLines: More than 256.", diffList(new Diff(DELETE, lines)), diffs); 158ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 159ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 160ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffCleanupMerge() { 161ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Cleanup a messy diff. 162ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = diffList(); 163ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupMerge(diffs); 164ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupMerge: Null case.", diffList(), diffs); 165ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 166ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "a"), new Diff(DELETE, "b"), new Diff(INSERT, "c")); 167ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupMerge(diffs); 168ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupMerge: No change case.", diffList(new Diff(EQUAL, "a"), new Diff(DELETE, "b"), new Diff(INSERT, "c")), diffs); 169ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 170ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "a"), new Diff(EQUAL, "b"), new Diff(EQUAL, "c")); 171ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupMerge(diffs); 172ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupMerge: Merge equalities.", diffList(new Diff(EQUAL, "abc")), diffs); 173ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 174ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "a"), new Diff(DELETE, "b"), new Diff(DELETE, "c")); 175ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupMerge(diffs); 176ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupMerge: Merge deletions.", diffList(new Diff(DELETE, "abc")), diffs); 177ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 178ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(INSERT, "a"), new Diff(INSERT, "b"), new Diff(INSERT, "c")); 179ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupMerge(diffs); 180ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupMerge: Merge insertions.", diffList(new Diff(INSERT, "abc")), diffs); 181ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 182ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "a"), new Diff(INSERT, "b"), new Diff(DELETE, "c"), new Diff(INSERT, "d"), new Diff(EQUAL, "e"), new Diff(EQUAL, "f")); 183ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupMerge(diffs); 184ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupMerge: Merge interweave.", diffList(new Diff(DELETE, "ac"), new Diff(INSERT, "bd"), new Diff(EQUAL, "ef")), diffs); 185ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 186ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "a"), new Diff(INSERT, "abc"), new Diff(DELETE, "dc")); 187ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupMerge(diffs); 188ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupMerge: Prefix and suffix detection.", diffList(new Diff(EQUAL, "a"), new Diff(DELETE, "d"), new Diff(INSERT, "b"), new Diff(EQUAL, "c")), diffs); 189ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 190ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "a"), new Diff(INSERT, "ba"), new Diff(EQUAL, "c")); 191ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupMerge(diffs); 192ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupMerge: Slide edit left.", diffList(new Diff(INSERT, "ab"), new Diff(EQUAL, "ac")), diffs); 193ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 194ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "c"), new Diff(INSERT, "ab"), new Diff(EQUAL, "a")); 195ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupMerge(diffs); 196ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupMerge: Slide edit right.", diffList(new Diff(EQUAL, "ca"), new Diff(INSERT, "ba")), diffs); 197ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 198ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "a"), new Diff(DELETE, "b"), new Diff(EQUAL, "c"), new Diff(DELETE, "ac"), new Diff(EQUAL, "x")); 199ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupMerge(diffs); 200ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupMerge: Slide edit left recursive.", diffList(new Diff(DELETE, "abc"), new Diff(EQUAL, "acx")), diffs); 201ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 202ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "x"), new Diff(DELETE, "ca"), new Diff(EQUAL, "c"), new Diff(DELETE, "b"), new Diff(EQUAL, "a")); 203ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupMerge(diffs); 204ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupMerge: Slide edit right recursive.", diffList(new Diff(EQUAL, "xca"), new Diff(DELETE, "cba")), diffs); 205ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 206ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 207ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffCleanupSemanticLossless() { 208ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Slide diffs to match logical boundaries. 209ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = diffList(); 210ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemanticLossless(diffs); 211ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemanticLossless: Null case.", diffList(), diffs); 212ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 213ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "AAA\r\n\r\nBBB"), new Diff(INSERT, "\r\nDDD\r\n\r\nBBB"), new Diff(EQUAL, "\r\nEEE")); 214ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemanticLossless(diffs); 215ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemanticLossless: Blank lines.", diffList(new Diff(EQUAL, "AAA\r\n\r\n"), new Diff(INSERT, "BBB\r\nDDD\r\n\r\n"), new Diff(EQUAL, "BBB\r\nEEE")), diffs); 216ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 217ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "AAA\r\nBBB"), new Diff(INSERT, " DDD\r\nBBB"), new Diff(EQUAL, " EEE")); 218ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemanticLossless(diffs); 219ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemanticLossless: Line boundaries.", diffList(new Diff(EQUAL, "AAA\r\n"), new Diff(INSERT, "BBB DDD\r\n"), new Diff(EQUAL, "BBB EEE")), diffs); 220ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 221ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "The c"), new Diff(INSERT, "ow and the c"), new Diff(EQUAL, "at.")); 222ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemanticLossless(diffs); 223ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemanticLossless: Word boundaries.", diffList(new Diff(EQUAL, "The "), new Diff(INSERT, "cow and the "), new Diff(EQUAL, "cat.")), diffs); 224ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 225ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "The-c"), new Diff(INSERT, "ow-and-the-c"), new Diff(EQUAL, "at.")); 226ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemanticLossless(diffs); 227ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemanticLossless: Alphanumeric boundaries.", diffList(new Diff(EQUAL, "The-"), new Diff(INSERT, "cow-and-the-"), new Diff(EQUAL, "cat.")), diffs); 228ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 229ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "a"), new Diff(DELETE, "a"), new Diff(EQUAL, "ax")); 230ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemanticLossless(diffs); 231ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemanticLossless: Hitting the start.", diffList(new Diff(DELETE, "a"), new Diff(EQUAL, "aax")), diffs); 232ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 233ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "xa"), new Diff(DELETE, "a"), new Diff(EQUAL, "a")); 234ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemanticLossless(diffs); 235ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemanticLossless: Hitting the end.", diffList(new Diff(EQUAL, "xaa"), new Diff(DELETE, "a")), diffs); 236ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 237ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 238ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffCleanupSemantic() { 239ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Cleanup semantically trivial equalities. 240ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = diffList(); 241ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemantic(diffs); 242ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemantic: Null case.", diffList(), diffs); 243ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 244ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "a"), new Diff(INSERT, "b"), new Diff(EQUAL, "cd"), new Diff(DELETE, "e")); 245ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemantic(diffs); 246ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemantic: No elimination.", diffList(new Diff(DELETE, "a"), new Diff(INSERT, "b"), new Diff(EQUAL, "cd"), new Diff(DELETE, "e")), diffs); 247ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 248ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "a"), new Diff(EQUAL, "b"), new Diff(DELETE, "c")); 249ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemantic(diffs); 250ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemantic: Simple elimination.", diffList(new Diff(DELETE, "abc"), new Diff(INSERT, "b")), diffs); 251ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 252ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "ab"), new Diff(EQUAL, "cd"), new Diff(DELETE, "e"), new Diff(EQUAL, "f"), new Diff(INSERT, "g")); 253ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemantic(diffs); 254ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemantic: Backpass elimination.", diffList(new Diff(DELETE, "abcdef"), new Diff(INSERT, "cdfg")), diffs); 255ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 256ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(INSERT, "1"), new Diff(EQUAL, "A"), new Diff(DELETE, "B"), new Diff(INSERT, "2"), new Diff(EQUAL, "_"), new Diff(INSERT, "1"), new Diff(EQUAL, "A"), new Diff(DELETE, "B"), new Diff(INSERT, "2")); 257ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemantic(diffs); 258ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemantic: Multiple elimination.", diffList(new Diff(DELETE, "AB_AB"), new Diff(INSERT, "1A2_1A2")), diffs); 259ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 260ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "The c"), new Diff(DELETE, "ow and the c"), new Diff(EQUAL, "at.")); 261ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupSemantic(diffs); 262ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupSemantic: Word boundaries.", diffList(new Diff(EQUAL, "The "), new Diff(DELETE, "cow and the "), new Diff(EQUAL, "cat.")), diffs); 263ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 264ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 265ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffCleanupEfficiency() { 266ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Cleanup operationally trivial equalities. 267ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Diff_EditCost = 4; 268ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = diffList(); 269ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupEfficiency(diffs); 270ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupEfficiency: Null case.", diffList(), diffs); 271ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 272ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "ab"), new Diff(INSERT, "12"), new Diff(EQUAL, "wxyz"), new Diff(DELETE, "cd"), new Diff(INSERT, "34")); 273ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupEfficiency(diffs); 274ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupEfficiency: No elimination.", diffList(new Diff(DELETE, "ab"), new Diff(INSERT, "12"), new Diff(EQUAL, "wxyz"), new Diff(DELETE, "cd"), new Diff(INSERT, "34")), diffs); 275ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 276ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "ab"), new Diff(INSERT, "12"), new Diff(EQUAL, "xyz"), new Diff(DELETE, "cd"), new Diff(INSERT, "34")); 277ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupEfficiency(diffs); 278ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupEfficiency: Four-edit elimination.", diffList(new Diff(DELETE, "abxyzcd"), new Diff(INSERT, "12xyz34")), diffs); 279ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 280ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(INSERT, "12"), new Diff(EQUAL, "x"), new Diff(DELETE, "cd"), new Diff(INSERT, "34")); 281ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupEfficiency(diffs); 282ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupEfficiency: Three-edit elimination.", diffList(new Diff(DELETE, "xcd"), new Diff(INSERT, "12x34")), diffs); 283ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 284ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "ab"), new Diff(INSERT, "12"), new Diff(EQUAL, "xy"), new Diff(INSERT, "34"), new Diff(EQUAL, "z"), new Diff(DELETE, "cd"), new Diff(INSERT, "56")); 285ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupEfficiency(diffs); 286ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupEfficiency: Backpass elimination.", diffList(new Diff(DELETE, "abxyzcd"), new Diff(INSERT, "12xy34z56")), diffs); 287ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 288ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Diff_EditCost = 5; 289ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "ab"), new Diff(INSERT, "12"), new Diff(EQUAL, "wxyz"), new Diff(DELETE, "cd"), new Diff(INSERT, "34")); 290ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_cleanupEfficiency(diffs); 291ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_cleanupEfficiency: High cost elimination.", diffList(new Diff(DELETE, "abwxyzcd"), new Diff(INSERT, "12wxyz34")), diffs); 292ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Diff_EditCost = 4; 293ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 294ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 295ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffPrettyHtml() { 296ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Pretty print. 297ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = diffList(new Diff(EQUAL, "a\n"), new Diff(DELETE, "<B>b</B>"), new Diff(INSERT, "c&d")); 298ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_prettyHtml:", "<SPAN TITLE=\"i=0\">a¶<BR></SPAN><DEL STYLE=\"background:#FFE6E6;\" TITLE=\"i=2\"><B>b</B></DEL><INS STYLE=\"background:#E6FFE6;\" TITLE=\"i=2\">c&d</INS>", dmp.diff_prettyHtml(diffs)); 299ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 300ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 301ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffText() { 302ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Compute the source and destination texts. 303ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = diffList(new Diff(EQUAL, "jump"), new Diff(DELETE, "s"), new Diff(INSERT, "ed"), new Diff(EQUAL, " over "), new Diff(DELETE, "the"), new Diff(INSERT, "a"), new Diff(EQUAL, " lazy")); 304ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_text1:", "jumps over the lazy", dmp.diff_text1(diffs)); 305ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_text2:", "jumped over a lazy", dmp.diff_text2(diffs)); 306ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 307ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 308ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffDelta() { 309ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Convert a diff into delta string. 310ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = diffList(new Diff(EQUAL, "jump"), new Diff(DELETE, "s"), new Diff(INSERT, "ed"), new Diff(EQUAL, " over "), new Diff(DELETE, "the"), new Diff(INSERT, "a"), new Diff(EQUAL, " lazy"), new Diff(INSERT, "old dog")); 311ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String text1 = dmp.diff_text1(diffs); 312ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_text1: Base text.", "jumps over the lazy", text1); 313ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 314ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String delta = dmp.diff_toDelta(diffs); 315ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_toDelta:", "=4\t-1\t+ed\t=6\t-3\t+a\t=5\t+old dog", delta); 316ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 317ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Convert delta string into a diff. 318ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_fromDelta: Normal.", diffs, dmp.diff_fromDelta(text1, delta)); 319ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 320ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Generates error (19 < 20). 321ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski try { 322ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_fromDelta(text1 + "x", delta); 323ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski fail("diff_fromDelta: Too long."); 324ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } catch (IllegalArgumentException ex) { 325ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Exception expected. 326ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 327ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 328ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Generates error (19 > 18). 329ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski try { 330ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_fromDelta(text1.substring(1), delta); 331ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski fail("diff_fromDelta: Too short."); 332ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } catch (IllegalArgumentException ex) { 333ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Exception expected. 334ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 335ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 336ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Generates error (%c3%xy invalid Unicode). 337ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski try { 338ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_fromDelta("", "+%c3%xy"); 339ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski fail("diff_fromDelta: Invalid character."); 340ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } catch (IllegalArgumentException ex) { 341ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Exception expected. 342ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 343ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 344ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Test deltas with special characters. 345ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "\u0680 \000 \t %"), new Diff(DELETE, "\u0681 \001 \n ^"), new Diff(INSERT, "\u0682 \002 \\ |")); 346ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski text1 = dmp.diff_text1(diffs); 347ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_text1: Unicode text.", "\u0680 \000 \t %\u0681 \001 \n ^", text1); 348ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 349ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski delta = dmp.diff_toDelta(diffs); 350ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_toDelta: Unicode.", "=7\t-7\t+%DA%82 %02 %5C %7C", delta); 351ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 352ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_fromDelta: Unicode.", diffs, dmp.diff_fromDelta(text1, delta)); 353ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 354ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Verify pool of unchanged characters. 355ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(INSERT, "A-Z a-z 0-9 - _ . ! ~ * ' ( ) ; / ? : @ & = + $ , # ")); 356ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String text2 = dmp.diff_text2(diffs); 357ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_text2: Unchanged characters.", "A-Z a-z 0-9 - _ . ! ~ * \' ( ) ; / ? : @ & = + $ , # ", text2); 358ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 359ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski delta = dmp.diff_toDelta(diffs); 360ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_toDelta: Unchanged characters.", "+A-Z a-z 0-9 - _ . ! ~ * \' ( ) ; / ? : @ & = + $ , # ", delta); 361ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 362ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Convert delta string into a diff. 363ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_fromDelta: Unchanged characters.", diffs, dmp.diff_fromDelta("", delta)); 364ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 365ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 366ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffXIndex() { 367ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Translate a location in text1 to text2. 368ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = diffList(new Diff(DELETE, "a"), new Diff(INSERT, "1234"), new Diff(EQUAL, "xyz")); 369ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_xIndex: Translation on equality.", 5, dmp.diff_xIndex(diffs, 2)); 370ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 371ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "a"), new Diff(DELETE, "1234"), new Diff(EQUAL, "xyz")); 372ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_xIndex: Translation on deletion.", 1, dmp.diff_xIndex(diffs, 3)); 373ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 374ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 375ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffLevenshtein() { 376ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = diffList(new Diff(DELETE, "abc"), new Diff(INSERT, "1234"), new Diff(EQUAL, "xyz")); 377ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("Levenshtein with trailing equality.", 4, dmp.diff_levenshtein(diffs)); 378ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 379ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "xyz"), new Diff(DELETE, "abc"), new Diff(INSERT, "1234")); 380ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("Levenshtein with leading equality.", 4, dmp.diff_levenshtein(diffs)); 381ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 382ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "abc"), new Diff(EQUAL, "xyz"), new Diff(INSERT, "1234")); 383ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("Levenshtein with middle equality.", 7, dmp.diff_levenshtein(diffs)); 384ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 385ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 386ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffPath() { 387ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // First, check footprints are different. 388ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertTrue("diff_footprint:", dmp.diff_footprint(1, 10) != dmp.diff_footprint(10, 1)); 389ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 390ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Single letters. 391ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Trace a path from back to front. 392ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski List<Set<Long>> v_map; 393ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski Set<Long> row_set; 394ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map = new ArrayList<Set<Long>>(); 395ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski { 396ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 397ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 0)); 398ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 399ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 400ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 1)); 401ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(1, 0)); 402ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 403ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 404ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 2)); 405ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 0)); 406ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 2)); 407ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 408ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 409ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 3)); 410ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 3)); 411ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(3, 0)); 412ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(4, 3)); 413ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 414ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 415ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 4)); 416ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 4)); 417ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(4, 0)); 418ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(4, 4)); 419ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(5, 3)); 420ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 421ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 422ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 5)); 423ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 5)); 424ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(4, 5)); 425ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(5, 0)); 426ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(6, 3)); 427ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(6, 5)); 428ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 429ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 430ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 6)); 431ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 6)); 432ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(4, 6)); 433ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(6, 6)); 434ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(7, 5)); 435ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 436ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 437ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = diffList(new Diff(INSERT, "W"), new Diff(DELETE, "A"), new Diff(EQUAL, "1"), new Diff(DELETE, "B"), new Diff(EQUAL, "2"), new Diff(INSERT, "X"), new Diff(DELETE, "C"), new Diff(EQUAL, "3"), new Diff(DELETE, "D")); 438ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_path1: Single letters.", diffs, dmp.diff_path1(v_map, "A1B2C3D", "W12X3")); 439ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 440ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Trace a path from front to back. 441ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.remove(v_map.size() - 1); 442ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "4"), new Diff(DELETE, "E"), new Diff(INSERT, "Y"), new Diff(EQUAL, "5"), new Diff(DELETE, "F"), new Diff(EQUAL, "6"), new Diff(DELETE, "G"), new Diff(INSERT, "Z")); 443ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_path2: Single letters.", diffs, dmp.diff_path2(v_map, "4E5F6G", "4Y56Z")); 444ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 445ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Double letters. 446ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Trace a path from back to front. 447ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map = new ArrayList<Set<Long>>(); 448ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski { 449ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 450ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 0)); 451ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 452ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 453ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 1)); 454ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(1, 0)); 455ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 456ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 457ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 2)); 458ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(1, 1)); 459ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 0)); 460ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 461ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 462ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 3)); 463ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(1, 2)); 464ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 1)); 465ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(3, 0)); 466ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 467ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 468ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 4)); 469ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(1, 3)); 470ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(3, 1)); 471ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(4, 0)); 472ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(4, 4)); 473ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 474ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 475ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(INSERT, "WX"), new Diff(DELETE, "AB"), new Diff(EQUAL, "12")); 476ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_path1: Double letters.", diffs, dmp.diff_path1(v_map, "AB12", "WX12")); 477ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 478ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Trace a path from front to back. 479ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map = new ArrayList<Set<Long>>(); 480ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski { 481ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 482ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 0)); 483ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 484ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 485ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(0, 1)); 486ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(1, 0)); 487ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 488ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 489ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(1, 1)); 490ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 0)); 491ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 4)); 492ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 493ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 494ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 1)); 495ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 5)); 496ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(3, 0)); 497ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(3, 4)); 498ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 499ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set = new HashSet<Long>(); 500ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(2, 6)); 501ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(3, 5)); 502ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski row_set.add(dmp.diff_footprint(4, 4)); 503ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski v_map.add(row_set); 504ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 505ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "CD"), new Diff(EQUAL, "34"), new Diff(INSERT, "YZ")); 506ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_path2: Double letters.", diffs, dmp.diff_path2(v_map, "CD34", "34YZ")); 507ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 508ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 509ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testDiffMain() { 510ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Perform a trivial diff. 511ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = diffList(new Diff(EQUAL, "abc")); 512ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_main: Null case.", diffs, dmp.diff_main("abc", "abc", false)); 513ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 514ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "ab"), new Diff(INSERT, "123"), new Diff(EQUAL, "c")); 515ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_main: Simple insertion.", diffs, dmp.diff_main("abc", "ab123c", false)); 516ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 517ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "a"), new Diff(DELETE, "123"), new Diff(EQUAL, "bc")); 518ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_main: Simple deletion.", diffs, dmp.diff_main("a123bc", "abc", false)); 519ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 520ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "a"), new Diff(INSERT, "123"), new Diff(EQUAL, "b"), new Diff(INSERT, "456"), new Diff(EQUAL, "c")); 521ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_main: Two insertions.", diffs, dmp.diff_main("abc", "a123b456c", false)); 522ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 523ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(EQUAL, "a"), new Diff(DELETE, "123"), new Diff(EQUAL, "b"), new Diff(DELETE, "456"), new Diff(EQUAL, "c")); 524ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_main: Two deletions.", diffs, dmp.diff_main("a123b456c", "abc", false)); 525ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 526ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Perform a real diff. 527ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Switch off the timeout. 528ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Diff_Timeout = 0; 529ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Diff_DualThreshold = 32; 530ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "a"), new Diff(INSERT, "b")); 531ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_main: Simple case #1.", diffs, dmp.diff_main("a", "b", false)); 532ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 533ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "Apple"), new Diff(INSERT, "Banana"), new Diff(EQUAL, "s are a"), new Diff(INSERT, "lso"), new Diff(EQUAL, " fruit.")); 534ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_main: Simple case #2.", diffs, dmp.diff_main("Apples are a fruit.", "Bananas are also fruit.", false)); 535ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 536ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "a"), new Diff(INSERT, "\u0680"), new Diff(EQUAL, "x"), new Diff(DELETE, "\t"), new Diff(INSERT, "\000")); 537ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_main: Simple case #3.", diffs, dmp.diff_main("ax\t", "\u0680x\000", false)); 538ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 539ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "1"), new Diff(EQUAL, "a"), new Diff(DELETE, "y"), new Diff(EQUAL, "b"), new Diff(DELETE, "2"), new Diff(INSERT, "xab")); 540ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_main: Overlap #1.", diffs, dmp.diff_main("1ayb2", "abxab", false)); 541ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 542ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(INSERT, "xaxcx"), new Diff(EQUAL, "abc"), new Diff(DELETE, "y")); 543ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_main: Overlap #2.", diffs, dmp.diff_main("abcy", "xaxcxabc", false)); 544ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 545ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Sub-optimal double-ended diff. 546ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Diff_DualThreshold = 2; 547ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(INSERT, "x"), new Diff(EQUAL, "a"), new Diff(DELETE, "b"), new Diff(INSERT, "x"), new Diff(EQUAL, "c"), new Diff(DELETE, "y"), new Diff(INSERT, "xabc")); 548ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_main: Overlap #3.", diffs, dmp.diff_main("abcy", "xaxcxabc", false)); 549ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 550ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Diff_DualThreshold = 32; 551ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Diff_Timeout = 0.001f; // 1ms 552ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String a = "`Twas brillig, and the slithy toves\nDid gyre and gimble in the wabe:\nAll mimsy were the borogoves,\nAnd the mome raths outgrabe.\n"; 553ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String b = "I am the very model of a modern major general,\nI've information vegetable, animal, and mineral,\nI know the kings of England, and I quote the fights historical,\nFrom Marathon to Waterloo, in order categorical.\n"; 554ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Increase the text lengths by 1024 times to ensure a timeout. 555ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski for (int x = 0; x < 10; x++) { 556ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski a = a + a; 557ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski b = b + b; 558ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 559ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertNull("diff_main: Timeout.", dmp.diff_map(a, b)); 560ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Diff_Timeout = 0; 561ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 562ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Test the linemode speedup. 563ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Must be long to pass the 200 char cutoff. 564ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski a = "1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n"; 565ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski b = "abcdefghij\nabcdefghij\nabcdefghij\nabcdefghij\nabcdefghij\nabcdefghij\nabcdefghij\nabcdefghij\nabcdefghij\nabcdefghij\nabcdefghij\nabcdefghij\nabcdefghij\n"; 566ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("diff_main: Simple.", dmp.diff_main(a, b, true), dmp.diff_main(a, b, false)); 567ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 568ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski a = "1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n1234567890\n"; 569ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski b = "abcdefghij\n1234567890\n1234567890\n1234567890\nabcdefghij\n1234567890\n1234567890\n1234567890\nabcdefghij\n1234567890\n1234567890\n1234567890\nabcdefghij\n"; 570ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String[] texts_linemode = diff_rebuildtexts(dmp.diff_main(a, b, true)); 571ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String[] texts_textmode = diff_rebuildtexts(dmp.diff_main(a, b, false)); 572ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertArrayEquals("diff_main: Overlap.", texts_textmode, texts_linemode); 573ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 574ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Test null inputs. 575ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski try { 576ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.diff_main(null, null); 577ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski fail("diff_main: Null inputs."); 578ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } catch (IllegalArgumentException ex) { 579ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Error expected. 580ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 581ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 582ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 583ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 584ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // MATCH TEST FUNCTIONS 585ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 586ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 587ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testMatchAlphabet() { 588ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Initialise the bitmasks for Bitap. 589ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski Map<Character, Integer> bitmask; 590ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski bitmask = new HashMap<Character, Integer>(); 591ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski bitmask.put('a', 4); bitmask.put('b', 2); bitmask.put('c', 1); 592ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_alphabet: Unique.", bitmask, dmp.match_alphabet("abc")); 593ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 594ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski bitmask = new HashMap<Character, Integer>(); 595ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski bitmask.put('a', 37); bitmask.put('b', 18); bitmask.put('c', 8); 596ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_alphabet: Duplicates.", bitmask, dmp.match_alphabet("abcaba")); 597ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 598ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 599ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testMatchBitap() { 600ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Bitap algorithm. 601ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Distance = 100; 602ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Threshold = 0.5f; 603ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Exact match #1.", 5, dmp.match_bitap("abcdefghijk", "fgh", 5)); 604ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 605ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Exact match #2.", 5, dmp.match_bitap("abcdefghijk", "fgh", 0)); 606ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 607ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Fuzzy match #1.", 4, dmp.match_bitap("abcdefghijk", "efxhi", 0)); 608ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 609ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Fuzzy match #2.", 2, dmp.match_bitap("abcdefghijk", "cdefxyhijk", 5)); 610ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 611ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Fuzzy match #3.", -1, dmp.match_bitap("abcdefghijk", "bxy", 1)); 612ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 613ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Overflow.", 2, dmp.match_bitap("123456789xx0", "3456789x0", 2)); 614ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 615ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Before start match.", 0, dmp.match_bitap("abcdef", "xxabc", 4)); 616ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 617ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Beyond end match.", 3, dmp.match_bitap("abcdef", "defyy", 4)); 618ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 619ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Oversized pattern.", 0, dmp.match_bitap("abcdef", "xabcdefy", 0)); 620ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 621ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Threshold = 0.4f; 622ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Threshold #1.", 4, dmp.match_bitap("abcdefghijk", "efxyhi", 1)); 623ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 624ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Threshold = 0.3f; 625ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Threshold #2.", -1, dmp.match_bitap("abcdefghijk", "efxyhi", 1)); 626ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 627ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Threshold = 0.0f; 628ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Threshold #3.", 1, dmp.match_bitap("abcdefghijk", "bcdef", 1)); 629ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 630ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Threshold = 0.5f; 631ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Multiple select #1.", 0, dmp.match_bitap("abcdexyzabcde", "abccde", 3)); 632ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 633ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Multiple select #2.", 8, dmp.match_bitap("abcdexyzabcde", "abccde", 5)); 634ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 635ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Distance = 10; // Strict location. 636ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Distance test #1.", -1, dmp.match_bitap("abcdefghijklmnopqrstuvwxyz", "abcdefg", 24)); 637ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 638ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Distance test #2.", 0, dmp.match_bitap("abcdefghijklmnopqrstuvwxyz", "abcdxxefg", 1)); 639ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 640ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Distance = 1000; // Loose location. 641ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_bitap: Distance test #3.", 0, dmp.match_bitap("abcdefghijklmnopqrstuvwxyz", "abcdefg", 24)); 642ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 643ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 644ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testMatchMain() { 645ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Full match. 646ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_main: Equality.", 0, dmp.match_main("abcdef", "abcdef", 1000)); 647ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 648ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_main: Null text.", -1, dmp.match_main("", "abcdef", 1)); 649ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 650ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_main: Null pattern.", 3, dmp.match_main("abcdef", "", 3)); 651ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 652ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_main: Exact match.", 3, dmp.match_main("abcdef", "de", 3)); 653ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 654ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_main: Beyond end match.", 3, dmp.match_main("abcdef", "defy", 4)); 655ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 656ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_main: Oversized pattern.", 0, dmp.match_main("abcdef", "abcdefy", 0)); 657ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 658ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Threshold = 0.7f; 659ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("match_main: Complex match.", 4, dmp.match_main("I am the very model of a modern major general.", " that berry ", 5)); 660ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Threshold = 0.5f; 661ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 662ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Test null inputs. 663ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski try { 664ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.match_main(null, null, 0); 665ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski fail("match_main: Null inputs."); 666ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } catch (IllegalArgumentException ex) { 667ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Error expected. 668ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 669ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 670ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 671ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 672ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // PATCH TEST FUNCTIONS 673ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 674ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 675ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testPatchObj() { 676ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Patch Object. 677ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski Patch p = new Patch(); 678ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski p.start1 = 20; 679ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski p.start2 = 21; 680ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski p.length1 = 18; 681ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski p.length2 = 17; 682ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski p.diffs = diffList(new Diff(EQUAL, "jump"), new Diff(DELETE, "s"), new Diff(INSERT, "ed"), new Diff(EQUAL, " over "), new Diff(DELETE, "the"), new Diff(INSERT, "a"), new Diff(EQUAL, "\nlaz")); 683ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String strp = "@@ -21,18 +22,17 @@\n jump\n-s\n+ed\n over \n-the\n+a\n %0Alaz\n"; 684ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("Patch: toString.", strp, p.toString()); 685ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 686ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 687ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testPatchFromText() { 688ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertTrue("patch_fromText: #0.", dmp.patch_fromText("").isEmpty()); 689ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 690ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String strp = "@@ -21,18 +22,17 @@\n jump\n-s\n+ed\n over \n-the\n+a\n %0Alaz\n"; 691ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_fromText: #1.", strp, dmp.patch_fromText(strp).get(0).toString()); 692ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 693ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_fromText: #2.", "@@ -1 +1 @@\n-a\n+b\n", dmp.patch_fromText("@@ -1 +1 @@\n-a\n+b\n").get(0).toString()); 694ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 695ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_fromText: #3.", "@@ -1,3 +0,0 @@\n-abc\n", dmp.patch_fromText("@@ -1,3 +0,0 @@\n-abc\n").get(0).toString()); 696ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 697ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_fromText: #4.", "@@ -0,0 +1,3 @@\n+abc\n", dmp.patch_fromText("@@ -0,0 +1,3 @@\n+abc\n").get(0).toString()); 698ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 699ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Generates error. 700ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski try { 701ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_fromText("Bad\nPatch\n"); 702ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski fail("patch_fromText: #5."); 703ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } catch (IllegalArgumentException ex) { 704ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Exception expected. 705ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 706ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 707ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 708ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testPatchToText() { 709ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String strp = "@@ -21,18 +22,17 @@\n jump\n-s\n+ed\n over \n-the\n+a\n laz\n"; 710ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski List<Patch> patches; 711ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_fromText(strp); 712ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_toText: Single", strp, dmp.patch_toText(patches)); 713ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 714ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski strp = "@@ -1,9 +1,9 @@\n-f\n+F\n oo+fooba\n@@ -7,9 +7,9 @@\n obar\n-,\n+.\n tes\n"; 715ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_fromText(strp); 716ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_toText: Dual", strp, dmp.patch_toText(patches)); 717ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 718ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 719ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testPatchAddContext() { 720ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Patch_Margin = 4; 721ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski Patch p; 722ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski p = dmp.patch_fromText("@@ -21,4 +21,10 @@\n-jump\n+somersault\n").get(0); 723ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_addContext(p, "The quick brown fox jumps over the lazy dog."); 724ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_addContext: Simple case.", "@@ -17,12 +17,18 @@\n fox \n-jump\n+somersault\n s ov\n", p.toString()); 725ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 726ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski p = dmp.patch_fromText("@@ -21,4 +21,10 @@\n-jump\n+somersault\n").get(0); 727ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_addContext(p, "The quick brown fox jumps."); 728ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_addContext: Not enough trailing context.", "@@ -17,10 +17,16 @@\n fox \n-jump\n+somersault\n s.\n", p.toString()); 729ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 730ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski p = dmp.patch_fromText("@@ -3 +3,2 @@\n-e\n+at\n").get(0); 731ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_addContext(p, "The quick brown fox jumps."); 732ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_addContext: Not enough leading context.", "@@ -1,7 +1,8 @@\n Th\n-e\n+at\n qui\n", p.toString()); 733ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 734ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski p = dmp.patch_fromText("@@ -3 +3,2 @@\n-e\n+at\n").get(0); 735ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_addContext(p, "The quick brown fox jumps. The quick brown fox crashes."); 736ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_addContext: Ambiguity.", "@@ -1,27 +1,28 @@\n Th\n-e\n+at\n quick brown fox jumps. \n", p.toString()); 737ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 738ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 739ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski @SuppressWarnings("deprecation") 740ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testPatchMake() { 741ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Patch> patches; 742ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String text1 = "The quick brown fox jumps over the lazy dog."; 743ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String text2 = "That quick brown fox jumped over a lazy dog."; 744ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String 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"; 745ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // The second patch must be "-21,17 +21,18", not "-22,17 +21,18" due to rolling context. 746ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make(text2, text1); 747ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_make: Text2+Text1 inputs", expectedPatch, dmp.patch_toText(patches)); 748ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 749ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 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"; 750ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make(text1, text2); 751ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_make: Text1+Text2 inputs", expectedPatch, dmp.patch_toText(patches)); 752ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 753ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> diffs = dmp.diff_main(text1, text2, false); 754ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make(diffs); 755ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_make: Diff input", expectedPatch, dmp.patch_toText(patches)); 756ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 757ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make(text1, diffs); 758ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_make: Text1+Diff inputs", expectedPatch, dmp.patch_toText(patches)); 759ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 760ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make(text1, text2, diffs); 761ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_make: Text1+Text2+Diff inputs (deprecated)", expectedPatch, dmp.patch_toText(patches)); 762ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 763ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("`1234567890-=[]\\;',./", "~!@#$%^&*()_+{}|:\"<>?"); 764ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_toText: Character encoding.", "@@ -1,21 +1,21 @@\n-%601234567890-=%5B%5D%5C;',./\n+~!@#$%25%5E&*()_+%7B%7D%7C:%22%3C%3E?\n", dmp.patch_toText(patches)); 765ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 766ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski diffs = diffList(new Diff(DELETE, "`1234567890-=[]\\;',./"), new Diff(INSERT, "~!@#$%^&*()_+{}|:\"<>?")); 767ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_fromText: Character decoding.", diffs, dmp.patch_fromText("@@ -1,21 +1,21 @@\n-%601234567890-=%5B%5D%5C;',./\n+~!@#$%25%5E&*()_+%7B%7D%7C:%22%3C%3E?\n").get(0).diffs); 768ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 769ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski text1 = ""; 770ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski for (int x = 0; x < 100; x++) { 771ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski text1 += "abcdef"; 772ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 773ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski text2 = text1 + "123"; 774ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski expectedPatch = "@@ -573,28 +573,31 @@\n cdefabcdefabcdefabcdefabcdef\n+123\n"; 775ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make(text1, text2); 776ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_make: Long string with repeats.", expectedPatch, dmp.patch_toText(patches)); 777ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 778ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Test null inputs. 779ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski try { 780ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_make(null); 781ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski fail("patch_make: Null inputs."); 782ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } catch (IllegalArgumentException ex) { 783ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Error expected. 784ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 785ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 786ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 787ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testPatchSplitMax() { 788ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Assumes that Match_MaxBits is 32. 789ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Patch> patches; 790ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("abcdefghijklmnopqrstuvwxyz01234567890", "XabXcdXefXghXijXklXmnXopXqrXstXuvXwxXyzX01X23X45X67X89X0"); 791ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_splitMax(patches); 792ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_splitMax: #1.", "@@ -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\n uv\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", dmp.patch_toText(patches)); 793ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 794ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("abcdef1234567890123456789012345678901234567890123456789012345678901234567890uvwxyz", "abcdefuvwxyz"); 795ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String oldToText = dmp.patch_toText(patches); 796ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_splitMax(patches); 797ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_splitMax: #2.", oldToText, dmp.patch_toText(patches)); 798ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 799ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("1234567890123456789012345678901234567890123456789012345678901234567890", "abc"); 800ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_splitMax(patches); 801ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_splitMax: #3.", "@@ -1,32 +1,4 @@\n-1234567890123456789012345678\n 9012\n@@ -29,32 +1,4 @@\n-9012345678901234567890123456\n 7890\n@@ -57,14 +1,3 @@\n-78901234567890\n+abc\n", dmp.patch_toText(patches)); 802ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 803ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("abcdefghij , h : 0 , t : 1 abcdefghij , h : 0 , t : 1 abcdefghij , h : 0 , t : 1", "abcdefghij , h : 1 , t : 1 abcdefghij , h : 1 , t : 1 abcdefghij , h : 0 , t : 1"); 804ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_splitMax(patches); 805ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_splitMax: #4.", "@@ -2,32 +2,32 @@\n bcdefghij , h : \n-0\n+1\n , t : 1 abcdef\n@@ -29,32 +29,32 @@\n bcdefghij , h : \n-0\n+1\n , t : 1 abcdef\n", dmp.patch_toText(patches)); 806ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 807ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 808ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testPatchAddPadding() { 809ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Patch> patches; 810ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("", "test"); 811ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_addPadding: Both edges full.", "@@ -0,0 +1,4 @@\n+test\n", dmp.patch_toText(patches)); 812ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_addPadding(patches); 813ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_addPadding: Both edges full.", "@@ -1,8 +1,12 @@\n %01%02%03%04\n+test\n %01%02%03%04\n", dmp.patch_toText(patches)); 814ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 815ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("XY", "XtestY"); 816ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_addPadding: Both edges partial.", "@@ -1,2 +1,6 @@\n X\n+test\n Y\n", dmp.patch_toText(patches)); 817ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_addPadding(patches); 818ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_addPadding: Both edges partial.", "@@ -2,8 +2,12 @@\n %02%03%04X\n+test\n Y%01%02%03\n", dmp.patch_toText(patches)); 819ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 820ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("XXXXYYYY", "XXXXtestYYYY"); 821ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_addPadding: Both edges none.", "@@ -1,8 +1,12 @@\n XXXX\n+test\n YYYY\n", dmp.patch_toText(patches)); 822ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_addPadding(patches); 823ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_addPadding: Both edges none.", "@@ -5,8 +5,12 @@\n XXXX\n+test\n YYYY\n", dmp.patch_toText(patches)); 824ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 825ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 826ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski public void testPatchApply() { 827ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Distance = 1000; 828ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Threshold = 0.5f; 829ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Patch_DeleteThreshold = 0.5f; 830ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Patch> patches; 831ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("The quick brown fox jumps over the lazy dog.", "That quick brown fox jumped over a lazy dog."); 832ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski Object[] results = dmp.patch_apply(patches, "The quick brown fox jumps over the lazy dog."); 833ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski boolean[] boolArray = (boolean[]) results[1]; 834ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String resultStr = results[0] + "\t" + boolArray[0] + "\t" + boolArray[1]; 835ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_apply: Exact match.", "That quick brown fox jumped over a lazy dog.\ttrue\ttrue", resultStr); 836ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 837ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski results = dmp.patch_apply(patches, "The quick red rabbit jumps over the tired tiger."); 838ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski boolArray = (boolean[]) results[1]; 839ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski resultStr = results[0] + "\t" + boolArray[0] + "\t" + boolArray[1]; 840ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_apply: Partial match.", "That quick red rabbit jumped over a tired tiger.\ttrue\ttrue", resultStr); 841ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 842ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski results = dmp.patch_apply(patches, "I am the very model of a modern major general."); 843ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski boolArray = (boolean[]) results[1]; 844ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski resultStr = results[0] + "\t" + boolArray[0] + "\t" + boolArray[1]; 845ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_apply: Failed match.", "I am the very model of a modern major general.\tfalse\tfalse", resultStr); 846ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 847ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("x1234567890123456789012345678901234567890123456789012345678901234567890y", "xabcy"); 848ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski results = dmp.patch_apply(patches, "x123456789012345678901234567890-----++++++++++-----123456789012345678901234567890y"); 849ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski boolArray = (boolean[]) results[1]; 850ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski resultStr = results[0] + "\t" + boolArray[0] + "\t" + boolArray[1]; 851ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_apply: Big delete, small change.", "xabcy\ttrue\ttrue", resultStr); 852ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 853ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("x1234567890123456789012345678901234567890123456789012345678901234567890y", "xabcy"); 854ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski results = dmp.patch_apply(patches, "x12345678901234567890---------------++++++++++---------------12345678901234567890y"); 855ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski boolArray = (boolean[]) results[1]; 856ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski resultStr = results[0] + "\t" + boolArray[0] + "\t" + boolArray[1]; 857ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_apply: Big delete, big change 1.", "xabc12345678901234567890---------------++++++++++---------------12345678901234567890y\tfalse\ttrue", resultStr); 858ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 859ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Patch_DeleteThreshold = 0.6f; 860ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("x1234567890123456789012345678901234567890123456789012345678901234567890y", "xabcy"); 861ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski results = dmp.patch_apply(patches, "x12345678901234567890---------------++++++++++---------------12345678901234567890y"); 862ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski boolArray = (boolean[]) results[1]; 863ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski resultStr = results[0] + "\t" + boolArray[0] + "\t" + boolArray[1]; 864ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_apply: Big delete, big change 2.", "xabcy\ttrue\ttrue", resultStr); 865ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Patch_DeleteThreshold = 0.5f; 866ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 867ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Compensate for failed patch. 868ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Threshold = 0.0f; 869ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Distance = 0; 870ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("abcdefghijklmnopqrstuvwxyz--------------------1234567890", "abcXXXXXXXXXXdefghijklmnopqrstuvwxyz--------------------1234567YYYYYYYYYY890"); 871ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski results = dmp.patch_apply(patches, "ABCDEFGHIJKLMNOPQRSTUVWXYZ--------------------1234567890"); 872ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski boolArray = (boolean[]) results[1]; 873ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski resultStr = results[0] + "\t" + boolArray[0] + "\t" + boolArray[1]; 874ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("ABCDEFGHIJKLMNOPQRSTUVWXYZ--------------------1234567YYYYYYYYYY890\tfalse\ttrue", resultStr); 875ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Threshold = 0.5f; 876ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.Match_Distance = 1000; 877ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 878ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("", "test"); 879ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String patchStr = dmp.patch_toText(patches); 880ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_apply(patches, ""); 881ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_apply: No side effects.", patchStr, dmp.patch_toText(patches)); 882ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 883ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("The quick brown fox jumps over the lazy dog.", "Woof"); 884ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patchStr = dmp.patch_toText(patches); 885ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski dmp.patch_apply(patches, "The quick brown fox jumps over the lazy dog."); 886ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_apply: No side effects with major delete.", patchStr, dmp.patch_toText(patches)); 887ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 888ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("", "test"); 889ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski results = dmp.patch_apply(patches, ""); 890ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski boolArray = (boolean[]) results[1]; 891ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski resultStr = results[0] + "\t" + boolArray[0]; 892ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_apply: Edge exact match.", "test\ttrue", resultStr); 893ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 894ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("XY", "XtestY"); 895ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski results = dmp.patch_apply(patches, "XY"); 896ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski boolArray = (boolean[]) results[1]; 897ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski resultStr = results[0] + "\t" + boolArray[0]; 898ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_apply: Near edge exact match.", "XtestY\ttrue", resultStr); 899ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 900ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski patches = dmp.patch_make("y", "y123"); 901ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski results = dmp.patch_apply(patches, "x"); 902ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski boolArray = (boolean[]) results[1]; 903ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski resultStr = results[0] + "\t" + boolArray[0]; 904ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals("patch_apply: Edge partial match.", "x123\ttrue", resultStr); 905ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 906ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 907ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 908ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski private void assertArrayEquals(String error_msg, Object[] a, Object[] b) { 909ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski List<Object> list_a = Arrays.asList(a); 910ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski List<Object> list_b = Arrays.asList(b); 911ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals(error_msg, list_a, list_b); 912ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 913ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 914ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 915ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski private void assertLinesToCharsResultEquals(String error_msg, 916ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinesToCharsResult a, LinesToCharsResult b) { 917ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals(error_msg, a.chars1, b.chars1); 918ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals(error_msg, a.chars2, b.chars2); 919ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski assertEquals(error_msg, a.lineArray, b.lineArray); 920ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 921ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 922ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Construct the two texts which made up the diff originally. 923ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski private static String[] diff_rebuildtexts(LinkedList<Diff> diffs) { 924ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski String[] text = {"", ""}; 925ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski for (Diff myDiff : diffs) { 926ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski if (myDiff.operation != diff_match_patch.Operation.INSERT) { 927ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski text[0] += myDiff.text; 928ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 929ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski if (myDiff.operation != diff_match_patch.Operation.DELETE) { 930ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski text[1] += myDiff.text; 931ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 932ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 933ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski return text; 934ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 935ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 936ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski 937ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski // Private function for quickly building lists of diffs. 938ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski private static LinkedList<Diff> diffList(Diff... diffs) { 939ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski LinkedList<Diff> myDiffList = new LinkedList<Diff>(); 940ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski for (Diff myDiff : diffs) { 941ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski myDiffList.add(myDiff); 942ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 943ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski return myDiffList; 944ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski } 945ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski} 946