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&para;<BR></SPAN><DEL STYLE=\"background:#FFE6E6;\" TITLE=\"i=2\">&lt;B&gt;b&lt;/B&gt;</DEL><INS STYLE=\"background:#E6FFE6;\" TITLE=\"i=2\">c&amp;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