1 | 'use strict'
|
2 | var test = require('tap').test
|
3 | var limit = require('../index.js')
|
4 |
|
5 |
|
6 | test('limit', function (t) {
|
7 | t.plan(5)
|
8 | var called = 0
|
9 | var completed = 0
|
10 | var finishers = []
|
11 | var limited = limit(function (num, cb) {
|
12 | ++ called
|
13 | finishers.push(cb)
|
14 | }, 2)
|
15 | ;[1,2,3].forEach(function (num) { limited(num, function () { ++ completed }) })
|
16 | setImmediate(function () {
|
17 | t.is(called, 2, 'Immediately queued 2 callbacks')
|
18 | t.is(completed, 0, 'With no completion yet')
|
19 |
|
20 | finishers.shift()()
|
21 | setImmediate(afterCompletion)
|
22 | })
|
23 | function afterCompletion () {
|
24 | t.is(completed, 1, 'Calling the finisher completed the first one')
|
25 | t.is(called, 3,'Third action was started')
|
26 | finishers.shift()()
|
27 | finishers.shift()()
|
28 | setImmediate(afterAllDone)
|
29 | }
|
30 | function afterAllDone () {
|
31 | t.is(completed, 3, 'All completed')
|
32 | }
|
33 | })
|
34 |
|
35 | test('limit-obj-method', function (t) {
|
36 | t.plan(5)
|
37 | var called = 0
|
38 | var completed = 0
|
39 | var finishers = []
|
40 | var example = {
|
41 | test: function (num, cb) {
|
42 | ++ called
|
43 | finishers.push(cb)
|
44 | }
|
45 | }
|
46 | limit.method(example, 'test', 2)
|
47 | ;[1,2,3].forEach(function (num) { example.test(num, function () { ++ completed }) })
|
48 | setImmediate(function () {
|
49 | t.is(called, 2, 'Immediately queued 2 callbacks')
|
50 | t.is(completed, 0, 'With no completion yet')
|
51 |
|
52 | finishers.shift()()
|
53 | setImmediate(afterCompletion)
|
54 | })
|
55 | function afterCompletion () {
|
56 | t.is(completed, 1, 'Calling the finisher completed the first one')
|
57 | t.is(called, 3,'Third action was started')
|
58 | finishers.shift()()
|
59 | finishers.shift()()
|
60 | setImmediate(afterAllDone)
|
61 | }
|
62 | function afterAllDone () {
|
63 | t.is(completed, 3, 'All completed')
|
64 | }
|
65 | })
|
66 |
|
67 | test('limit-class-method', function (t) {
|
68 | t.plan(5)
|
69 | var called = 0
|
70 | var completed = 0
|
71 | var finishers = []
|
72 | function Example () {}
|
73 | Example.prototype = {
|
74 | test: function (num, cb) {
|
75 | ++ called
|
76 | finishers.push(cb)
|
77 | }
|
78 | }
|
79 | limit.method(Example, 'test', 2)
|
80 | var example = new Example()
|
81 | ;[1,2,3].forEach(function (num) { example.test(num, function () { ++ completed }) })
|
82 | setImmediate(function () {
|
83 | t.is(called, 2, 'Immediately queued 2 callbacks')
|
84 | t.is(completed, 0, 'With no completion yet')
|
85 |
|
86 | finishers.shift()()
|
87 | setImmediate(afterCompletion)
|
88 | })
|
89 | function afterCompletion () {
|
90 | t.is(completed, 1, 'Calling the finisher completed the first one')
|
91 | t.is(called, 3,'Third action was started')
|
92 | finishers.shift()()
|
93 | finishers.shift()()
|
94 | setImmediate(afterAllDone)
|
95 | }
|
96 | function afterAllDone () {
|
97 | t.is(completed, 3, 'All completed')
|
98 | }
|
99 | })
|