PathFinderTest.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package info.hkzlab.dupal.analyzer;
  2. import static org.junit.Assert.*;
  3. import org.junit.Test;
  4. import info.hkzlab.dupal.analyzer.exceptions.DuPALAnalyzerException;
  5. import info.hkzlab.dupal.analyzer.palanalisys.graph.*;
  6. public class PathFinderTest {
  7. @Test
  8. public void PathFinderShouldProvideShortestPathToDestination() throws DuPALAnalyzerException {
  9. OutState os_a = new OutState(new OutStatePins(0x00, 0x00), 3);
  10. OutState os_b = new OutState(new OutStatePins(0x01, 0x00), 3);
  11. OutState os_c = new OutState(new OutStatePins(0x02, 0x00), 3);
  12. OutState os_d = new OutState(new OutStatePins(0x03, 0x00), 3);
  13. OutState os_e = new OutState(new OutStatePins(0x04, 0x00), 3);
  14. os_a.addOutLink(new OutLink(os_a, os_a, 0x10));
  15. os_a.addOutLink(new OutLink(os_a, os_b, 0x20));
  16. os_a.addOutLink(new OutLink(os_a, os_c, 0x30));
  17. os_b.addOutLink(new OutLink(os_b, os_a, 0x10));
  18. os_b.addOutLink(new OutLink(os_b, os_e, 0x20));
  19. os_b.addOutLink(new OutLink(os_b, os_d, 0x30));
  20. os_c.addOutLink(new OutLink(os_c, os_a, 0x10));
  21. os_c.addOutLink(new OutLink(os_c, os_b, 0x20));
  22. os_c.addOutLink(new OutLink(os_c, os_d, 0x30));
  23. os_d.addOutLink(new OutLink(os_d, os_c, 0x10));
  24. os_d.addOutLink(new OutLink(os_d, os_b, 0x20));
  25. os_d.addOutLink(new OutLink(os_d, os_e, 0x30));
  26. // 'e' is incomplete
  27. os_e.addOutLink(new OutLink(os_e, os_a, 0x10));
  28. os_e.addOutLink(new OutLink(os_e, os_d, 0x20));
  29. GraphLink[] path = PathFinder.findPathToNearestUnfilledState(os_a);
  30. GraphLink[] expectedPath = new GraphLink[] { new OutLink(os_a, os_b, 0x20), new OutLink(os_b, os_e, 0x20) }; // a->b->e
  31. assertArrayEquals("PathFinder should find the shortest path between a node and an incomplete one", expectedPath, path);
  32. }
  33. @Test
  34. public void PathFinderShouldProvideShortestPathToDestinationWithRegLinks() throws DuPALAnalyzerException {
  35. OutState os_a = new OutState(new OutStatePins(0x00, 0x00), 3);
  36. OutState os_b = new OutState(new OutStatePins(0x01, 0x00), 3);
  37. OutState os_c = new OutState(new OutStatePins(0x02, 0x00), 3);
  38. OutState os_d = new OutState(new OutStatePins(0x03, 0x00), 3);
  39. OutState os_e = new OutState(new OutStatePins(0x04, 0x00), 3, 3);
  40. OutState os_f = new OutState(new OutStatePins(0x05, 0x00), 3, 3);
  41. os_a.addOutLink(new OutLink(os_a, os_a, 0x10));
  42. os_a.addOutLink(new OutLink(os_a, os_b, 0x20));
  43. os_a.addOutLink(new OutLink(os_a, os_c, 0x30));
  44. os_b.addOutLink(new OutLink(os_b, os_a, 0x10));
  45. os_b.addOutLink(new OutLink(os_b, os_e, 0x20));
  46. os_b.addOutLink(new OutLink(os_b, os_d, 0x30));
  47. os_c.addOutLink(new OutLink(os_c, os_a, 0x10));
  48. os_c.addOutLink(new OutLink(os_c, os_b, 0x20));
  49. os_c.addOutLink(new OutLink(os_c, os_d, 0x30));
  50. os_d.addOutLink(new OutLink(os_d, os_c, 0x10));
  51. os_d.addOutLink(new OutLink(os_d, os_b, 0x20));
  52. os_d.addOutLink(new OutLink(os_d, os_e, 0x30));
  53. os_e.addOutLink(new OutLink(os_e, os_a, 0x10));
  54. os_e.addOutLink(new OutLink(os_e, os_d, 0x20));
  55. os_e.addOutLink(new OutLink(os_e, os_e, 0x20));
  56. os_e.addRegLink(new RegLink(os_e, os_e, os_f, 0x10));
  57. os_e.addRegLink(new RegLink(os_e, os_e, os_e, 0x20));
  58. os_e.addRegLink(new RegLink(os_e, os_e, os_e, 0x30));
  59. os_f.addOutLink(new OutLink(os_f, os_f, 0x10));
  60. os_f.addOutLink(new OutLink(os_f, os_f, 0x20));
  61. os_f.addRegLink(new RegLink(os_f, os_f, os_a, 0x20));
  62. GraphLink[] path = PathFinder.findPathToNearestUnfilledState(os_a);
  63. GraphLink[] expectedPath = new GraphLink[] { new OutLink(os_a, os_b, 0x20), new OutLink(os_b, os_e, 0x20), new RegLink(os_e, os_e, os_f, 0x10) }; // a->b->e=>f
  64. assertArrayEquals("PathFinder should find the shortest path between a node and an incomplete one even if regLinks are involved", expectedPath, path);
  65. }
  66. @Test
  67. public void PathFinderShouldProvideNoPathIfAllNodesAreComplete() throws DuPALAnalyzerException {
  68. OutState os_a = new OutState(new OutStatePins(0x00, 0x00), 3);
  69. OutState os_b = new OutState(new OutStatePins(0x01, 0x00), 3);
  70. OutState os_c = new OutState(new OutStatePins(0x02, 0x00), 3);
  71. OutState os_d = new OutState(new OutStatePins(0x03, 0x00), 3);
  72. OutState os_e = new OutState(new OutStatePins(0x04, 0x00), 3);
  73. os_a.addOutLink(new OutLink(os_a, os_a, 0x10));
  74. os_a.addOutLink(new OutLink(os_a, os_b, 0x20));
  75. os_a.addOutLink(new OutLink(os_a, os_c, 0x30));
  76. os_b.addOutLink(new OutLink(os_b, os_a, 0x10));
  77. os_b.addOutLink(new OutLink(os_b, os_e, 0x20));
  78. os_b.addOutLink(new OutLink(os_b, os_d, 0x30));
  79. os_c.addOutLink(new OutLink(os_c, os_a, 0x10));
  80. os_c.addOutLink(new OutLink(os_c, os_b, 0x20));
  81. os_c.addOutLink(new OutLink(os_c, os_d, 0x30));
  82. os_d.addOutLink(new OutLink(os_d, os_c, 0x10));
  83. os_d.addOutLink(new OutLink(os_d, os_b, 0x20));
  84. os_d.addOutLink(new OutLink(os_d, os_e, 0x30));
  85. os_e.addOutLink(new OutLink(os_e, os_a, 0x10));
  86. os_e.addOutLink(new OutLink(os_e, os_d, 0x20));
  87. os_e.addOutLink(new OutLink(os_e, os_e, 0x20));
  88. GraphLink[] path = PathFinder.findPathToNearestUnfilledState(os_a);
  89. assertArrayEquals("PathFinder should return null if no incomplete node exists", null, path);
  90. }
  91. @Test
  92. public void PathFinderShouldProvideShortestPathBetweenStates() throws DuPALAnalyzerException {
  93. OutState os_a = new OutState(new OutStatePins(0x00, 0x00), 3);
  94. OutState os_b = new OutState(new OutStatePins(0x01, 0x00), 3);
  95. OutState os_c = new OutState(new OutStatePins(0x02, 0x00), 3);
  96. OutState os_d = new OutState(new OutStatePins(0x03, 0x00), 3);
  97. OutState os_e = new OutState(new OutStatePins(0x04, 0x00), 3);
  98. os_a.addOutLink(new OutLink(os_a, os_a, 0x10));
  99. os_a.addOutLink(new OutLink(os_a, os_b, 0x20));
  100. os_a.addOutLink(new OutLink(os_a, os_c, 0x30));
  101. os_b.addOutLink(new OutLink(os_b, os_a, 0x10));
  102. os_b.addOutLink(new OutLink(os_b, os_e, 0x20));
  103. os_b.addOutLink(new OutLink(os_b, os_d, 0x30));
  104. os_c.addOutLink(new OutLink(os_c, os_a, 0x10));
  105. os_c.addOutLink(new OutLink(os_c, os_b, 0x20));
  106. os_c.addOutLink(new OutLink(os_c, os_d, 0x30));
  107. os_d.addOutLink(new OutLink(os_d, os_c, 0x10));
  108. os_d.addOutLink(new OutLink(os_d, os_b, 0x20));
  109. os_d.addOutLink(new OutLink(os_d, os_e, 0x30));
  110. os_e.addOutLink(new OutLink(os_e, os_a, 0x10));
  111. os_e.addOutLink(new OutLink(os_e, os_d, 0x20));
  112. os_e.addOutLink(new OutLink(os_e, os_e, 0x20));
  113. GraphLink[] path = PathFinder.findPathToState(os_b, os_c);
  114. assertEquals("PathFinder should find shortest path between two states", 2, path.length);
  115. }
  116. }