public void diff_pathTest() { diff_match_patchTest dmp = new diff_match_patchTest(); // First, check footprints are different. Assert.IsTrue(dmp.diff_footprint(1, 10) != dmp.diff_footprint(10, 1), "diff_footprint:"); // Single letters. // Trace a path from back to front. List<HashSet<long>> v_map; HashSet<long> row_set; v_map = new List<HashSet<long>>(); { row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 0)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 1)); row_set.Add(dmp.diff_footprint(1, 0)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 2)); row_set.Add(dmp.diff_footprint(2, 0)); row_set.Add(dmp.diff_footprint(2, 2)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 3)); row_set.Add(dmp.diff_footprint(2, 3)); row_set.Add(dmp.diff_footprint(3, 0)); row_set.Add(dmp.diff_footprint(4, 3)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 4)); row_set.Add(dmp.diff_footprint(2, 4)); row_set.Add(dmp.diff_footprint(4, 0)); row_set.Add(dmp.diff_footprint(4, 4)); row_set.Add(dmp.diff_footprint(5, 3)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 5)); row_set.Add(dmp.diff_footprint(2, 5)); row_set.Add(dmp.diff_footprint(4, 5)); row_set.Add(dmp.diff_footprint(5, 0)); row_set.Add(dmp.diff_footprint(6, 3)); row_set.Add(dmp.diff_footprint(6, 5)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 6)); row_set.Add(dmp.diff_footprint(2, 6)); row_set.Add(dmp.diff_footprint(4, 6)); row_set.Add(dmp.diff_footprint(6, 6)); row_set.Add(dmp.diff_footprint(7, 5)); v_map.Add(row_set); } List<Diff> diffs = new List<Diff>{ new Diff(Operation.INSERT, "W"), new Diff(Operation.DELETE, "A"), new Diff(Operation.EQUAL, "1"), new Diff(Operation.DELETE, "B"), new Diff(Operation.EQUAL, "2"), new Diff(Operation.INSERT, "X"), new Diff(Operation.DELETE, "C"), new Diff(Operation.EQUAL, "3"), new Diff(Operation.DELETE, "D")}; CollectionAssert.AreEqual(diffs, dmp.diff_path1(v_map, "A1B2C3D", "W12X3"), "diff_path1: Single letters."); // Trace a path from front to back. v_map.RemoveAt(v_map.Count - 1); diffs = new List<Diff>{ new Diff(Operation.EQUAL, "4"), new Diff(Operation.DELETE, "E"), new Diff(Operation.INSERT, "Y"), new Diff(Operation.EQUAL, "5"), new Diff(Operation.DELETE, "F"), new Diff(Operation.EQUAL, "6"), new Diff(Operation.DELETE, "G"), new Diff(Operation.INSERT, "Z")}; CollectionAssert.AreEqual(diffs, dmp.diff_path2(v_map, "4E5F6G", "4Y56Z"), "diff_path2: Single letters."); // Double letters. // Trace a path from back to front. v_map = new List<HashSet<long>>(); { row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 0)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 1)); row_set.Add(dmp.diff_footprint(1, 0)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 2)); row_set.Add(dmp.diff_footprint(1, 1)); row_set.Add(dmp.diff_footprint(2, 0)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 3)); row_set.Add(dmp.diff_footprint(1, 2)); row_set.Add(dmp.diff_footprint(2, 1)); row_set.Add(dmp.diff_footprint(3, 0)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 4)); row_set.Add(dmp.diff_footprint(1, 3)); row_set.Add(dmp.diff_footprint(3, 1)); row_set.Add(dmp.diff_footprint(4, 0)); row_set.Add(dmp.diff_footprint(4, 4)); v_map.Add(row_set); } diffs = new List<Diff>{ new Diff(Operation.INSERT, "WX"), new Diff(Operation.DELETE, "AB"), new Diff(Operation.EQUAL, "12")}; CollectionAssert.AreEqual(diffs, dmp.diff_path1(v_map, "AB12", "WX12"), "diff_path1: Double letters."); // Trace a path from front to back. v_map = new List<HashSet<long>>(); { row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 0)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(0, 1)); row_set.Add(dmp.diff_footprint(1, 0)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(1, 1)); row_set.Add(dmp.diff_footprint(2, 0)); row_set.Add(dmp.diff_footprint(2, 4)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(2, 1)); row_set.Add(dmp.diff_footprint(2, 5)); row_set.Add(dmp.diff_footprint(3, 0)); row_set.Add(dmp.diff_footprint(3, 4)); v_map.Add(row_set); row_set = new HashSet<long>(); row_set.Add(dmp.diff_footprint(2, 6)); row_set.Add(dmp.diff_footprint(3, 5)); row_set.Add(dmp.diff_footprint(4, 4)); v_map.Add(row_set); } diffs = new List<Diff>{ new Diff(Operation.DELETE, "CD"), new Diff(Operation.EQUAL, "34"), new Diff(Operation.INSERT, "YZ")}; CollectionAssert.AreEqual(diffs, dmp.diff_path2(v_map, "CD34", "34YZ"), "diff_path2: Double letters."); }