Skip to content

Commit 0fb92a7

Browse files
🧪 test(api): Exhaustive testing of from on small iterables.
1 parent 2eabf53 commit 0fb92a7

File tree

4 files changed

+839
-2045
lines changed

4 files changed

+839
-2045
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
"@iterable-iterator/list": "1.0.1",
7979
"@iterable-iterator/map": "1.0.1",
8080
"@iterable-iterator/range": "2.1.0",
81+
"@iterable-iterator/reduce": "^1.0.1",
8182
"@iterable-iterator/repeat": "1.0.1",
8283
"@iterable-iterator/reversed": "1.0.0",
8384
"@iterable-iterator/tee": "2.0.0",

test/src/_fixtures.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import {map} from '@iterable-iterator/map';
2+
import {reduce} from '@iterable-iterator/reduce';
3+
4+
import {Measures} from '@functional-abstraction/measure';
5+
6+
export const ABSTRACT_COUNTER = Measures.COUNTER;
7+
8+
export const FAST_COUNTER = {
9+
plus(a, b) {
10+
return a + b;
11+
},
12+
measure(_x) {
13+
return 1;
14+
},
15+
zero() {
16+
return 0;
17+
},
18+
};
19+
20+
export const measure = (M, iterable) =>
21+
reduce(M.plus.bind(M), map(M.measure.bind(M), iterable), M.zero());
22+
23+
export const measureToString = (M) => {
24+
switch (M) {
25+
case FAST_COUNTER:
26+
return 'COUNTER(FAST)';
27+
case ABSTRACT_COUNTER:
28+
return 'COUNTER(ABSTRACT)';
29+
default:
30+
throw new Error(`unknown measure ${M.name}`);
31+
}
32+
};
33+
34+
export const iterableToString = (iterable) => iterable.toString();
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import test from 'ava';
2+
3+
import {range} from '@iterable-iterator/range';
4+
import {tee} from '@iterable-iterator/tee';
5+
6+
import {
7+
ABSTRACT_COUNTER as COUNTER,
8+
measure,
9+
measureToString,
10+
iterableToString,
11+
} from '../../_fixtures.js';
12+
13+
import {from} from '../../../../src/index.js';
14+
15+
const cover = (t, M, iterable) => {
16+
const [copy1, copy2, copy3] = tee(iterable, 3);
17+
18+
const tree = from(M, copy1);
19+
20+
const expectedMeasure = measure(M, copy2);
21+
t.is(tree.measure(), expectedMeasure);
22+
23+
const expectedContents = Array.from(copy3);
24+
t.deepEqual(Array.from(tree), expectedContents);
25+
};
26+
27+
cover.title = (title, M, iterable) =>
28+
title ?? `${measureToString(M)} ${iterableToString(iterable)}`;
29+
30+
for (const i of range(145)) {
31+
test(cover, COUNTER, range(i));
32+
}

0 commit comments

Comments
 (0)