ref-counter.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. /* eslint max-lines: 0, id-length: 0, no-undef: 0 */
  2. "use strict";
  3. var memoize = require("../..")
  4. , nextTick = require("next-tick")
  5. , Promise = require("plain-promise");
  6. module.exports = function () {
  7. return {
  8. "Regular": function (a) {
  9. var i = 0
  10. , fn = function (x, y, z) {
  11. ++i;
  12. return x + y + z;
  13. }
  14. , mfn;
  15. mfn = memoize(fn, { refCounter: true });
  16. a(mfn.deleteRef(3, 5, 7), null, "Delete before");
  17. a(mfn(3, 5, 7), 15, "Initial");
  18. a(mfn(3, 5, 7), 15, "Cache");
  19. a(mfn.deleteRef(3, 5, 7), false, "Delete #1");
  20. mfn(3, 5, 7);
  21. a(mfn.deleteRef(3, 5, 7), false, "Delete #2");
  22. mfn(3, 5, 7);
  23. a(mfn.deleteRef(3, 5, 7), false, "Delete #3");
  24. mfn(3, 5, 7);
  25. a(i, 1, "Not deleteed");
  26. a(mfn.deleteRef(3, 5, 7), false, "Delete #4");
  27. a(mfn.deleteRef(3, 5, 7), true, "Delete final");
  28. mfn(3, 5, 7);
  29. a(i, 2, "Restarted");
  30. mfn(3, 5, 7);
  31. a(i, 2, "Cached again");
  32. },
  33. "Regular: Async": function (a, d) {
  34. var mfn, fn, u = {}, i = 0;
  35. fn = function (x, y, cb) {
  36. nextTick(function () {
  37. ++i;
  38. cb(null, x + y);
  39. });
  40. return u;
  41. };
  42. mfn = memoize(fn, { async: true, refCounter: true });
  43. a(mfn.deleteRef(3, 7), null, "Delete ref before");
  44. a(
  45. mfn(3, 7, function (err, res) { a.deep([err, res], [null, 10], "Result #1"); }), u,
  46. "Initial"
  47. );
  48. a(
  49. mfn(3, 7, function (err, res) { a.deep([err, res], [null, 10], "Result #2"); }), u,
  50. "Initial #2"
  51. );
  52. a(
  53. mfn(5, 8, function (err, res) { a.deep([err, res], [null, 13], "Result B #1"); }),
  54. u, "Initial #2"
  55. );
  56. a(
  57. mfn(3, 7, function (err, res) { a.deep([err, res], [null, 10], "Result #3"); }), u,
  58. "Initial #2"
  59. );
  60. a(
  61. mfn(5, 8, function (err, res) { a.deep([err, res], [null, 13], "Result B #2"); }),
  62. u, "Initial #3"
  63. );
  64. nextTick(function () {
  65. a(i, 2, "Called #2");
  66. a(
  67. mfn(3, 7, function (err, res) {
  68. a.deep([err, res], [null, 10], "Again: Result");
  69. }),
  70. u, "Again: Initial"
  71. );
  72. a(
  73. mfn(5, 8, function (err, res) {
  74. a.deep([err, res], [null, 13], "Again B: Result");
  75. }),
  76. u, "Again B: Initial"
  77. );
  78. nextTick(function () {
  79. a(i, 2, "Again Called #2");
  80. a(mfn.deleteRef(3, 7), false, "Delete ref #1");
  81. a(mfn.deleteRef(3, 7), false, "Delete ref #2");
  82. a(mfn.deleteRef(3, 7), false, "Delete ref #3");
  83. a(mfn.deleteRef(3, 7), true, "Delete ref Final");
  84. a(
  85. mfn(3, 7, function (err, res) {
  86. a.deep([err, res], [null, 10], "Again: Result");
  87. }),
  88. u, "Again: Initial"
  89. );
  90. a(
  91. mfn(5, 8, function (err, res) {
  92. a.deep([err, res], [null, 13], "Again B: Result");
  93. }),
  94. u, "Again B: Initial"
  95. );
  96. nextTick(function () {
  97. a(i, 3, "Call After delete");
  98. d();
  99. });
  100. });
  101. });
  102. },
  103. "Regular: Promise": function (a, d) {
  104. var mfn, fn, i = 0;
  105. fn = function (x, y) {
  106. ++i;
  107. return new Promise(function (res) { res(x + y); });
  108. };
  109. mfn = memoize(fn, { promise: true, refCounter: true });
  110. a(mfn.deleteRef(3, 7), null, "Delete ref before");
  111. mfn(3, 7).done(function (res) { a(res, 10, "Result #1"); });
  112. mfn(3, 7).done(function (res) { a(res, 10, "Result #2"); });
  113. mfn(5, 8).done(function (res) { a(res, 13, "Result B #1"); });
  114. mfn(3, 7).done(function (res) { a(res, 10, "Result #3"); });
  115. mfn(5, 8).done(function (res) { a(res, 13, "Result B #2"); });
  116. setTimeout(function () {
  117. a(i, 2, "Called #2");
  118. mfn(3, 7).done(function (res) { a(res, 10, "Again: Result"); });
  119. mfn(5, 8).done(function (res) { a(res, 13, "Again B: Result"); });
  120. setTimeout(function () {
  121. a(i, 2, "Again Called #2");
  122. a(mfn.deleteRef(3, 7), false, "Delete ref #1");
  123. a(mfn.deleteRef(3, 7), false, "Delete ref #2");
  124. a(mfn.deleteRef(3, 7), false, "Delete ref #3");
  125. a(mfn.deleteRef(3, 7), true, "Delete ref Final");
  126. mfn(3, 7).done(function (res) { a(res, 10, "Again: Result"); });
  127. mfn(5, 8).done(function (res) { a(res, 13, "Again B: Result"); });
  128. setTimeout(function () {
  129. a(i, 3, "Call After delete");
  130. d();
  131. }, 10);
  132. }, 10);
  133. }, 10);
  134. },
  135. "Primitive": function (a) {
  136. var i = 0
  137. , fn = function (x, y, z) {
  138. ++i;
  139. return x + y + z;
  140. }
  141. , mfn;
  142. mfn = memoize(fn, { primitive: true, refCounter: true });
  143. a(mfn.deleteRef(3, 5, 7), null, "Delete before");
  144. a(mfn(3, 5, 7), 15, "Initial");
  145. a(mfn(3, 5, 7), 15, "Cache");
  146. a(mfn.deleteRef(3, 5, 7), false, "Delete #1");
  147. mfn(3, 5, 7);
  148. a(mfn.deleteRef(3, 5, 7), false, "Delete #2");
  149. mfn(3, 5, 7);
  150. a(mfn.deleteRef(3, 5, 7), false, "Delete #3");
  151. mfn(3, 5, 7);
  152. a(i, 1, "Not deleteed");
  153. a(mfn.deleteRef(3, 5, 7), false, "Delete #4");
  154. a(mfn.deleteRef(3, 5, 7), true, "Delete final");
  155. mfn(3, 5, 7);
  156. a(i, 2, "Restarted");
  157. mfn(3, 5, 7);
  158. a(i, 2, "Cached again");
  159. },
  160. "Primitive: Async": function (a, d) {
  161. var mfn, fn, u = {}, i = 0;
  162. fn = function (x, y, cb) {
  163. nextTick(function () {
  164. ++i;
  165. cb(null, x + y);
  166. });
  167. return u;
  168. };
  169. mfn = memoize(fn, { async: true, primitive: true, refCounter: true });
  170. a(mfn.deleteRef(3, 7), null, "Delete ref before");
  171. a(
  172. mfn(3, 7, function (err, res) { a.deep([err, res], [null, 10], "Result #1"); }), u,
  173. "Initial"
  174. );
  175. a(
  176. mfn(3, 7, function (err, res) { a.deep([err, res], [null, 10], "Result #2"); }), u,
  177. "Initial #2"
  178. );
  179. a(
  180. mfn(5, 8, function (err, res) { a.deep([err, res], [null, 13], "Result B #1"); }),
  181. u, "Initial #2"
  182. );
  183. a(
  184. mfn(3, 7, function (err, res) { a.deep([err, res], [null, 10], "Result #3"); }), u,
  185. "Initial #2"
  186. );
  187. a(
  188. mfn(5, 8, function (err, res) { a.deep([err, res], [null, 13], "Result B #2"); }),
  189. u, "Initial #3"
  190. );
  191. nextTick(function () {
  192. a(i, 2, "Called #2");
  193. a(
  194. mfn(3, 7, function (err, res) {
  195. a.deep([err, res], [null, 10], "Again: Result");
  196. }),
  197. u, "Again: Initial"
  198. );
  199. a(
  200. mfn(5, 8, function (err, res) {
  201. a.deep([err, res], [null, 13], "Again B: Result");
  202. }),
  203. u, "Again B: Initial"
  204. );
  205. nextTick(function () {
  206. a(i, 2, "Again Called #2");
  207. a(mfn.deleteRef(3, 7), false, "Delete ref #1");
  208. a(mfn.deleteRef(3, 7), false, "Delete ref #2");
  209. a(mfn.deleteRef(3, 7), false, "Delete ref #3");
  210. a(mfn.deleteRef(3, 7), true, "Delete ref Final");
  211. a(
  212. mfn(3, 7, function (err, res) {
  213. a.deep([err, res], [null, 10], "Again: Result");
  214. }),
  215. u, "Again: Initial"
  216. );
  217. a(
  218. mfn(5, 8, function (err, res) {
  219. a.deep([err, res], [null, 13], "Again B: Result");
  220. }),
  221. u, "Again B: Initial"
  222. );
  223. nextTick(function () {
  224. a(i, 3, "Call After delete");
  225. d();
  226. });
  227. });
  228. });
  229. },
  230. "Primitive: Promise": function (a, d) {
  231. var mfn, fn, i = 0;
  232. fn = function (x, y) {
  233. ++i;
  234. return new Promise(function (res) { res(x + y); });
  235. };
  236. mfn = memoize(fn, { promise: true, primitive: true, refCounter: true });
  237. a(mfn.deleteRef(3, 7), null, "Delete ref before");
  238. mfn(3, 7).done(function (res) { a(res, 10, "Result #1"); });
  239. mfn(3, 7).done(function (res) { a(res, 10, "Result #2"); });
  240. mfn(5, 8).done(function (res) { a(res, 13, "Result B #1"); });
  241. mfn(3, 7).done(function (res) { a(res, 10, "Result #3"); });
  242. mfn(5, 8).done(function (res) { a(res, 13, "Result B #2"); });
  243. setTimeout(function () {
  244. a(i, 2, "Called #2");
  245. mfn(3, 7).done(function (res) { a(res, 10, "Again: Result"); });
  246. mfn(5, 8).done(function (res) { a(res, 13, "Again B: Result"); });
  247. setTimeout(function () {
  248. a(i, 2, "Again Called #2");
  249. a(mfn.deleteRef(3, 7), false, "Delete ref #1");
  250. a(mfn.deleteRef(3, 7), false, "Delete ref #2");
  251. a(mfn.deleteRef(3, 7), false, "Delete ref #3");
  252. a(mfn.deleteRef(3, 7), true, "Delete ref Final");
  253. mfn(3, 7).done(function (res) { a(res, 10, "Again: Result"); });
  254. mfn(5, 8).done(function (res) { a(res, 13, "Again B: Result"); });
  255. setTimeout(function () {
  256. a(i, 3, "Call After delete");
  257. d();
  258. }, 10);
  259. }, 10);
  260. }, 10);
  261. }
  262. };
  263. };