Skip to content

Commit 2ed4828

Browse files
committed
Beef up unit test coverage in io package.
1 parent 5c4a085 commit 2ed4828

File tree

8 files changed

+162
-23
lines changed

8 files changed

+162
-23
lines changed

io/bitbuffer.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,13 @@ export class BitBuffer {
8484
if (this.bytePtr >= this.data.byteLength) {
8585
throw `No more bytes left when switching packing direction`;
8686
}
87-
this.bitPtr = 7;
87+
this.bitPtr = 0;
8888
} else if (!this.mtl && this.bitPtr !== 0) {
8989
this.bytePtr++;
9090
if (this.bytePtr >= this.data.byteLength) {
9191
throw `No more bytes left when switching packing direction`;
9292
}
93-
this.bitPtr = 0;
93+
this.bitPtr = 7;
9494
}
9595
}
9696

io/bytebuffer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ export class ByteBuffer {
114114
writeASCIIString(str) {
115115
for (let i = 0; i < str.length; ++i) {
116116
const curByte = str.charCodeAt(i);
117-
if (curByte < 0 || curByte > 255) {
117+
if (curByte < 0 || curByte > 127) {
118118
throw 'Trying to write a non-ASCII string!';
119119
}
120120
this.insertByte(curByte);

package-lock.json

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,8 @@
3333
"bugs": {
3434
"url": "https://github.com/codedread/bitjs/issues"
3535
},
36-
"dependencies": {},
3736
"devDependencies": {
38-
"c8": "^7.12.0",
37+
"c8": "^7.14.0",
3938
"chai": "^4.3.4",
4039
"mocha": "^10.1.0",
4140
"typescript": "^4.8.0"
@@ -46,7 +45,7 @@
4645
},
4746
"scripts": {
4847
"build-webpshim": "cd build; make",
49-
"coverage": "./node_modules/.bin/c8 npm test",
48+
"coverage": "c8 npm run test",
5049
"test": "./node_modules/.bin/mocha tests/*.spec.js",
5150
"update-types": "tsc"
5251
}

tests/io-bitbuffer.spec.js

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,35 @@ import 'mocha';
1111
import { expect } from 'chai';
1212

1313
describe('bitjs.io.BitBuffer', () => {
14+
/** @type {BitBuffer} */
1415
let buffer;
1516

17+
it('throws when invalid numBytes', () => {
18+
expect(() => new BitBuffer()).throws();
19+
});
20+
1621
describe('least-to-most-significant bit-packing', () => {
1722
beforeEach(() => {
1823
buffer = new BitBuffer(4);
1924
});
2025

2126
it('bit/byte pointers initialized properly', () => {
27+
expect(buffer.getPackingDirection()).equals(false);
2228
expect(buffer.bytePtr).equals(0);
2329
expect(buffer.bitPtr).equals(0);
24-
})
30+
});
2531

32+
it('throws when writing invalid values', () => {
33+
expect(() => buffer.writeBits(-3, 2)).throws();
34+
expect(() => buffer.writeBits(3, -2)).throws();
35+
expect(() => buffer.writeBits(0, 54)).throws();
36+
});
37+
38+
it('throws when writing too many bits into the buffer', () => {
39+
buffer.writeBits(0, 31); // thirty-one zeroes.
40+
expect(() => buffer.writeBits(1, 2)).throws();
41+
});
42+
2643
it('write multiple bits', () => {
2744
buffer.writeBits(0b01011, 5); // Should result in: 0b00001011.
2845
expect(buffer.bytePtr).equals(0);
@@ -47,6 +64,26 @@ describe('bitjs.io.BitBuffer', () => {
4764
expect(Array.from(buffer.data)).to.have.ordered.members(
4865
[0xfe, 0xff, 0x03, 0x00]);
4966
});
67+
68+
it('properly changes bit-packing direction', () => {
69+
buffer.writeBits(3, 2);
70+
expect(buffer.data[0]).equals(3);
71+
expect(buffer.bytePtr).equals(0);
72+
expect(buffer.bitPtr).equals(2);
73+
74+
buffer.setPackingDirection(true /** most to least significant */);
75+
expect(buffer.bytePtr).equals(1);
76+
expect(buffer.bitPtr).equals(7);
77+
78+
buffer.writeBits(7, 3);
79+
expect(buffer.data[0]).equals(3);
80+
expect(buffer.data[1]).equals(224);
81+
});
82+
83+
it('throws when switching packing direction and no more bytes left', () => {
84+
buffer.writeBits(0, 25);
85+
expect(() => buffer.setPackingDirection(true)).throws();
86+
});
5087
});
5188

5289
describe('most-to-least-significant bit-packing', () => {
@@ -55,6 +92,7 @@ describe('bitjs.io.BitBuffer', () => {
5592
});
5693

5794
it('bit/byte pointers initialized properly', () => {
95+
expect(buffer.getPackingDirection()).equals(true);
5896
expect(buffer.bytePtr).equals(0);
5997
expect(buffer.bitPtr).equals(7);
6098
})
@@ -84,5 +122,25 @@ describe('bitjs.io.BitBuffer', () => {
84122
expect(Array.from(buffer.data)).to.have.ordered.members(
85123
[0x7f, 0xff, 0xc0, 0x00]);
86124
});
125+
126+
it('properly changes bit-packing direction', () => {
127+
buffer.writeBits(3, 2);
128+
expect(buffer.bytePtr).equals(0);
129+
expect(buffer.bitPtr).equals(5);
130+
expect(buffer.data[0]).equals(192);
131+
132+
buffer.setPackingDirection(false /** least to most significant */);
133+
expect(buffer.bytePtr).equals(1);
134+
expect(buffer.bitPtr).equals(0);
135+
136+
buffer.writeBits(7, 3);
137+
expect(buffer.data[0]).equals(192);
138+
expect(buffer.data[1]).equals(7);
139+
});
140+
141+
it('throws when switching packing direction and no more bytes left', () => {
142+
buffer.writeBits(0, 25);
143+
expect(() => buffer.setPackingDirection(false)).throws();
144+
});
87145
});
88146
});

tests/io-bitstream.spec.js

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,22 @@ describe('bitjs.io.BitStream', () => {
1919
}
2020
});
2121

22-
it('BitPeekAndRead_RTL', () => {
22+
it('throws an error without an ArrayBuffer', () => {
23+
expect(() => new BitStream()).throws();
24+
});
25+
26+
it('BitPeekAndRead_MTL', () => {
2327
const stream = new BitStream(array.buffer, true /* mtl */);
28+
29+
expect(stream.peekBits(0)).equals(0);
30+
expect(stream.peekBits(-1)).equals(0);
31+
expect(stream.bytePtr).equals(0);
32+
expect(stream.bitPtr).equals(0);
33+
2434
// 0110 = 2 + 4 = 6
2535
expect(stream.readBits(4)).equals(6);
36+
expect(stream.getNumBitsRead()).equals(4);
37+
2638
// 0101 011 = 1 + 2 + 8 + 32 = 43
2739
expect(stream.readBits(7)).equals(43);
2840
// 00101 01100101 01 = 1 + 4 + 16 + 128 + 256 + 1024 + 4096 = 5525
@@ -32,11 +44,19 @@ describe('bitjs.io.BitStream', () => {
3244

3345
// Ensure the last bit is read, even if we flow past the end of the stream.
3446
expect(stream.readBits(2)).equals(1);
47+
48+
expect(stream.getNumBitsRead()).equals(33);
3549
});
3650

37-
it('BitPeekAndRead_LTR', () => {
51+
it('BitPeekAndRead_LTM', () => {
52+
/** @type {BitStream} */
3853
const stream = new BitStream(array.buffer, false /* mtl */);
3954

55+
expect(stream.peekBits(0)).equals(0);
56+
expect(stream.peekBits(-1)).equals(0);
57+
expect(stream.bytePtr).equals(0);
58+
expect(stream.bitPtr).equals(0);
59+
4060
// 0101 = 2 + 4 = 6
4161
expect(stream.peekBits(4)).equals(5);
4262
expect(stream.readBits(4)).equals(5);
@@ -69,4 +89,10 @@ describe('bitjs.io.BitStream', () => {
6989

7090
expect(() => stream.readBytes(3)).throws();
7191
});
92+
93+
it('throws an error with weird values of peekBytes()', () => {
94+
/** @type {BitStream} */
95+
const stream = new BitStream(array.buffer);
96+
expect(() => stream.peekBytes(-1)).throws();
97+
});
7298
});

tests/io-bytebuffer.spec.js

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,41 @@
77
*/
88

99
import { ByteBuffer } from '../io/bytebuffer.js';
10-
import { ByteStream } from '../io/bytestream.js';
1110
import 'mocha';
1211
import { expect } from 'chai';
1312

14-
// TODO: Only test ByteBuffer here.
1513
describe('bitjs.io.ByteBuffer', () => {
14+
/** @type {ByteBuffer} */
1615
let buffer;
1716

1817
beforeEach(() => {
1918
buffer = new ByteBuffer(4);
2019
});
2120

22-
it('Write_SingleByte', () => {
21+
it('throws when initialized incorrectly', () => {
22+
expect(() => new ByteBuffer()).throws();
23+
});
24+
25+
it('insertByte()', () => {
26+
buffer.insertByte(192);
27+
expect(buffer.ptr).equals(1);
28+
expect(buffer.data[0]).equals(192);
29+
});
30+
31+
it('writeNumber() with a single unsigned byte', () => {
2332
buffer.writeNumber(192, 1);
2433
expect(buffer.ptr).equals(1);
34+
expect(buffer.data[0]).equals(192);
2535
});
2636

27-
it('Write_SingleByteNegativeNumber', () => {
37+
it('writeNumber() with a single negative number', () => {
2838
buffer.writeSignedNumber(-120, 1);
2939
expect(buffer.ptr).equals(1);
40+
expect(buffer.data[0]).equals(-120 & 0xff);
3041
});
3142

3243
it('Write_MultiByteNumber', () => {
3344
buffer.writeNumber(1234, 4);
34-
const stream = new ByteStream(buffer.data.buffer);
3545
expect(buffer.ptr).equals(4);
3646
});
3747

@@ -51,4 +61,21 @@ describe('bitjs.io.ByteBuffer', () => {
5161
it('WriteOverflowSignedNegative', () => {
5262
expect(() => buffer.writeSignedNumber(-129, 1)).throws();
5363
});
64+
65+
it('throws when trying to write invalid # of bytes', () => {
66+
expect(() => buffer.writeNumber(3, -1)).throws();
67+
expect(() => buffer.writeNumber(-3, 1)).throws();
68+
expect(() => buffer.writeSignedNumber(-3, -1)).throws();
69+
});
70+
71+
it('writes an ASCII string', () => {
72+
buffer.writeASCIIString('hi');
73+
expect(buffer.ptr).equals(2);
74+
expect(buffer.data[0]).equals('h'.charCodeAt(0));
75+
expect(buffer.data[1]).equals('i'.charCodeAt(0));
76+
});
77+
78+
it('throws in a non-ASCII string', () => {
79+
expect(() => buffer.writeASCIIString('Björk')).throws('Trying to write a non-ASCII string');
80+
});
5481
});

tests/io-bytestream.spec.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,35 @@ describe('bitjs.io.ByteStream', () => {
1717
array = new Uint8Array(4);
1818
});
1919

20+
it('throws an error without an ArrayBuffer', () => {
21+
expect(() => new ByteStream()).throws();
22+
expect(() => new ByteStream(array.buffer).push()).throws();
23+
});
24+
25+
it('getNumBytesRead() works', () => {
26+
const stream = new ByteStream(array.buffer);
27+
expect(stream.getNumBytesRead()).equals(0);
28+
stream.readBytes(1);
29+
expect(stream.getNumBytesRead()).equals(1);
30+
stream.readBytes(2);
31+
expect(stream.getNumBytesRead()).equals(3);
32+
});
33+
34+
it('throws when peeking a weird numbers of bytes', () => {
35+
array[0] = 255;
36+
const stream = new ByteStream(array.buffer);
37+
expect(stream.peekNumber(0)).equals(0);
38+
expect(() => stream.peekNumber(-2)).throws();
39+
expect(() => stream.peekNumber(5)).throws();
40+
41+
expect(stream.peekBytes(0).length).equals(0);
42+
expect(() => stream.peekBytes(-1)).throws();
43+
44+
expect(stream.peekString(0)).equals('');
45+
expect(() => stream.peekString(-1)).throws();
46+
expect(() => stream.peekString(5)).throws();
47+
});
48+
2049
it('PeekAndRead_SingleByte', () => {
2150
array[0] = 192;
2251
const stream = new ByteStream(array.buffer);

0 commit comments

Comments
 (0)