breakable-tests.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. "use strict";
  2. var test = require("tap").test;
  3. var breakable = require("../");
  4. test("normal-return", function(t) {
  5. t.equal(breakable(function(brk) {
  6. return 1;
  7. }), 1);
  8. t.end();
  9. });
  10. test("break-return", function(t) {
  11. t.equal(breakable(function(brk) {
  12. brk(2);
  13. return 1;
  14. }), 2);
  15. t.end();
  16. });
  17. test("recurse", function(t) {
  18. t.equal(breakable(function(brk) {
  19. function traverse(n) {
  20. if (n < 100) {
  21. traverse(n + 1);
  22. }
  23. brk(n);
  24. }
  25. traverse(0);
  26. }), 100);
  27. t.end();
  28. });
  29. test("simple-throws", function(t) {
  30. t.throws(breakable.bind(null, function(brk) {
  31. throw 1;
  32. }));
  33. t.doesNotThrow(breakable.bind(null, function(brk) {
  34. brk(1);
  35. throw 2;
  36. }));
  37. t.end();
  38. });
  39. test("prop-recurse-break", function(t) {
  40. var tstObj = {a: 1, b: {c: 2, d: {e: 3, f: "gold", g: null}}, h: {i: 6}};
  41. var found = breakable(function(brk) {
  42. function traverse(obj) {
  43. var props = Object.keys(obj);
  44. props.forEach(function(prop) {
  45. var val = obj[prop];
  46. if (val === "gold") {
  47. brk(prop);
  48. } else if (val === null) {
  49. throw new Error("break did not work");
  50. } else if (val && typeof val === "object") {
  51. traverse(val);
  52. }
  53. });
  54. }
  55. traverse(tstObj);
  56. });
  57. t.equal(found, "f");
  58. t.end();
  59. });
  60. test("forEach-break", function(t) {
  61. var cnt = 0;
  62. breakable(function(brk) {
  63. [1,2,3].forEach(function(v) {
  64. ++cnt;
  65. if (v === 2) {
  66. brk();
  67. }
  68. });
  69. });
  70. t.equal(cnt, 2);
  71. t.end();
  72. });
  73. test("nested-forEach-break", function(t) {
  74. var cnt = 0;
  75. breakable(function(brk) {
  76. [1,2,3].forEach(function(v) {
  77. [4,5,6].forEach(function(v1) {
  78. ++cnt;
  79. if (v === 2 && v1 === 5) {
  80. brk();
  81. }
  82. });
  83. });
  84. });
  85. t.equal(cnt, 5);
  86. t.end();
  87. });
  88. test("nested-breakables-1", function(t) {
  89. var res = breakable(function(brk1) {
  90. breakable(function(brk2) {
  91. brk1(13);
  92. });
  93. });
  94. t.equal(res, 13);
  95. t.end();
  96. });
  97. test("nested-breakables-2", function(t) {
  98. t.plan(2);
  99. var res1 = breakable(function(brk1) {
  100. var res2 = breakable(function(brk2) {
  101. brk2(13);
  102. });
  103. t.equal(res2, 13);
  104. });
  105. t.equal(res1, undefined);
  106. t.end();
  107. });