DequeBrackets.hx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package cases;
  2. import utest.Assert;
  3. import haxe.ds.GenericStack;
  4. import utest.ITest;
  5. class DequeBrackets implements ITest {
  6. public function new() {}
  7. /**
  8. Spawns a thread to insert bracket pairs into a Deque. The opening
  9. one is placed in front, the closing one in the back. This is going
  10. to result in something like `([{<>}])` which we check for at the end.
  11. **/
  12. @:timeout(2000)
  13. public function test(async:utest.Async) {
  14. Thread.create(() -> {
  15. var deque = new Deque();
  16. var dequeMutex = new Mutex();
  17. function add(open:String, close:String) {
  18. dequeMutex.acquire();
  19. deque.push(open);
  20. deque.add(close);
  21. dequeMutex.release();
  22. }
  23. var pairs = [
  24. {open: "(", close: ")"},
  25. {open: "[", close: "]"},
  26. {open: "{", close: "}"},
  27. {open: "<", close: ">"}
  28. ];
  29. var iterationsPerThread = 100;
  30. var lock = new Lock();
  31. var self = Thread.current();
  32. Thread.create(() -> {
  33. for (_ in 0...pairs.length) {
  34. Assert.isTrue(lock.wait());
  35. }
  36. self.sendMessage("done");
  37. });
  38. var threads = [];
  39. for (pair in pairs) {
  40. threads.push(Thread.create(() -> {
  41. Thread.readMessage(true);
  42. for (_ in 0...iterationsPerThread) {
  43. add(pair.open, pair.close);
  44. Sys.sleep(0.0001); // sleep a bit to increase chaos
  45. }
  46. lock.release();
  47. }));
  48. }
  49. for (thread in threads) {
  50. thread.sendMessage("go");
  51. }
  52. switch (Thread.readMessage(true)) {
  53. case "done":
  54. case s:
  55. Assert.fail("Unexpected message: " + s);
  56. }
  57. var stack = new GenericStack<String>();
  58. function pop() {
  59. return deque.pop(false);
  60. }
  61. for (_ in 0...pairs.length * iterationsPerThread) {
  62. stack.add(pop());
  63. }
  64. for (elt in stack) {
  65. var expected = switch (elt) {
  66. case "(": ")";
  67. case "<": ">";
  68. case "{": "}";
  69. case "[": "]";
  70. case s:
  71. Assert.fail("Unexpected " + s);
  72. s;
  73. }
  74. Assert.equals(expected, pop());
  75. }
  76. async.done();
  77. });
  78. }
  79. }