Skip to content

Commit f5750d3

Browse files
committed
Additional tests
1 parent 981eaad commit f5750d3

File tree

7 files changed

+60
-49
lines changed

7 files changed

+60
-49
lines changed

src/BinaryReader.ts

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,12 @@ export class BinaryReader {
4949
* Trying to set it to value larger than `length` will set it to `length` instead (the end of the stream).
5050
*/
5151
public set position(value: number) {
52-
if (typeof value !== 'number') {
53-
throw new InvalidArgumentError("Cannot set position to a value that is not a number", 'position', value);
54-
55-
} else if (Number.isNaN(value)) {
56-
throw new InvalidArgumentError("Cannot set position to NaN", 'position', value);
57-
58-
} else if (!Number.isFinite(value)) {
59-
throw new InvalidArgumentError("Cannot set position to infinite", 'position', value);
52+
if (
53+
typeof value !== 'number'
54+
|| Number.isNaN(value)
55+
|| !Number.isFinite(value)
56+
) {
57+
throw new InvalidArgumentError("Cannot set position to a non-numeric value", 'position', value);
6058
}
6159

6260
this._position = Math.max(0, Math.min(this._view.length, value));
@@ -106,7 +104,7 @@ export class BinaryReader {
106104
this._view = new Uint8Array(stream);
107105

108106
} else {
109-
throw new InvalidArgumentError("Stream is neither instance of ArrayBuffer nor Uint8Array.", 'stream', stream);
107+
throw new InvalidArgumentError("`stream` must be either an instance of ArrayBuffer or Uint8Array", 'stream', stream);
110108
}
111109

112110
this.endianness = endianness;
@@ -547,10 +545,7 @@ export class BinaryReader {
547545

548546
charactersToRead = Math.floor(charactersToRead);
549547

550-
if (charactersToRead < 1) {
551-
return "";
552-
553-
} else if (this.remainingBytes === 0) {
548+
if (this.remainingBytes === 0) {
554549
throw new EndOfStreamError(EndOfStreamMessageFactory.readCharZeroBytesLeft());
555550
}
556551

@@ -586,10 +581,7 @@ export class BinaryReader {
586581

587582
bytesToRead = Math.floor(bytesToRead);
588583

589-
if (bytesToRead < 1) {
590-
return "";
591-
592-
} else if (this.remainingBytes === 0) {
584+
if (this.remainingBytes === 0) {
593585
throw new EndOfStreamError(EndOfStreamMessageFactory.readCharZeroBytesLeft());
594586
}
595587

src/BinaryWriter.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,11 @@ export class BinaryWriter {
7171
}
7272

7373
public set endianness(value: Endianness) {
74-
if (this._endianness !== value) {
75-
if (!isValidEndianness(value)) {
76-
throw new InvalidArgumentError('`endianness` must be a value from the Endianness enum', 'endianness', value);
77-
}
78-
79-
this._endianness = value;
74+
if (!isValidEndianness(value)) {
75+
throw new InvalidArgumentError('`endianness` must be a value from the Endianness enum', 'endianness', value);
8076
}
77+
78+
this._endianness = value;
8179
}
8280

8381
/**
Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,33 @@
11
import { expect } from 'chai';
22
import { BinaryReader } from "../src";
3-
import { getBufferOfLength } from "./common";
3+
import { getBufferOfLength, getInvalidNumberValues } from "./common";
4+
import { expectInvalidArgument } from './asserts';
45

56
describe("BinaryReader, negative common tests", () => {
67
describe('Constructor', () => {
78
it("Throw exception when receiving invalid constructor", () => {
8-
// @ts-expect-error: Negative scenario checking
9-
expect(() => new BinaryReader(null)).to.throw();
9+
const invalidValues = [
10+
null,
11+
undefined,
12+
{},
13+
[],
14+
false,
15+
true,
16+
0,
17+
"",
18+
"0",
19+
function () { }
20+
];
21+
22+
for (const value of invalidValues) {
23+
expectInvalidArgument(
24+
// @ts-expect-error: Negative scenario checking
25+
() => new BinaryReader(value),
26+
"`stream` must be either an instance of ArrayBuffer or Uint8Array",
27+
'stream',
28+
value
29+
);
30+
}
1031
// @ts-expect-error: Negative scenario checking
1132
expect(() => new BinaryReader(undefined)).to.throw();
1233
// @ts-expect-error: Negative scenario checking
@@ -24,26 +45,19 @@ describe("BinaryReader, negative common tests", () => {
2445

2546
describe('Properties', () => {
2647
describe('set position', () => {
27-
it('Throw an error when setting to non numeric values', () => {
28-
const reader = new BinaryReader(getBufferOfLength(16));
29-
30-
expect(() => reader.position = Number.NaN).to.throw();
31-
expect(() => reader.position = Number.NEGATIVE_INFINITY).to.throw();
32-
expect(() => reader.position = Number.POSITIVE_INFINITY).to.throw();
48+
for (const [name, value] of Object.entries(getInvalidNumberValues())) {
49+
it(`position = ${name}`, () => {
50+
const reader = new BinaryReader(getBufferOfLength(16));
3351

34-
// @ts-expect-error: Negative scenario checking
35-
expect(() => reader.position = null).to.throw();
36-
// @ts-expect-error: Negative scenario checking
37-
expect(() => reader.position = undefined).to.throw();
38-
// @ts-expect-error: Negative scenario checking
39-
expect(() => reader.position = "").to.throw();
40-
// @ts-expect-error: Negative scenario checking
41-
expect(() => reader.position = []).to.throw();
42-
// @ts-expect-error: Negative scenario checking
43-
expect(() => reader.position = {}).to.throw();
44-
// @ts-expect-error: Negative scenario checking
45-
expect(() => reader.position = function () { }).to.throw();
46-
});
52+
expectInvalidArgument(
53+
// @ts-expect-error: Negative scenario checking
54+
() => reader.position = value,
55+
"Cannot set position to a non-numeric value",
56+
'position',
57+
value
58+
);
59+
});
60+
}
4761
});
4862
});
4963
});

test/BinaryReader.negatives.numbers.test.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { BinaryReader, Encoding, EndOfStreamError, InvalidUtf8CharacterError } f
33
import { getBufferArray, getBufferBinary, getBufferHex, getBufferOfLength, getUtf8CharArray } from "./common";
44
import * as Utf8 from "../src/Utf8";
55
import { EndOfStreamMessageFactory, InvalidUtf8CharacterMessageFactory } from "../src/errors/ErrorMessageFactory";
6-
import { InvalidArgumentError } from "../src/errors/InvalidArgumentError";
6+
import { expectInvalidArgument } from './asserts';
77

88
const lead2 = Utf8.leadingByteLength2Prefix;
99
const lead3 = Utf8.leadingByteLength3Prefix;
@@ -426,7 +426,12 @@ describe("BinaryReader, number negative tests", () => {
426426
it("Should fail if trying to read negative bytes", () => {
427427
const reader = new BinaryReader(getBufferOfLength(0));
428428

429-
expect(() => reader.readBytes(-1)).to.throw(InvalidArgumentError);
429+
expectInvalidArgument(
430+
() => reader.readBytes(-1),
431+
'Cannot read less than 0 bytes',
432+
'bytesToRead',
433+
-1
434+
);
430435
});
431436
})
432437
});

test/BinaryReader.negatives.utf8.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ describe("BinaryReader, string UTF-8 encoding negative tests", () => {
268268

269269
describe('InvalidArguments - charactersToRead', () => {
270270
for (const [name, value] of Object.entries(getInvalidNumberValues())) {
271-
it(`readChar(${name}) - throw InvalidArgument exception`, () => {
271+
it(`readChars(${name}) - throw InvalidArgument exception`, () => {
272272
const reader = new BinaryReader(getBufferArray([]));
273273

274274
expectInvalidArgument(

test/BinaryWriter.endianness.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Endianness } from '../src/Endianness';
44
import { arrayToHex } from "./common";
55

66

7-
type ReadNumberTestCase = [(reader: BinaryWriter, value: number) => void, number, number, string|[string, string]];
7+
type ReadNumberTestCase = [(reader: BinaryWriter, value: number) => void, number, number, string | [string, string]];
88
type ReadStringTestCase = [(reader: BinaryWriter, value: string) => void, string, string, string];
99

1010
describe("BinaryWriter, endianness", () => {
@@ -16,6 +16,7 @@ describe("BinaryWriter, endianness", () => {
1616
writeUnsignedInt: [(r, v) => r.writeUnsignedInt(v), 3506438151, 117440721, '07 00 00 D1'],
1717
writeInt: [(r, v) => r.writeInt(v), -788397817, 117506769, '07 01 02 D1'],
1818
writeFloat: [(r, v) => r.writeFloat(v), 3.355545997619629, 1546.6953125, '44 C1 56 40'],
19+
writeFloatNaN: [(r, v) => r.writeFloat(v), Number.NaN, Number.NaN, ['00 00 C0 FF', 'FF C0 00 00']],
1920

2021

2122
// Long stores values larger than float/double precision allows so unlike other tests we need

test/asserts.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export function expectInvalidArgument(callback: () => void, message: string, arg
1010
expect(unknownError).to.instanceOf(InvalidArgumentError);
1111

1212
const err = unknownError as InvalidArgumentError;
13+
expect(err.message).to.equal(message);
1314
expect(err.argumentName).to.equal(argumentName);
1415

1516
if (typeof argumentValue === 'number' && Number.isNaN(argumentValue)) {

0 commit comments

Comments
 (0)