asclasit
Version:
ASync CLasses + ASync ITerators
157 lines (133 loc) • 4.93 kB
JavaScript
const Iter = require('./make');
test('Iter.void: void iterator', () => {
const wrapped = Iter.void();
expect(wrapped instanceof Iter).toBe(true);
expect(Array.from(wrapped)).toEqual([]);
});
test('Iter.shim: compatible iterator', () => {
const src = {arr: [1, 2, 3], next() {
return {done: !this.arr.length, value: this.arr.pop()};
}};
expect(Array.from(Iter.shim(src))).toEqual([3, 2, 1]);
});
test('Iter.concat: concatenate iterators', () => {
const i1 = ['a1', 'a2'];
const i2 = function* () { yield 'a4'; yield 'a5'; } ();
const i3 = new Iter(['a6', 'a7'][Symbol.iterator]());
const concat = Iter.concat(i1, 3, {a: 1}, i2, i3);
expect(Array.from(concat)).toEqual(['a1', 'a2', 3, ['a', 1], 'a4', 'a5', 'a6', 'a7']);
});
test('Iter.prepend: concatenate iterators reversed', () => {
const i1 = ['a1', 'a2'];
const i2 = function* () { yield 'a4'; yield 'a5'; } ();
const i3 = new Iter(['a6', 'a7'][Symbol.iterator]());
const concat = Iter.prepend(i1, 3, {a: 1}, i2, i3);
expect(Array.from(concat)).toEqual(['a6', 'a7', 'a4', 'a5', ['a', 1], 3, 'a1', 'a2']);
});
test('Iter.range: 1 arg (x): [0 ... +1 ... x)', () => {
const wrapped = Iter.range(5);
expect(wrapped instanceof Iter).toBe(true);
expect(Array.from(wrapped)).toEqual([0, 1, 2, 3, 4]);
});
test('Iter.range: 2 args asc (x, y): [x ... +1 ... y)', () => {
const wrapped = Iter.range(2, 7);
expect(wrapped instanceof Iter).toBe(true);
expect(Array.from(wrapped)).toEqual([2, 3, 4, 5, 6]);
});
test('Iter.range: 2 args desc (x, y): [x ... -1 ... y)', () => {
const wrapped = Iter.range(14, 10);
expect(wrapped instanceof Iter).toBe(true);
expect(Array.from(wrapped)).toEqual([14, 13, 12, 11]);
});
test('Iter.range: 3 args asc (x, y, d): [x ... +d ... y)', () => {
const wrapped = Iter.range(2, 7, 2);
expect(wrapped instanceof Iter).toBe(true);
expect(Array.from(wrapped)).toEqual([2, 4, 6]);
});
test('Iter.range: 3 args desc (x, y, d): [x ... +d ... y)', () => {
const wrapped = Iter.range(14, 10, -3);
expect(wrapped instanceof Iter).toBe(true);
expect(Array.from(wrapped)).toEqual([14, 11]);
});
test('Iter.fork: 1 fork', () => {
const src = Iter.from([1, 2, 3]);
const fork1 = src.fork();
expect(Array.from(fork1)).toEqual([1, 2, 3]);
expect(Array.from(src)).toEqual([]);
});
test('Iter.repeat: repeat iterable', () => {
expect(Array.from(Iter.repeat([1, 2, 3], 3))).toEqual([1, 2, 3, 1, 2, 3, 1, 2, 3]);
});
test('Iter.repeat: repeat characters', () => {
expect(Array.from(Iter.repeat('123', 3, true))).toEqual(['1', '2', '3', '1', '2', '3', '1', '2', '3']);
});
test('Iter.reverse: iterate backwards', () => {
const src = [1, 2, 3, 4, 5];
const rev = Iter.from(src).reverse();
expect(Array.from(rev)).toEqual([5, 4, 3, 2, 1]);
});
test('Iter.fork: 2 forks', () => {
const src = Iter.from([1, 2, 3]);
const fork1 = src.fork();
const fork2 = src.fork();
expect(Array.from(fork1)).toEqual([1, 2, 3]);
expect(Array.from(fork2)).toEqual([1, 2, 3]);
expect(Array.from(src)).toEqual([]);
});
test('Iter.fork: 3 forks with 1 chained', () => {
const src = Iter.from([1, 2, 3]);
const fork1 = src.fork();
const fork2 = src.fork();
const fork3 = fork2.fork();
expect(Array.from(fork1)).toEqual([1, 2, 3]);
expect(Array.from(fork2)).toEqual([1, 2, 3]);
expect(Array.from(fork3)).toEqual([1, 2, 3]);
expect(Array.from(src)).toEqual([]);
});
test('Iter.fork: 2 forks: mixed pipeline', () => {
const src = Iter.from([1, 2, 3]);
const fork1 = src.fork();
const fork2 = src.fork();
expect(fork1.read()).toBe(1);
expect(Array.from(fork2)).toEqual([1, 2, 3]);
expect(Array.from(fork1)).toEqual([2, 3]);
expect(Array.from(src)).toEqual([]);
});
test('Iter.fork: 3 forks: one broken', () => {
const src = Iter.from([1, 2, 3]);
const fork1 = src.fork();
const fork2 = src.fork();
const fork3 = src.fork();
expect(fork1.read()).toBe(1);
expect(Array.from(fork2)).toEqual([1, 2, 3]);
expect(Array.from(fork3)).toEqual([1, 2, 3]);
fork1.return();
expect(Array.from(src)).toEqual([]);
});
test('Iter.fork: 1 fork: break limit ok', () => {
const src = Iter.from([1, 2, 3]);
const fork1 = src.fork(2);
expect(Array.from(fork1)).toEqual([1, 2, 3]);
expect(Array.from(src)).toEqual([]);
});
test('Iter.fork: 2 forks', () => {
const src = Iter.from([1, 2, 3]);
const fork1 = src.fork(2);
const fork2 = src.fork(2);
let error;
try {
Array.from(fork1);
} catch (err) {
error = err;
}
expect(error instanceof Iter.ForkBufferLimitExceededError).toBe(true);
expect(Array.from(src)).toEqual([3]);
});
test('Iter.fork: 2 raw forks', () => {
const src = function* () { yield 1; yield 2; yield 3; } ();
const fork1 = Iter.fork(src);
const fork2 = Iter.fork(src);
expect(Array.from(fork1)).toEqual([1, 2, 3]);
expect(Array.from(fork2)).toEqual([1, 2, 3]);
expect(Array.from(src)).toEqual([]);
});