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.");
        }