public void DataMatchTest() { var shreds = Helpers.InitializeShreds(); var a = shreds[0]; var b = shreds[1]; var c = shreds[2]; var d = shreds[3]; var e = shreds[4]; // Merge A-B var abData = MatchData.CompareShred(a, b, Direction.FromRight, Orientation.Regular, Direction.FromLeft, Orientation.Regular); var cluster1 = MatchData.ClusterNodes(abData); Assert.IsNotNull(cluster1); Assert.IsTrue(cluster1.Right() == b); Assert.IsTrue(cluster1.Left() == a); Assert.IsTrue(a.Orientation == Orientation.Regular); Assert.IsTrue(b.Orientation == Orientation.Regular); Helpers.PrintFlatTree(cluster1); // Merge D'-C' should flip to a C-D merge var cdData = MatchData.CompareShred(c, d, Direction.FromLeft, Orientation.Reversed, Direction.FromRight, Orientation.Reversed); var cluster2 = MatchData.ClusterNodes(cdData); Assert.IsNotNull(cluster2); Assert.IsTrue(cluster2.Right() == d); Assert.IsTrue(cluster2.Left() == c); Assert.IsTrue(c.Orientation == Orientation.Regular); Assert.IsTrue(d.Orientation == Orientation.Regular); Helpers.PrintFlatTree(cluster2); // Merge with (A-B)-E by NonInverted var beData = MatchData.CompareShred(b, e, Direction.FromLeft, Orientation.Reversed, Direction.FromRight, Orientation.Reversed); var cluster3 = MatchData.ClusterNodes(beData); Assert.IsNotNull(cluster3); Assert.IsTrue(cluster3.Right() == e); Assert.IsTrue(cluster3.Left() == cluster1); Assert.IsTrue(a.Orientation == Orientation.Regular); Assert.IsTrue(b.Orientation == Orientation.Regular); Assert.IsTrue(e.Orientation == Orientation.Regular); Helpers.PrintFlatTree(cluster3); // (C-D)->(D'-C') and merge C and A essentially (D'-C')-((A-B)-E) var caData = MatchData.CompareShred(c, a, Direction.FromRight, Orientation.Reversed, Direction.FromLeft, Orientation.Regular); var cluster4 = MatchData.ClusterNodes(caData); Assert.IsNotNull(cluster4); Assert.IsTrue(cluster4.Size() == 5); Assert.IsTrue(cluster4.Right() == cluster3); Assert.IsTrue(cluster4.Left() == cluster2); Assert.IsTrue(c.Orientation == Orientation.Reversed); Assert.IsTrue(d.Orientation == Orientation.Reversed); Assert.IsTrue(a.Orientation == Orientation.Regular); Assert.IsTrue(b.Orientation == Orientation.Regular); Assert.IsTrue(e.Orientation == Orientation.Regular); Helpers.PrintFlatTree(cluster4); // Ensure it Flattens correctly; var actual = new List <Shred>(cluster4.Size()); cluster4.Flatten(actual); var expected = new List <Shred>(5); expected.Add(d); expected.Add(c); expected.Add(a); expected.Add(b); expected.Add(e); Assert.IsTrue(actual.Zip(expected, (aa, ee) => aa.Id == ee.Id).All(item => item)); }