@Test
 public void testOneCrossingSolved() throws Exception {
   ISimpleNode leaf1 = NodeFactory.createChildlessNode(2, "leaf1");
   ISimpleNode root1 = NodeFactory.createSingleChildNode(1, leaf1, "root1");
   ISimpleNode leaf2 = NodeFactory.createChildlessNode(2, "leaf2");
   ISimpleNode root2 = NodeFactory.createSingleChildNode(1, leaf2, "root2");
   ISimpleNode[] simpleNodes = new ISimpleNode[] {root2, root1, leaf1, leaf2};
   IProperHierarchicalGraph graph = new ProperHierarchicalGraph(simpleNodes, 2);
   orderGraph(graph);
   assertTrue(Arrays.equals(new ISimpleNode[] {root2, root1}, graph.getNodesByLayer(1)));
   assertTrue(Arrays.equals(new ISimpleNode[] {leaf2, leaf1}, graph.getNodesByLayer(2)));
 }
 /** An example taken from the Solar Craft cascade */
 @Test
 public void testPartialCraft() throws Exception {
   ISimpleNode G = NodeFactory.createChildlessNode(3, "G");
   ISimpleNode D = NodeFactory.createChildlessNode(2, "D");
   ISimpleNode C = NodeFactory.createChildlessNode(1, "C");
   ISimpleNode F = NodeFactory.createSingleChildNode(2, G, "F");
   ISimpleNode E = NodeFactory.createSingleChildNode(2, G, "E");
   ISimpleNode B = NodeFactory.createMultiChildNode(1, new ISimpleNode[] {D, E, F}, "B");
   ISimpleNode A = NodeFactory.createMultiChildNode(1, new ISimpleNode[] {E}, "A");
   ISimpleNode[] simpleNodes = new ISimpleNode[] {A, B, C, D, E, F, G};
   IProperHierarchicalGraph graph = new ProperHierarchicalGraph(simpleNodes, 3);
   orderGraph(graph);
   assertEquals(0, graph.calculateNumberOfCrossings(1));
   assertEquals(0, graph.calculateNumberOfCrossings(2));
 }
 /** Setup and solution from Sugiyama, page 74 */
 @Test
 public void testSugiyamaFourLayerExample() throws Exception {
   ISimpleNode j = NodeFactory.createChildlessNode(4, "j");
   ISimpleNode k = NodeFactory.createChildlessNode(4, "k");
   ISimpleNode l = NodeFactory.createChildlessNode(4, "l");
   ISimpleNode g = NodeFactory.createSingleChildNode(3, l, "g");
   ISimpleNode h = NodeFactory.createMultiChildNode(3, new ISimpleNode[] {j, k}, "h");
   ISimpleNode i = NodeFactory.createChildlessNode(3, "i");
   ISimpleNode d = NodeFactory.createSingleChildNode(2, g, "d");
   ISimpleNode e = NodeFactory.createMultiChildNode(2, new ISimpleNode[] {g, h, i}, "e");
   ISimpleNode f = NodeFactory.createSingleChildNode(2, h, "f");
   ISimpleNode a = NodeFactory.createSingleChildNode(1, e, "a");
   ISimpleNode b = NodeFactory.createSingleChildNode(1, d, "b");
   ISimpleNode c = NodeFactory.createSingleChildNode(1, d, "c");
   ISimpleNode[] simpleNodes = new ISimpleNode[] {a, b, c, d, e, f, g, h, i, j, k, l};
   IProperHierarchicalGraph graph = new ProperHierarchicalGraph(simpleNodes, 4);
   orderGraph(graph);
   assertTrue(Arrays.equals(new ISimpleNode[] {b, c, a}, graph.getNodesByLayer(1)));
   assertTrue(Arrays.equals(new ISimpleNode[] {d, e, f}, graph.getNodesByLayer(2)));
   assertTrue(Arrays.equals(new ISimpleNode[] {g, i, h}, graph.getNodesByLayer(3)));
   assertTrue(Arrays.equals(new ISimpleNode[] {l, k, j}, graph.getNodesByLayer(4)));
 }
 /** A vision for Solar Ride */
 @Test
 public void testSolarRide() throws Exception {
   ISimpleNode bridge = NodeFactory.createChildlessNode(4, "Bridge/Clouds");
   ISimpleNode windRace = NodeFactory.createChildlessNode(4, "Wind/Infusion");
   ISimpleNode flashing = NodeFactory.createChildlessNode(4, "Flashing Steed");
   ISimpleNode healing = NodeFactory.createChildlessNode(4, "Horse Healing");
   ISimpleNode spirit = NodeFactory.createChildlessNode(3, "Spirit Steed");
   ISimpleNode phantom = NodeFactory.createChildlessNode(3, "Phantom Steed");
   ISimpleNode partnership =
       NodeFactory.createSingleChildNode(3, windRace, "Flawless Partnership");
   ISimpleNode feathery = NodeFactory.createSingleChildNode(3, bridge, "Feathery Gallop");
   ISimpleNode sustaining =
       NodeFactory.createMultiChildNode(
           3, new ISimpleNode[] {windRace, flashing, healing}, "Sustaining Method");
   ISimpleNode steadying =
       NodeFactory.createMultiChildNode(
           2, new ISimpleNode[] {partnership, feathery, sustaining}, "Sustaining Method");
   ISimpleNode whistle =
       NodeFactory.createMultiChildNode(2, new ISimpleNode[] {spirit, phantom}, "Horse Whistle");
   ISimpleNode master =
       NodeFactory.createMultiChildNode(
           1, new ISimpleNode[] {steadying, whistle}, "Master Horseman");
   ISimpleNode[] simpleNodes =
       new ISimpleNode[] {
         phantom,
         spirit,
         healing,
         flashing,
         windRace,
         bridge,
         master,
         whistle,
         steadying,
         sustaining,
         feathery,
         partnership,
       };
   IProperHierarchicalGraph graph = new ProperHierarchicalGraph(simpleNodes, 4);
   orderGraph(graph);
   assertEquals(0, graph.calculateNumberOfCrossings(1));
   assertEquals(0, graph.calculateNumberOfCrossings(2));
   assertEquals(0, graph.calculateNumberOfCrossings(3));
 }