Skip to content

Commit

Permalink
🐛 with tests
Browse files Browse the repository at this point in the history
  • Loading branch information
wolfram77 committed May 10, 2023
1 parent 1d56b67 commit c50c9bb
Show file tree
Hide file tree
Showing 4 changed files with 250 additions and 12 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "extra-array-view",
"version": "0.0.16",
"version": "0.0.17",
"description": "An array view is a proxy to an underlying array.",
"main": "index.js",
"module": "index.mjs",
Expand Down
17 changes: 9 additions & 8 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class RawArrayView<T> {
// -------------

/** Get iterator to iterate through values. */
get [Symbol.iterator](): IterableIterator<T> {
[Symbol.iterator](): IterableIterator<T> {
return this.base.slice(this.begin, this.end)[Symbol.iterator]();
}

Expand Down Expand Up @@ -117,7 +117,7 @@ class RawArrayView<T> {
* @returns this[i]
*/
get(i: number): T {
return this.base[this.begin + i];
if (i>=0 && i<this.length) return this.base[this.begin + i];
}


Expand All @@ -127,7 +127,7 @@ class RawArrayView<T> {
* @returns this[i]
*/
at(i: number): T {
return this.base[this.index(i)];
if (i>=-this.length && i<this.length) return this.base[this.index(i)];
}


Expand All @@ -137,7 +137,7 @@ class RawArrayView<T> {
* @param v value
*/
set(i: number, v: T): void {
this.base[this.begin + i] = v;
if (i>=0 && i<this.length) this.base[this.begin + i] = v;
}


Expand Down Expand Up @@ -527,12 +527,13 @@ export function fromArray<T>(x: T[], i: number=0, I: number=x.length): T[] {
var y = new RawArrayView(x, i, I);
return new Proxy<T[]>(x, {
get(_, k) {
if (isFinite(k as any)) { return y.get(Number(k)); }
return y[k];
if (typeof k==="symbol" || !isFinite(k as any)) return y[k];
return y.get(Number(k));
},
set(_, k, v) {
if (typeof k==="number") y.set(k, v);
return false;
if (typeof k==="symbol" || !isFinite(k as any)) return false;
y.set(Number(k), v);
return true;
},
ownKeys(x) {
return Reflect.ownKeys(x);
Expand Down
239 changes: 238 additions & 1 deletion tests/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,242 @@ import {
// #region ABOUT
// -------------

test("NA", () => {});
test("Symbol.iterator", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
var a = y[Symbol.iterator]();
expect([...a]).toEqual([40, 30, 20]);
});


test("keys", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
var a = y.keys();
expect([...a]).toEqual([0, 1, 2]);
});


test("values", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
var a = y.values();
expect([...a]).toEqual([40, 30, 20]);
});


test("entries", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
var a = y.entries();
expect([...a]).toEqual([[0, 40], [1, 30], [2, 20]]);
});
// #endregion




// #region LENGTH
// --------------

test("length", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
expect(y.length).toBe(3);
});
// #endregion




// #region GET/SET
// ---------------

test("get[]", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
expect(y[0]).toBe(40);
expect(y[1]).toBe(30);
expect(y[2]).toBe(20);
expect(y[ 3]).toBeUndefined();
expect(y[-1]).toBeUndefined();
});


test("at()", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
expect(y.at(0)).toBe(40);
expect(y.at(1)).toBe(30);
expect(y.at(2)).toBe(20);
expect(y.at(-1)).toBe(20);
expect(y.at( 3)).toBeUndefined();
expect(y.at(-4)).toBeUndefined();
});


test("set[]", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
y[0] = 41;
y[1] = 31;
y[2] = 21;
expect(x).toEqual([10, 41, 31, 21, 50]);
});
// #endregion




// #region SORT
// ------------

test("sort", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
y.sort();
expect(y).toEqual([20, 30, 40]);
expect(x).toEqual([10, 20, 30, 40, 50]);
});
// #endregion




// #region PART
// ------------

test("slice", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
expect(y.slice(0, 1)).toEqual([40]);
expect(y.slice(0, 2)).toEqual([40, 30]);
expect(y.slice(0, -1)).toEqual([40, 30]);
});
// #endregion




// #region FIND
// ------------

test("find", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
expect(y.find(v => v<40)).toBe(30);
expect(y.find(v => v<20)).toBeUndefined();
});
// #endregion




// #region SEARCH
// --------------

test("findIndex", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
expect(y.findIndex(v => v<40)).toBe(1);
expect(y.findIndex(v => v<20)).toBe(-1);
});
// #endregion




// #region SEARCH VALUE
// --------------------

test("includes", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
expect(y.includes(30)).toBe(true);
expect(y.includes(20)).toBe(true);
expect(y.includes(10)).toBe(false);
});


test("indexOf", () => {
var x = [10, 40, 30, 20, 50];
var y = fromArray(x, 1, 4);
expect(y.indexOf(30)).toBe(1);
expect(y.indexOf(20)).toBe(2);
expect(y.indexOf(10)).toBe(-1);
});


test("lastIndexOf", () => {
var x = [10, 40, 30, 20, 40];
var y = fromArray(x, 1, 4);
expect(y.lastIndexOf(30)).toBe(1);
expect(y.lastIndexOf(20)).toBe(2);
expect(y.lastIndexOf(10)).toBe(-1);
});
// #endregion




// #region FUNCTIONAL
// ------------------

test("forEach", () => {
var x = [10, 40, 30, 20, 40];
var y = fromArray(x, 1, 4);
var a: number[] = [];
y.forEach(v => a.push(v));
expect(a).toEqual([40, 30, 20]);
});


test("some", () => {
var x = [10, 40, 30, 20, 40];
var y = fromArray(x, 1, 4);
expect(y.some(v => v<40)).toBe(true);
expect(y.some(v => v<30)).toBe(true);
expect(y.some(v => v<20)).toBe(false);
});


test("every", () => {
var x = [10, 40, 30, 20, 40];
var y = fromArray(x, 1, 4);
expect(y.every(v => v<50)).toBe(true);
expect(y.every(v => v<40)).toBe(false);
expect(y.every(v => v<30)).toBe(false);
});


test("map", () => {
var x = [10, 40, 30, 20, 40];
var y = fromArray(x, 1, 4);
var a = y.map(v => v+1);
expect(a).toEqual([41, 31, 21]);
});


test("reduce", () => {
var x = [10, 40, 30, 20, 40];
var y = fromArray(x, 1, 4);
var a = y.reduce((a, v) => a+v, 0);
expect(a).toBe(90);
});


test("reduceRight", () => {
var x = [10, 40, 30, 20, 40];
var y = fromArray(x, 1, 4);
var a = y.reduceRight((a, v) => a+v, 0);
expect(a).toBe(90);
});


test("filter", () => {
var x = [10, 40, 30, 20, 40];
var y = fromArray(x, 1, 4);
var a = y.filter(v => v<40);
expect(a).toEqual([30, 20]);
});
// #endregion

0 comments on commit c50c9bb

Please sign in to comment.