doubly-linked-list-iterator-test.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. const tap = require("tap");
  2. const DLL = require("../lib/DoublyLinkedList");
  3. const Iterator = require("../lib/DoublyLinkedListIterator");
  4. tap.test("iterates forward", function(t) {
  5. const dll = new DLL();
  6. const node1 = DLL.createNode({ id: 1 });
  7. const node2 = DLL.createNode({ id: 2 });
  8. const node3 = DLL.createNode({ id: 3 });
  9. const node4 = DLL.createNode({ id: 4 });
  10. dll.insertBeginning(node1);
  11. dll.insertBeginning(node2);
  12. dll.insertBeginning(node3);
  13. dll.insertBeginning(node4);
  14. const iterator = new Iterator(dll);
  15. const iterationResult1 = iterator.next();
  16. t.notOk(iterationResult1.done);
  17. t.same(iterationResult1.value, node4);
  18. iterator.next();
  19. iterator.next();
  20. const iterationResult4 = iterator.next();
  21. t.notOk(iterationResult4.done);
  22. t.same(iterationResult4.value, node1);
  23. const iterationResult5 = iterator.next();
  24. t.ok(iterationResult5.done);
  25. t.end();
  26. });
  27. tap.test("iterates backwards", function(t) {
  28. const dll = new DLL();
  29. const node1 = DLL.createNode({ id: 1 });
  30. const node2 = DLL.createNode({ id: 2 });
  31. const node3 = DLL.createNode({ id: 3 });
  32. const node4 = DLL.createNode({ id: 4 });
  33. dll.insertBeginning(node1);
  34. dll.insertBeginning(node2);
  35. dll.insertBeginning(node3);
  36. dll.insertBeginning(node4);
  37. const iterator = new Iterator(dll, true);
  38. const iterationResult1 = iterator.next();
  39. t.notOk(iterationResult1.done);
  40. t.same(iterationResult1.value, node1);
  41. iterator.next();
  42. iterator.next();
  43. const iterationResult4 = iterator.next();
  44. t.notOk(iterationResult4.done);
  45. t.same(iterationResult4.value, node4);
  46. const iterationResult5 = iterator.next();
  47. t.ok(iterationResult5.done);
  48. t.end();
  49. });
  50. tap.test("iterates forward when adding nodes after creating iterator", function(
  51. t
  52. ) {
  53. const dll = new DLL();
  54. const node1 = DLL.createNode({ id: 1 });
  55. const node2 = DLL.createNode({ id: 2 });
  56. const iterator = new Iterator(dll);
  57. dll.insertBeginning(node1);
  58. dll.insertBeginning(node2);
  59. const iterationResult1 = iterator.next();
  60. t.notOk(iterationResult1.done);
  61. t.same(iterationResult1.value, node2);
  62. const iterationResult2 = iterator.next();
  63. t.notOk(iterationResult2.done);
  64. t.same(iterationResult2.value, node1);
  65. const iterationResult3 = iterator.next();
  66. t.ok(iterationResult3.done);
  67. t.end();
  68. });
  69. tap.test(
  70. "iterates backwards when adding nodes after creating iterator",
  71. function(t) {
  72. const dll = new DLL();
  73. const node1 = DLL.createNode({ id: 1 });
  74. const node2 = DLL.createNode({ id: 2 });
  75. const iterator = new Iterator(dll, true);
  76. dll.insertBeginning(node1);
  77. dll.insertBeginning(node2);
  78. const iterationResult1 = iterator.next();
  79. t.notOk(iterationResult1.done);
  80. t.same(iterationResult1.value, node1);
  81. const iterationResult2 = iterator.next();
  82. t.notOk(iterationResult2.done);
  83. t.same(iterationResult2.value, node2);
  84. const iterationResult3 = iterator.next();
  85. t.ok(iterationResult3.done);
  86. t.end();
  87. }
  88. );
  89. tap.test("stops iterating when node is detached", function(t) {
  90. const dll = new DLL();
  91. const iterator = new Iterator(dll);
  92. const node1 = DLL.createNode({ id: 1 });
  93. const node2 = DLL.createNode({ id: 2 });
  94. dll.insertBeginning(node1);
  95. dll.insertBeginning(node2);
  96. const iterationResult1 = iterator.next();
  97. t.notOk(iterationResult1.done);
  98. t.same(iterationResult1.value, node2);
  99. dll.remove(node1);
  100. const iterationResult3 = iterator.next();
  101. t.ok(iterationResult3.done);
  102. t.end();
  103. });