UNPKG

3.88 kBJavaScriptView Raw
1
2const assert = require('assert')
3const sinon = require('sinon')
4
5const buffers = require('../lib/buffers.js')
6
7var actionStub = () => {
8 return { payload: 1, resolve() { } }
9}
10
11module.exports = ({ describe, it }) => {
12
13 describe('buffers', () => {
14
15 describe('base (unbuffered) buffer', () => {
16
17 it ('should always pass puts into unreleased array', () => {
18 var buffer = buffers.base()
19 assert(buffer.unreleased.length === 0)
20 buffer.push({})
21 assert(buffer.unreleased.length === 1)
22 })
23
24 it ('should always shift off unreleased', () => {
25 var buffer = buffers.base()
26 var obj = obj
27 buffer.push(obj)
28 assert(buffer.unreleased.length === 1)
29 assert(buffer.shift() === obj)
30 assert(buffer.unreleased.length === 0)
31 })
32 })
33
34 describe('fixed', () => {
35
36 describe('when there is room', () => {
37
38 it ('should immediately release', () => {
39 var buffer = buffers.fixed(2)
40 var action = actionStub()
41 var spy = sinon.spy(action, 'resolve')
42 buffer.push(action)
43 assert(spy.calledWith(true))
44 })
45 })
46
47 describe('when there is not room', () => {
48
49 it ('should queue up', () => {
50
51 var buffer = buffers.fixed(2)
52
53 // fill buffer
54 buffer.push(actionStub())
55 buffer.push(actionStub())
56
57 buffer.push(actionStub())
58
59 assert(buffer.released.length === 2)
60 assert(buffer.unreleased.length === 1)
61
62 })
63
64 it ('should release next action when buffer full and has > 1 waiting', () => {
65
66 var buffer = buffers.fixed(1)
67
68 buffer.push(actionStub())
69 buffer.push(actionStub())
70
71 assert(buffer.released.length === 1)
72 assert(buffer.unreleased.length === 1)
73
74 var spy = sinon.spy(buffer.unreleased[0], 'resolve')
75 buffer.shift()
76
77 assert(spy.called)
78
79 assert(buffer.released.length === 1)
80 assert(buffer.unreleased.length === 0)
81 })
82 })
83 })
84
85 describe('dropping', () => {
86
87 describe('when there is room', () => {
88
89 it ('should immediately release', () => {
90 var buffer = buffers.dropping(2)
91 var action = actionStub()
92 var spy = sinon.spy(action, 'resolve')
93 buffer.push(action)
94 assert(spy.calledWith(true))
95 })
96 })
97
98 describe('when there is not room', () => {
99
100 it ('should resolve, drop the put and ignore it', () => {
101 var buffer = buffers.dropping(2)
102 buffer.push(actionStub())
103 buffer.push(actionStub())
104 var extra = actionStub()
105 var spy = sinon.spy(extra, 'resolve')
106 buffer.push(extra)
107 assert(spy.called)
108 assert(buffer.released.length === 2)
109 })
110 })
111 })
112
113 describe('sliding', () => {
114
115 describe('when there is room', () => {
116
117 it ('should immediately release', () => {
118 var buffer = buffers.sliding(2)
119 var action = actionStub()
120 var spy = sinon.spy(action, 'resolve')
121 buffer.push(action)
122 assert(spy.calledWith(true))
123 })
124 })
125
126 describe('when there is not room', () => {
127
128 it ('should drop the oldest and accept the new one', () => {
129 var buffer = buffers.sliding(2)
130 var first = actionStub()
131 buffer.push(first)
132 var second = actionStub()
133 buffer.push(second)
134
135 assert(buffer.released[0] === first)
136 assert(buffer.released[1] === second)
137
138 var third = actionStub()
139 var spy = sinon.spy(third, 'resolve')
140 buffer.push(third)
141 assert(spy.called)
142
143 assert(buffer.released[0] === second)
144 assert(buffer.released[1] === third)
145 })
146 })
147 })
148 })
149}