-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcircular-buffer.spec.js
106 lines (95 loc) · 3.23 KB
/
circular-buffer.spec.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import circularBuffer, { BufferFullError, BufferEmptyError } from './circular-buffer';
describe('CircularBuffer', () => {
test('reading an empty buffer throws a BufferEmptyError', () => {
const buffer = new circularBuffer(1);
expect(() => buffer.read()).toThrow(BufferEmptyError);
});
test('write and read back one item', () => {
const buffer = new circularBuffer(1);
buffer.write('1');
expect(buffer.read()).toBe('1');
expect(() => buffer.read()).toThrow(BufferEmptyError);
});
test('write and read back multiple items', () => {
const buffer = new circularBuffer(2);
buffer.write('1');
buffer.write('2');
expect(buffer.read()).toBe('1');
expect(buffer.read()).toBe('2');
expect(() => buffer.read()).toThrow(BufferEmptyError);
});
test('clearing a buffer', () => {
const buffer = new circularBuffer(2);
buffer.write('1');
buffer.write('2');
buffer.clear();
expect(() => buffer.read()).toThrow(BufferEmptyError);
buffer.write('3');
buffer.write('4');
expect(buffer.read()).toBe('3');
expect(buffer.read()).toBe('4');
});
test('alternate write and read', () => {
const buffer = new circularBuffer(2);
buffer.write('1');
expect(buffer.read()).toBe('1');
buffer.write('2');
expect(buffer.read()).toBe('2');
});
test('reads back oldest item', () => {
const buffer = new circularBuffer(3);
buffer.write('1');
buffer.write('2');
buffer.read();
buffer.write('3');
expect(buffer.read()).toBe('2');
expect(buffer.read()).toBe('3');
});
test('writes of undefined or null don\'t occupy buffer', () => {
const buffer = new circularBuffer(3);
buffer.write(null);
buffer.write(undefined);
[1, 2, 3].map(i => buffer.write(i.toString()));
expect(buffer.read()).toBe('1');
});
test('writing to a full buffer throws a BufferFullError', () => {
const buffer = new circularBuffer(2);
buffer.write('1');
buffer.write('2');
expect(() => buffer.write('A')).toThrow(BufferFullError);
});
test('forced writes over write oldest item in a full buffer', () => {
const buffer = new circularBuffer(2);
buffer.write('1');
buffer.write('2');
buffer.forceWrite('A');
expect(buffer.read()).toBe('2');
expect(buffer.read()).toBe('A');
expect(() => buffer.read()).toThrow(BufferEmptyError);
});
test('forced writes act like write in a non-full buffer', () => {
const buffer = new circularBuffer(2);
buffer.write('1');
buffer.forceWrite('2');
expect(buffer.read()).toBe('1');
expect(buffer.read()).toBe('2');
expect(() => buffer.read()).toThrow(BufferEmptyError);
});
test('alternate force write and read into full buffer', () => {
const buffer = new circularBuffer(5);
[1, 2, 3].map(i => buffer.write(i.toString()));
buffer.read();
buffer.read();
buffer.write('4');
buffer.read();
[5, 6, 7, 8].map(i => buffer.write(i.toString()));
buffer.forceWrite('A');
buffer.forceWrite('B');
expect(buffer.read()).toBe('6');
expect(buffer.read()).toBe('7');
expect(buffer.read()).toBe('8');
expect(buffer.read()).toBe('A');
expect(buffer.read()).toBe('B');
expect(() => buffer.read()).toThrow(BufferEmptyError);
});
});