Skip to content

Commit af7387a

Browse files
☔ test(concat/append): Prevent regression.
1 parent 2232458 commit af7387a

File tree

6 files changed

+146
-5
lines changed

6 files changed

+146
-5
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
"@iterable-iterator/reversed": "1.0.0",
8484
"@iterable-iterator/tee": "2.0.0",
8585
"@js-library/commitlint-config": "0.0.4",
86+
"@set-theory/cartesian-product": "^2.0.1",
8687
"ava": "3.15.0",
8788
"babel-plugin-transform-remove-console": "6.9.4",
8889
"babel-plugin-unassert": "3.2.0",

test/src/_fixtures.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import {map} from '@iterable-iterator/map';
22
import {reduce} from '@iterable-iterator/reduce';
3+
import {reversed} from '@iterable-iterator/reversed';
34

45
import {Measures} from '@functional-abstraction/measure';
56

7+
import {empty} from '../../src/index.js';
8+
69
export const ABSTRACT_COUNTER = Measures.COUNTER;
710

811
export const FAST_COUNTER = {
@@ -32,3 +35,18 @@ export const measureToString = (M) => {
3235
};
3336

3437
export const iterableToString = (iterable) => iterable.toString();
38+
39+
export const fromToString = (measure, iterable) =>
40+
`from(${measureToString(measure)}, ${iterableToString(iterable)})`;
41+
42+
export const fromLeft = (M, iterable) => {
43+
let tree = empty(M);
44+
for (const x of iterable) tree = tree.push(x);
45+
return tree;
46+
};
47+
48+
export const fromRight = (M, iterable) => {
49+
let tree = empty(M);
50+
for (const x of reversed(iterable)) tree = tree.cons(x);
51+
return tree;
52+
};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import test from 'ava';
2+
3+
import {range} from '@iterable-iterator/range';
4+
import {product} from '@set-theory/cartesian-product';
5+
6+
import {
7+
ABSTRACT_COUNTER as COUNTER,
8+
fromToString as f,
9+
fromRight,
10+
fromLeft,
11+
} from '../../../_fixtures.js';
12+
13+
const cover = (t, M, A, B) => {
14+
const left = fromLeft(M, A);
15+
const right = fromRight(M, B);
16+
const tree = left.concat(right);
17+
const expected = Array.from(A).concat(Array.from(B));
18+
t.is(tree.measure(), expected.length);
19+
t.deepEqual(Array.from(tree), expected);
20+
};
21+
22+
cover.title = (title, M, A, B) => title ?? `${f(M, A)}.concat(${f(M, B)})`;
23+
24+
for (const [m, n] of product([range(62)], 2)) {
25+
test(cover, COUNTER, range(m), range(n));
26+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import test from 'ava';
2+
3+
import {range} from '@iterable-iterator/range';
4+
5+
import {ABSTRACT_COUNTER as COUNTER} from '../../../../_fixtures.js';
6+
7+
import {from} from '../../../../../../src/index.js';
8+
9+
test('empty', (t) => {
10+
const r0 = range(0);
11+
const r200 = range(200);
12+
let tree = from(COUNTER, r200);
13+
tree = tree.append(r0);
14+
t.deepEqual(Array.from(tree), Array.from(r200).concat(Array.from(r0)));
15+
t.is(tree.measure(), 200);
16+
});
17+
18+
test('range(1)', (t) => {
19+
const r1 = range(1);
20+
const r200 = range(200);
21+
let tree = from(COUNTER, r200);
22+
tree = tree.append(r1);
23+
t.deepEqual(Array.from(tree), Array.from(r200).concat(Array.from(r1)));
24+
t.is(tree.measure(), 201);
25+
});
26+
27+
test('r200', (t) => {
28+
const r200 = range(200);
29+
let tree = from(COUNTER, r200);
30+
tree = tree.append(r200);
31+
t.deepEqual(Array.from(tree), Array.from(r200).concat(Array.from(r200)));
32+
t.is(tree.measure(), 400);
33+
});
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import test from 'ava';
2+
3+
import {range} from '@iterable-iterator/range';
4+
5+
import {ABSTRACT_COUNTER as COUNTER} from '../../../../_fixtures.js';
6+
7+
import {from} from '../../../../../../src/index.js';
8+
9+
test('empty', (t) => {
10+
let tree = from(COUNTER, range(1));
11+
tree = tree.append(range(0));
12+
t.deepEqual(
13+
Array.from(tree),
14+
Array.from(range(1)).concat(Array.from(range(0))),
15+
);
16+
t.is(tree.measure(), 1);
17+
});
18+
19+
test('range(1)', (t) => {
20+
let tree = from(COUNTER, range(1));
21+
tree = tree.append(range(1));
22+
t.deepEqual(
23+
Array.from(tree),
24+
Array.from(range(1)).concat(Array.from(range(1))),
25+
);
26+
t.is(tree.measure(), 2);
27+
});
28+
29+
test('range(200)', (t) => {
30+
let tree = from(COUNTER, range(1));
31+
tree = tree.append(range(200));
32+
t.deepEqual(
33+
Array.from(tree),
34+
Array.from(range(1)).concat(Array.from(range(200))),
35+
);
36+
t.is(tree.measure(), 201);
37+
});

yarn.lock

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,6 +1137,13 @@
11371137
resolved "https://registry.yarnpkg.com/@data-structure-algebra/singly-linked-list/-/singly-linked-list-0.0.1.tgz#4360458718d92dc569cfc40c91df99c42ae2f4a3"
11381138
integrity sha512-FuerF4/f8HZ99KE0zLzZs1dyHjgbugo6EhcVHkbHPNSIAQdzZkfUoGch4N/l+i5SU1ziW8BmsnYkKnFxCsWoNQ==
11391139

1140+
"@data-structure/deque@^9.0.0":
1141+
version "9.0.1"
1142+
resolved "https://registry.yarnpkg.com/@data-structure/deque/-/deque-9.0.1.tgz#756f8a80d5bc3fe2be18a5739d051493397a6367"
1143+
integrity sha512-/LSOEPmWGZ10OiKfje06GNDM/fzbY1ZfXyvZKr+/a79ZTlGoTwsQW1uPvtmQDtBzs2h2VbPjHho4zNSP5YH0Zg==
1144+
dependencies:
1145+
"@failure-abstraction/error" "^6.0.1"
1146+
11401147
"@endemolshinegroup/cosmiconfig-typescript-loader@^3.0.2":
11411148
version "3.0.2"
11421149
resolved "https://registry.yarnpkg.com/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz#eea4635828dde372838b0909693ebd9aafeec22d"
@@ -1201,27 +1208,32 @@
12011208
resolved "https://registry.yarnpkg.com/@iterable-iterator/chain/-/chain-2.0.1.tgz#b02068df99408ac94c446f895b4e985eb0cd1938"
12021209
integrity sha512-mWd0nx1knSaJ6kcysBFtjcQd18iBaDgY0Rlr6crcBg11cMwVRkjaz56w2gBTe6No9JmoYOwsXxPNWpAeF7eAoA==
12031210

1204-
"@iterable-iterator/count@^1.0.1":
1211+
"@iterable-iterator/count@^1.0.0", "@iterable-iterator/count@^1.0.1":
12051212
version "1.0.1"
12061213
resolved "https://registry.yarnpkg.com/@iterable-iterator/count/-/count-1.0.1.tgz#37c13ff5cb43528280fcf0c2c0791475ebff4cf2"
12071214
integrity sha512-nLBcrNownYvXgye2CVnQvTjZ5d3C2b/5nrySDvQ9/7ej5pGSfkvYvIl4xcZcocViwIa49p6/72nkcDC1xkvpJg==
12081215

1216+
"@iterable-iterator/cycle@^1.0.0":
1217+
version "1.0.0"
1218+
resolved "https://registry.yarnpkg.com/@iterable-iterator/cycle/-/cycle-1.0.0.tgz#1cdb2e4a72c54e351145b23af31b4a1bb2919e0d"
1219+
integrity sha512-mJevpq7it2NEQ44c24Do2tg6O/Mvzpyo5ydHpqhT1+R1/VTc21Spw6bKio87Fnfz5fdCJ5pQQY+Ey2gdj8b3hw==
1220+
12091221
"@iterable-iterator/iter@^1.0.1":
12101222
version "1.0.1"
12111223
resolved "https://registry.yarnpkg.com/@iterable-iterator/iter/-/iter-1.0.1.tgz#11149acef0d28b689e0b998dc478113eda81871d"
12121224
integrity sha512-/C/Ciq69we9C0wvqx0rOdnpXAoSW+UnyIV/ZQrUYDzmtguvUQ4HjiIPcU2Csdh705VS6TMkUhoaBHIGh44V3OA==
12131225

1214-
"@iterable-iterator/[email protected]", "@iterable-iterator/list@^1.0.1":
1226+
"@iterable-iterator/[email protected]", "@iterable-iterator/list@^1.0.0", "@iterable-iterator/list@^1.0.1":
12151227
version "1.0.1"
12161228
resolved "https://registry.yarnpkg.com/@iterable-iterator/list/-/list-1.0.1.tgz#e84fd841d7d58c2ad6d0c026f0612c8228dc97f5"
12171229
integrity sha512-234a2cf0a0YhD1Ofb3F0xSjXDkqDK1xCiLnXoMUt/DWAt/odAvJToaxEFMemiKlAUvqF6E8MSi2v2UvlIOpBUA==
12181230

1219-
"@iterable-iterator/[email protected]", "@iterable-iterator/map@^1.0.1":
1231+
"@iterable-iterator/[email protected]", "@iterable-iterator/map@^1.0.0", "@iterable-iterator/map@^1.0.1":
12201232
version "1.0.1"
12211233
resolved "https://registry.yarnpkg.com/@iterable-iterator/map/-/map-1.0.1.tgz#7e4d82cb86877bf487e075347fde990ed21844da"
12221234
integrity sha512-lUvX8/OCYRdof3eZii8ntJUvqW1MlL2ESkIcQj3cagajKVfBIBj058wE4ScrzQl6U2udMva/n2NwP70smdfZ+g==
12231235

1224-
"@iterable-iterator/next@^2.0.1":
1236+
"@iterable-iterator/next@^2.0.0", "@iterable-iterator/next@^2.0.1":
12251237
version "2.0.1"
12261238
resolved "https://registry.yarnpkg.com/@iterable-iterator/next/-/next-2.0.1.tgz#b58a7471984cd1165e3b93e3fea646f4137b370f"
12271239
integrity sha512-D4E5JSH7xFEQqmJI8XMaotest1L1RM6wJssEDFRva81oZNZwPYmTlKErPZZVLnrZU/wTflEVwrImxUacoIZK3Q==
@@ -1245,7 +1257,7 @@
12451257
resolved "https://registry.yarnpkg.com/@iterable-iterator/repeat/-/repeat-1.0.1.tgz#7724b993a80c014483c4f0d37c503ee460ac7b6d"
12461258
integrity sha512-xwkIHYQNvxQvA8nMYrev41iCmokXosojMpHEfME8Q8ubzEQlsYS8rSqiydgMYPu/lPg1MyYRVzWazFDAShTwtg==
12471259

1248-
"@iterable-iterator/[email protected]":
1260+
"@iterable-iterator/[email protected]", "@iterable-iterator/reversed@^1.0.0":
12491261
version "1.0.0"
12501262
resolved "https://registry.yarnpkg.com/@iterable-iterator/reversed/-/reversed-1.0.0.tgz#6e656396b4453e4650c081d571fa4ba7ab3134e8"
12511263
integrity sha512-nCy0OINBy6h1dcj75twbIW0oA5KhJ7Aweif/8kdUdAR86e5gb/byedt0LL72cjHB75VRbQY06f9WxZc8d7uPYA==
@@ -1362,6 +1374,20 @@
13621374
dependencies:
13631375
any-observable "^0.3.0"
13641376

1377+
"@set-theory/cartesian-product@^2.0.1":
1378+
version "2.0.1"
1379+
resolved "https://registry.yarnpkg.com/@set-theory/cartesian-product/-/cartesian-product-2.0.1.tgz#5b80994ae53e4c80e369c78cb369845de18d229c"
1380+
integrity sha512-ifjwAGPY52Dvmtm1jQV+6jEdHlKg9nMCnogb96YtbckUN9uESDK8slMRy0nQHFGf61i1kjVNGKMzOrGzFZJZkw==
1381+
dependencies:
1382+
"@data-structure/deque" "^9.0.0"
1383+
"@iterable-iterator/count" "^1.0.0"
1384+
"@iterable-iterator/cycle" "^1.0.0"
1385+
"@iterable-iterator/iter" "^1.0.1"
1386+
"@iterable-iterator/list" "^1.0.0"
1387+
"@iterable-iterator/map" "^1.0.0"
1388+
"@iterable-iterator/next" "^2.0.0"
1389+
"@iterable-iterator/reversed" "^1.0.0"
1390+
13651391
"@sindresorhus/is@^0.14.0":
13661392
version "0.14.0"
13671393
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"

0 commit comments

Comments
 (0)