UNPKG

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