/Tests/YEDNodeTest.j

http://github.com/rheimbuch/YED · Unknown · 164 lines · 142 code · 22 blank · 0 comment · 0 complexity · e647dabc1d03345c9454b573c8384137 MD5 · raw file

  1. @import "../YEDNode.j"
  2. // CPLogRegister(CPLogPrint);
  3. @implementation YEDNodeTest : OJTestCase
  4. - (void)testYEDNodeCanConnectToAnotherYEDNode
  5. {
  6. var node1 = [YEDNode nodeWithName:"node1"];
  7. var node2 = [YEDNode nodeWithName:"node2"];
  8. [self assertTrue:([node1 canConnectTo:node2])
  9. message:"node1 should be able to connect to node2"];
  10. [self assertTrue:([node2 canConnectTo:node2])
  11. message:"node2 should be able to connect to node1"];
  12. }
  13. - (void)testYEDNodeAllDescendents
  14. {
  15. // Create nodes
  16. var n1 = [YEDNode nodeWithName:"n1"],
  17. n2 = [YEDNode nodeWithName:"n2"],
  18. n3 = [YEDNode nodeWithName:"n3"],
  19. n4 = [YEDNode nodeWithName:"n4"],
  20. n5 = [YEDNode nodeWithName:"n5"],
  21. n6 = [YEDNode nodeWithName:"n6"],
  22. n7 = [YEDNode nodeWithName:"n7"];
  23. //Construct Graph (See ./YEDNodeTestGraph.dot)
  24. // digraph YEDNodeTest
  25. // {
  26. [n1 directedEdgeTo:n2]; // n1 -> n2
  27. [n1 directedEdgeTo:n3]; // n1 -> n3
  28. [n2 directedEdgeTo:n3]; // n2 -> n3
  29. [n2 directedEdgeTo:n4]; // n2 -> n4
  30. [n3 directedEdgeTo:n5]; // n3 -> n5
  31. [n5 directedEdgeTo:n6]; // n5 -> n6
  32. [n5 directedEdgeTo:n7]; // n5 -> n7
  33. [n4 directedEdgeTo:n7]; // n4 -> n7
  34. // }
  35. // Setup what the descendents should be
  36. var n1Descendents = [CPSet setWithArray:[n2,n3,n4,n5,n6,n7]],
  37. n2Descendents = [CPSet setWithArray:[n3,n4,n5,n6,n7]],
  38. n3Descendents = [CPSet setWithArray:[n5,n6,n7]],
  39. n4Descendents = [CPSet setWithArray:[n7]],
  40. n5Descendents = [CPSet setWithArray:[n6,n7]],
  41. n6Descendents = [CPSet set],
  42. n7Descendents = [CPSet set];
  43. [self assertTrue:([[n1 allDescendents] isEqualToSet:n1Descendents])
  44. message:"n1 should have all other nodes as it's descendents"];
  45. [self assertTrue:([[n2 allDescendents] isEqualToSet:n2Descendents])
  46. message:"n2 should have n3-n7 as descendents"];
  47. [self assertTrue:([[n3 allDescendents] isEqualToSet:n3Descendents])
  48. message:"n3 should have n5-n7 as descendents"];
  49. [self assertTrue:([[n4 allDescendents] isEqualToSet:n4Descendents])
  50. message:"n4 should have n7 as its descendent"];
  51. [self assertTrue:([[n5 allDescendents] isEqualToSet:n5Descendents])
  52. message:"n5 should have n6 & n7 as descendents"];
  53. [self assertTrue:([[n6 allDescendents] isEqualToSet:n6Descendents])
  54. message:"n6 should have no nodes as descendents"];
  55. [self assertTrue:([[n7 allDescendents] isEqualToSet:n7Descendents])
  56. message:"n7 should have no nodes as descendents"];
  57. }
  58. - (void)testYEDNodeGraphHasCyclesFunctionDetectsSimpleCycles
  59. {
  60. var n1 = [YEDNode nodeWithName:"n1"],
  61. n2 = [YEDNode nodeWithName:"n2"];
  62. // simplest acyclical graph
  63. [n1 directedEdgeTo:n2];
  64. [self assertFalse:YEDNodeGraphHasCycles(n1)
  65. message:"Starting at n1, cycle between n1, n2 SHOULD NOT be detected"];
  66. [self assertFalse:YEDNodeGraphHasCycles(n2)
  67. message:"Starting at n2, cycle between n1, n2 SHOULD NOT be detected"];
  68. [self assertFalse:YEDNodeGraphHasCycles(n1,YES) //Reverse search for cycles through inEdges
  69. message:"Starting at n1, cycle between n1, n2 SHOULD NOT be detected"];
  70. [self assertFalse:YEDNodeGraphHasCycles(n2,YES) //Reverse search for cycles through inEdges
  71. message:"Starting at n2, cycle between n1, n2 SHOULD NOT be detected"];
  72. // Now create a cycle
  73. [n2 directedEdgeTo:n1];
  74. [self assertTrue:YEDNodeGraphHasCycles(n1)
  75. message:"Starting at n1, cycle between n1, n2 SHOULD be detected"];
  76. [self assertTrue:YEDNodeGraphHasCycles(n2)
  77. message:"Starting at n2, cycle between n1, n2 SHOULD be detected"];
  78. [self assertTrue:YEDNodeGraphHasCycles(n1,YES) //Search for cycles through inEdges
  79. message:"Starting at n1, cycle between n1, n2 SHOULD be detected"];
  80. [self assertTrue:YEDNodeGraphHasCycles(n2,YES) //Search for cycles through inEdges
  81. message:"Starting at n2, cycle between n1, n2 SHOULD be detected"];
  82. }
  83. - (void)testYEDNodeGraphHasCyclesFunctionDetectsComplexCycles
  84. {
  85. // Create nodes
  86. var n1 = [YEDNode nodeWithName:"n1"],
  87. n2 = [YEDNode nodeWithName:"n2"],
  88. n3 = [YEDNode nodeWithName:"n3"],
  89. n4 = [YEDNode nodeWithName:"n4"],
  90. n5 = [YEDNode nodeWithName:"n5"],
  91. n6 = [YEDNode nodeWithName:"n6"],
  92. n7 = [YEDNode nodeWithName:"n7"];
  93. //Construct Graph with cycles
  94. // digraph YEDNodeTestCycles
  95. // {
  96. [n1 directedEdgeTo:n2]; // n1 -> n2
  97. [n1 directedEdgeTo:n3]; // n1 -> n3
  98. [n2 directedEdgeTo:n3]; // n2 -> n3
  99. [n2 directedEdgeTo:n4]; // n2 -> n4
  100. [n3 directedEdgeTo:n5]; // n3 -> n5
  101. [n5 directedEdgeTo:n6]; // n5 -> n6
  102. [n6 directedEdgeTo:n4]; // n6 -> n4
  103. [n5 directedEdgeTo:n7]; // n5 -> n7
  104. [n4 directedEdgeTo:n7]; // n4 -> n7
  105. [n7 directedEdgeTo:n2]; // n7 -> n2
  106. // }
  107. //Starting at n1 we should detect a cycle
  108. [self assertTrue:YEDNodeGraphHasCycles(n1)
  109. message:"Starting at n1, cycle should be detected"];
  110. [self assertTrue:YEDNodeGraphHasCycles(n7)
  111. message:"Starting at n7, cycle should be detected"];
  112. }
  113. - (void)testYEDNodeCyclePrevention
  114. {
  115. var n1 = [YEDNode acyclicNodeWithName:"n1"],
  116. n2 = [YEDNode acyclicNodeWithName:"n2"],
  117. n3 = [YEDNode acyclicNodeWithName:"n3"];
  118. // Setup acyclic graph
  119. [n1 directedEdgeTo:n2];
  120. [n2 directedEdgeTo:n3];
  121. [self assertFalse:[n1 cycleInDescendents]
  122. message:"n1 should not have any cycles in its descendents"];
  123. // Try to introduce a cycle
  124. try
  125. {
  126. CPLog.info("Introducing a cycle: n3 -> n1");
  127. [n3 directedEdgeTo:n1];
  128. }
  129. catch(err)
  130. {
  131. CPLog.info("Caught Error: %s", err);
  132. }
  133. // The edge should not have been introduced
  134. [self assertFalse:([[n3 outEdges] containsObject:n1])
  135. message:"n1 should not be in n3's outgoing edges"];
  136. [self assertFalse:([[n1 inEdges] containsObject:n3])
  137. message:"n3 should not be in n1's incoming edges"];
  138. // Therefore there should not be a cycle
  139. [self assertFalse:[n1 cycleInDescendents]
  140. message:"n1 should not have any cycles in its descendents"];
  141. }
  142. @end