ref-counter.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  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) {
  46. a.deep([err, res], [null, 10], "Result #1");
  47. }),
  48. u,
  49. "Initial"
  50. );
  51. a(
  52. mfn(3, 7, function (err, res) {
  53. a.deep([err, res], [null, 10], "Result #2");
  54. }),
  55. u,
  56. "Initial #2"
  57. );
  58. a(
  59. mfn(5, 8, function (err, res) {
  60. a.deep([err, res], [null, 13], "Result B #1");
  61. }),
  62. u,
  63. "Initial #2"
  64. );
  65. a(
  66. mfn(3, 7, function (err, res) {
  67. a.deep([err, res], [null, 10], "Result #3");
  68. }),
  69. u,
  70. "Initial #2"
  71. );
  72. a(
  73. mfn(5, 8, function (err, res) {
  74. a.deep([err, res], [null, 13], "Result B #2");
  75. }),
  76. u,
  77. "Initial #3"
  78. );
  79. nextTick(function () {
  80. a(i, 2, "Called #2");
  81. a(
  82. mfn(3, 7, function (err, res) {
  83. a.deep([err, res], [null, 10], "Again: Result");
  84. }),
  85. u,
  86. "Again: Initial"
  87. );
  88. a(
  89. mfn(5, 8, function (err, res) {
  90. a.deep([err, res], [null, 13], "Again B: Result");
  91. }),
  92. u,
  93. "Again B: Initial"
  94. );
  95. nextTick(function () {
  96. a(i, 2, "Again Called #2");
  97. a(mfn.deleteRef(3, 7), false, "Delete ref #1");
  98. a(mfn.deleteRef(3, 7), false, "Delete ref #2");
  99. a(mfn.deleteRef(3, 7), false, "Delete ref #3");
  100. a(mfn.deleteRef(3, 7), true, "Delete ref Final");
  101. a(
  102. mfn(3, 7, function (err, res) {
  103. a.deep([err, res], [null, 10], "Again: Result");
  104. }),
  105. u,
  106. "Again: Initial"
  107. );
  108. a(
  109. mfn(5, 8, function (err, res) {
  110. a.deep([err, res], [null, 13], "Again B: Result");
  111. }),
  112. u,
  113. "Again B: Initial"
  114. );
  115. nextTick(function () {
  116. a(i, 3, "Call After delete");
  117. d();
  118. });
  119. });
  120. });
  121. },
  122. "Regular: Promise": function (a, d) {
  123. var mfn, fn, i = 0;
  124. fn = function (x, y) {
  125. ++i;
  126. return new Promise(function (res) {
  127. res(x + y);
  128. });
  129. };
  130. mfn = memoize(fn, { promise: true, refCounter: true });
  131. a(mfn.deleteRef(3, 7), null, "Delete ref before");
  132. mfn(3, 7).done(function (res) {
  133. a(res, 10, "Result #1");
  134. });
  135. mfn(3, 7).done(function (res) {
  136. a(res, 10, "Result #2");
  137. });
  138. mfn(5, 8).done(function (res) {
  139. a(res, 13, "Result B #1");
  140. });
  141. mfn(3, 7).done(function (res) {
  142. a(res, 10, "Result #3");
  143. });
  144. mfn(5, 8).done(function (res) {
  145. a(res, 13, "Result B #2");
  146. });
  147. setTimeout(function () {
  148. a(i, 2, "Called #2");
  149. mfn(3, 7).done(function (res) {
  150. a(res, 10, "Again: Result");
  151. });
  152. mfn(5, 8).done(function (res) {
  153. a(res, 13, "Again B: Result");
  154. });
  155. setTimeout(function () {
  156. a(i, 2, "Again Called #2");
  157. a(mfn.deleteRef(3, 7), false, "Delete ref #1");
  158. a(mfn.deleteRef(3, 7), false, "Delete ref #2");
  159. a(mfn.deleteRef(3, 7), false, "Delete ref #3");
  160. a(mfn.deleteRef(3, 7), true, "Delete ref Final");
  161. mfn(3, 7).done(function (res) {
  162. a(res, 10, "Again: Result");
  163. });
  164. mfn(5, 8).done(function (res) {
  165. a(res, 13, "Again B: Result");
  166. });
  167. setTimeout(function () {
  168. a(i, 3, "Call After delete");
  169. d();
  170. }, 10);
  171. }, 10);
  172. }, 10);
  173. },
  174. "Primitive": function (a) {
  175. var i = 0
  176. , fn = function (x, y, z) {
  177. ++i;
  178. return x + y + z;
  179. }
  180. , mfn;
  181. mfn = memoize(fn, { primitive: true, refCounter: true });
  182. a(mfn.deleteRef(3, 5, 7), null, "Delete before");
  183. a(mfn(3, 5, 7), 15, "Initial");
  184. a(mfn(3, 5, 7), 15, "Cache");
  185. a(mfn.deleteRef(3, 5, 7), false, "Delete #1");
  186. mfn(3, 5, 7);
  187. a(mfn.deleteRef(3, 5, 7), false, "Delete #2");
  188. mfn(3, 5, 7);
  189. a(mfn.deleteRef(3, 5, 7), false, "Delete #3");
  190. mfn(3, 5, 7);
  191. a(i, 1, "Not deleteed");
  192. a(mfn.deleteRef(3, 5, 7), false, "Delete #4");
  193. a(mfn.deleteRef(3, 5, 7), true, "Delete final");
  194. mfn(3, 5, 7);
  195. a(i, 2, "Restarted");
  196. mfn(3, 5, 7);
  197. a(i, 2, "Cached again");
  198. },
  199. "Primitive: Async": function (a, d) {
  200. var mfn, fn, u = {}, i = 0;
  201. fn = function (x, y, cb) {
  202. nextTick(function () {
  203. ++i;
  204. cb(null, x + y);
  205. });
  206. return u;
  207. };
  208. mfn = memoize(fn, { async: true, primitive: true, refCounter: true });
  209. a(mfn.deleteRef(3, 7), null, "Delete ref before");
  210. a(
  211. mfn(3, 7, function (err, res) {
  212. a.deep([err, res], [null, 10], "Result #1");
  213. }),
  214. u,
  215. "Initial"
  216. );
  217. a(
  218. mfn(3, 7, function (err, res) {
  219. a.deep([err, res], [null, 10], "Result #2");
  220. }),
  221. u,
  222. "Initial #2"
  223. );
  224. a(
  225. mfn(5, 8, function (err, res) {
  226. a.deep([err, res], [null, 13], "Result B #1");
  227. }),
  228. u,
  229. "Initial #2"
  230. );
  231. a(
  232. mfn(3, 7, function (err, res) {
  233. a.deep([err, res], [null, 10], "Result #3");
  234. }),
  235. u,
  236. "Initial #2"
  237. );
  238. a(
  239. mfn(5, 8, function (err, res) {
  240. a.deep([err, res], [null, 13], "Result B #2");
  241. }),
  242. u,
  243. "Initial #3"
  244. );
  245. nextTick(function () {
  246. a(i, 2, "Called #2");
  247. a(
  248. mfn(3, 7, function (err, res) {
  249. a.deep([err, res], [null, 10], "Again: Result");
  250. }),
  251. u,
  252. "Again: Initial"
  253. );
  254. a(
  255. mfn(5, 8, function (err, res) {
  256. a.deep([err, res], [null, 13], "Again B: Result");
  257. }),
  258. u,
  259. "Again B: Initial"
  260. );
  261. nextTick(function () {
  262. a(i, 2, "Again Called #2");
  263. a(mfn.deleteRef(3, 7), false, "Delete ref #1");
  264. a(mfn.deleteRef(3, 7), false, "Delete ref #2");
  265. a(mfn.deleteRef(3, 7), false, "Delete ref #3");
  266. a(mfn.deleteRef(3, 7), true, "Delete ref Final");
  267. a(
  268. mfn(3, 7, function (err, res) {
  269. a.deep([err, res], [null, 10], "Again: Result");
  270. }),
  271. u,
  272. "Again: Initial"
  273. );
  274. a(
  275. mfn(5, 8, function (err, res) {
  276. a.deep([err, res], [null, 13], "Again B: Result");
  277. }),
  278. u,
  279. "Again B: Initial"
  280. );
  281. nextTick(function () {
  282. a(i, 3, "Call After delete");
  283. d();
  284. });
  285. });
  286. });
  287. },
  288. "Primitive: Promise": function (a, d) {
  289. var mfn, fn, i = 0;
  290. fn = function (x, y) {
  291. ++i;
  292. return new Promise(function (res) {
  293. res(x + y);
  294. });
  295. };
  296. mfn = memoize(fn, { promise: true, primitive: true, refCounter: true });
  297. a(mfn.deleteRef(3, 7), null, "Delete ref before");
  298. mfn(3, 7).done(function (res) {
  299. a(res, 10, "Result #1");
  300. });
  301. mfn(3, 7).done(function (res) {
  302. a(res, 10, "Result #2");
  303. });
  304. mfn(5, 8).done(function (res) {
  305. a(res, 13, "Result B #1");
  306. });
  307. mfn(3, 7).done(function (res) {
  308. a(res, 10, "Result #3");
  309. });
  310. mfn(5, 8).done(function (res) {
  311. a(res, 13, "Result B #2");
  312. });
  313. setTimeout(function () {
  314. a(i, 2, "Called #2");
  315. mfn(3, 7).done(function (res) {
  316. a(res, 10, "Again: Result");
  317. });
  318. mfn(5, 8).done(function (res) {
  319. a(res, 13, "Again B: Result");
  320. });
  321. setTimeout(function () {
  322. a(i, 2, "Again Called #2");
  323. a(mfn.deleteRef(3, 7), false, "Delete ref #1");
  324. a(mfn.deleteRef(3, 7), false, "Delete ref #2");
  325. a(mfn.deleteRef(3, 7), false, "Delete ref #3");
  326. a(mfn.deleteRef(3, 7), true, "Delete ref Final");
  327. mfn(3, 7).done(function (res) {
  328. a(res, 10, "Again: Result");
  329. });
  330. mfn(5, 8).done(function (res) {
  331. a(res, 13, "Again B: Result");
  332. });
  333. setTimeout(function () {
  334. a(i, 3, "Call After delete");
  335. d();
  336. }, 10);
  337. }, 10);
  338. }, 10);
  339. }
  340. };
  341. };