Skip to content

Commit

Permalink
Merge e8d7632 into 2170266
Browse files Browse the repository at this point in the history
  • Loading branch information
Smoren committed Mar 9, 2024
2 parents 2170266 + e8d7632 commit 428b3a9
Show file tree
Hide file tree
Showing 3 changed files with 232 additions and 78 deletions.
8 changes: 8 additions & 0 deletions src/views.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ export class ArrayView<T> implements ArrayViewInterface<T> {
return target.length;
}

if (typeof (prop as unknown) === "symbol") {
throw new KeyError(`Invalid key: "${String(prop)}".`);
}

if (typeof prop === "string" && Slice.isSliceString(prop)) {
return this.subview(new SliceSelector(prop)).toArray();
}
Expand All @@ -46,6 +50,10 @@ export class ArrayView<T> implements ArrayViewInterface<T> {
throw new ReadonlyError('Cannot modify a readonly view.');
}

if (typeof (prop as unknown) === "symbol") {
throw new KeyError(`Invalid key: "${String(prop)}".`);
}

if (typeof prop === "string" && Slice.isSliceString(prop)) {
this.subview(new SliceSelector(prop)).set(value);
return true;
Expand Down
79 changes: 1 addition & 78 deletions tests/views/array-view.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { mask, select, slice, view, ArrayView, Slice, IndexError, KeyError } from "../../src";
import { mask, select, slice, view, ArrayView, Slice } from "../../src";

describe.each([
...dataProviderForRead(),
Expand Down Expand Up @@ -39,83 +39,6 @@ function dataProviderForRead(): Array<unknown> {
];
}

describe.each([
...dataProviderForReadIndexError(),
] as Array<[Array<number>, Array<number>]>)(
"Array View Read Index Error Test",
(
source: Array<number>,
indexes: Array<number>,
) => {
it("", () => {
// Given
const v = view(source);

for (let index of indexes) {
try {
// When
v.loc[index];
fail();
} catch (e) {
// Then
expect(e instanceof IndexError).toBe(true);
expect((e as IndexError).message).toEqual(`Index ${index} is out of range.`);
}
}
});
},
);

function dataProviderForReadIndexError(): Array<unknown> {
return [
[[], [-2, -1, 0, 1]],
[[1], [-3, -2, 1, 2]],
[[1, 2, 3], [-100, -5, 4, 100]],
];
}

describe.each([
...dataProviderForReadKeyError(),
] as Array<[Array<number>, Array<string | Symbol>]>)(
"Array View Read Key Error Test",
(
source: Array<number>,
indexes: Array<string | Symbol>,
) => {
it("", () => {
// Given
const v = view(source);

for (let index of indexes) {
try {
// When
// @ts-ignore
v.loc[index];
expect(true).toBe(false);
} catch (e) {
// Then
expect(e instanceof KeyError).toBe(true);
expect((e as KeyError).message).toEqual(`Invalid key: "${String(index)}".`);
}
}
});
},
);

function dataProviderForReadKeyError(): Array<unknown> {
return [
[[], ['']],
[[], ['a', 'b', 'c']],
[[], ['1a', 'test', '!']],
[[1], ['']],
[[1], ['a', 'b', 'c']],
[[1], ['1a', 'test', '!']],
[[1, 2, 3], ['']],
[[1, 2, 3], ['a', 'b', 'c']],
[[1, 2, 3], ['1a', 'test', '!']],
];
}

describe.each([
...dataProviderForWrite(),
] as Array<[Array<number>, Array<number>]>)(
Expand Down
223 changes: 223 additions & 0 deletions tests/views/errors.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
import { view, mask, slice, IndexError, KeyError, LengthError } from "../../src";

describe.each([
...dataProviderForIndexError(),
] as Array<[Array<number>, Array<number>]>)(
"Array View Read Index Error Test",
(
source: Array<number>,
indexes: Array<number>,
) => {
it("", () => {
// Given
const v = view(source);

for (let index of indexes) {
try {
// When
v.loc[index];
fail();
} catch (e) {
// Then
expect(e instanceof IndexError).toBe(true);
expect((e as IndexError).message).toEqual(`Index ${index} is out of range.`);
}
}
});
},
);

describe.each([
...dataProviderForIndexError(),
] as Array<[Array<number>, Array<number>]>)(
"Array View Write Index Error Test",
(
source: Array<number>,
indexes: Array<number>,
) => {
it("", () => {
// Given
const v = view(source);

for (let index of indexes) {
try {
// When
v.loc[index] = 1;
fail();
} catch (e) {
// Then
expect(e instanceof IndexError).toBe(true);
expect((e as IndexError).message).toEqual(`Index ${index} is out of range.`);
}
}
});
},
);

function dataProviderForIndexError(): Array<unknown> {
return [
[[], [-2, -1, 0, 1]],
[[1], [-3, -2, 1, 2]],
[[1, 2, 3], [-100, -5, 4, 100]],
];
}

describe.each([
...dataProviderForKeyError(),
] as Array<[Array<number>, Array<string | Symbol>]>)(
"Array View Read Key Error Test",
(
source: Array<number>,
indexes: Array<string | Symbol>,
) => {
it("", () => {
// Given
const v = view(source);

for (let index of indexes) {
try {
// When
// @ts-ignore
v.loc[index];
expect(true).toBe(false);
} catch (e) {
// Then
expect(e instanceof KeyError).toBe(true);
expect((e as KeyError).message).toEqual(`Invalid key: "${String(index)}".`);
}
}
});
},
);

describe.each([
...dataProviderForKeyError(),
] as Array<[Array<number>, Array<string | Symbol>]>)(
"Array View Write Key Error Test",
(
source: Array<number>,
indexes: Array<string | Symbol>,
) => {
it("", () => {
// Given
const v = view(source);

for (let index of indexes) {
try {
// When
// @ts-ignore
v.loc[index] = 1;
expect(true).toBe(false);
} catch (e) {
// Then
expect(e instanceof KeyError).toBe(true);
expect((e as KeyError).message).toEqual(`Invalid key: "${String(index)}".`);
}
}
});
},
);

function dataProviderForKeyError(): Array<unknown> {
return [
[[], ['']],
[[], ['a', 'b', 'c']],
[[], ['1a', 'test', '!']],
[[], [Symbol(''), Symbol('test')]],
[[1], ['']],
[[1], ['a', 'b', 'c']],
[[1], ['1a', 'test', '!']],
[[1], [Symbol(''), Symbol('test')]],
[[1, 2, 3], ['']],
[[1, 2, 3], ['a', 'b', 'c']],
[[1, 2, 3], ['1a', 'test', '!']],
[[1, 2, 3], [Symbol(''), Symbol('test')]],
];
}

describe.each([
...dataProviderForMaskViewReadLengthError(),
] as Array<[Array<number>, Array<boolean>]>)(
"Mask View Read Length Error Test",
(
source: Array<number>,
boolMask: Array<boolean>,
) => {
it("", () => {
// Given
const v = view(source);

try {
// When
v.subview(mask(boolMask));
expect(true).toBe(false);
} catch (e) {
// Then
expect(e instanceof LengthError).toBe(true);
expect((e as LengthError).message).toEqual(`Mask length not equal to source length (${boolMask.length} != ${source.length}).`);
}
});
},
);

function dataProviderForMaskViewReadLengthError(): Array<unknown> {
return [
[[], [1]],
[[1], []],
[[1], [1, 0]],
[[1, 2, 3], [1]],
[[1, 2, 3], [0]],
[[1, 2, 3], [0, 1]],
[[1, 2, 3], [0, 1, 1, 0]],
[[1, 2, 3], [1, 1, 1, 1, 1]],
[[1, 2, 3], [0, 0, 0, 0, 0]],
];
}

describe.each([
...dataProviderForSliceViewLocReadIndexError(),
] as Array<[Array<number>, string, Array<number>]>)(
"Slice View Loc Read Index Error Test",
(
source: Array<number>,
config: string,
) => {
it("", () => {
// Given
const v = view(source);

try {
// When
v.subview(slice(config));
expect(true).toBe(false);
} catch (e) {
// Then
expect(e instanceof IndexError).toBe(true);
expect((e as IndexError).message).toEqual("Step cannot be 0.");
}
});
},
);

function dataProviderForSliceViewLocReadIndexError(): Array<unknown> {
return [
[[], '::0'],
[[], '0:0:0'],
[[], '0:1:0'],
[[], '0::0'],
[[], ':-1:0'],
[[], '1:-1:0'],
[[1], '::0'],
[[1], '0:0:0'],
[[1], '0:1:0'],
[[1], '0::0'],
[[1], ':-1:0'],
[[1], '1:-1:0'],
[[1, 2, 3], '::0'],
[[1, 2, 3], '0:0:0'],
[[1, 2, 3], '0:1:0'],
[[1, 2, 3], '0::0'],
[[1, 2, 3], ':-1:0'],
[[1, 2, 3], '1:-1:0'],
];
}

0 comments on commit 428b3a9

Please sign in to comment.