summaryrefslogtreecommitdiff
path: root/ui/lib/iterator.test.js
diff options
context:
space:
mode:
Diffstat (limited to 'ui/lib/iterator.test.js')
-rw-r--r--ui/lib/iterator.test.js93
1 files changed, 93 insertions, 0 deletions
diff --git a/ui/lib/iterator.test.js b/ui/lib/iterator.test.js
new file mode 100644
index 0000000..4c55358
--- /dev/null
+++ b/ui/lib/iterator.test.js
@@ -0,0 +1,93 @@
+import * as iter from './iterator.js';
+import { beforeEach, expect, test, describe, it, vi } from 'vitest';
+
+describe('map', async () => {
+ it('applies the mapping function to each item', async () => {
+ const seq = Iterator.from([1, 2, 3, 5, 8]);
+ const mapped = iter.map(seq, (x) => 2 * x);
+ expect(Array.from(mapped)).toStrictEqual([2, 4, 6, 10, 16]);
+ });
+});
+
+describe('reduce', async () => {
+ it('accumulates results and returns them', async () => {
+ const seq = Iterator.from([1, 2, 3, 4]);
+ const reduced = iter.reduce(seq, (sum, x) => sum + x, 0);
+
+ // Good ol' triangle numbers.
+ expect(reduced).toStrictEqual(10);
+ });
+});
+
+describe('chunkBy', async () => {
+ describe('with trivial operand functions', async () => {
+ it('yields nothing for an empty input', async () => {
+ const chunks = iter.chunkBy(
+ [],
+ (val) => val,
+ (last, next) => last === next
+ );
+
+ expect(Array.from(chunks)).toStrictEqual([]);
+ });
+
+ it('yields one chunk input for a singleton input', async () => {
+ const chunks = iter.chunkBy(
+ [37],
+ (val) => val,
+ (last, next) => last === next
+ );
+
+ expect(Array.from(chunks)).toStrictEqual([{ key: 37, chunk: [37] }]);
+ });
+
+ it('yields chunks of successive inputs', async () => {
+ const chunks = iter.chunkBy(
+ [37, 37, 28, 37],
+ (val) => val,
+ (last, next) => last === next
+ );
+
+ expect(Array.from(chunks)).toStrictEqual([
+ { key: 37, chunk: [37, 37] },
+ { key: 28, chunk: [28] },
+ {
+ key: 37,
+ chunk: [37]
+ }
+ ]);
+ });
+ });
+
+ describe('with a complex key function', async () => {
+ it('returns the key with each chunk', async () => {
+ const chunks = iter.chunkBy(
+ [37, 37, 28, 37],
+ (val) => val >> 1,
+ (last, next) => last === next
+ );
+
+ expect(Array.from(chunks)).toStrictEqual([
+ { key: 18, chunk: [37, 37] },
+ { key: 14, chunk: [28] },
+ { key: 18, chunk: [37] }
+ ]);
+ });
+ });
+
+ describe('with a complex coalesce function', async () => {
+ it('continues the chunk when specified', async () => {
+ const chunks = iter.chunkBy(
+ [36, 37, 28, 29, 30, 38],
+ (val) => val,
+ (last, next) => last + 1 === next
+ );
+
+ expect(Array.from(chunks)).toStrictEqual([
+ { key: 37, chunk: [36, 37] },
+ { key: 30, chunk: [28, 29, 30] },
+ { key: 38, chunk: [38] }
+ ]);
+ });
+ });
+});