iterize
Version:
Use JavaScript Iterator, Easily
83 lines (74 loc) • 3.32 kB
text/typescript
import {expect} from 'chai';
import { range, take, cycle, repeat, takeWhile } from '../src';
import {iterDone, iterResult} from './utility';
describe('Test Take API', () => {
describe('Default case', () => {
it('range type', () => {
const rangeIterator = range(0, 5, 2);
const iter = take(2, rangeIterator);
expect(iter.next()).to.deep.equal(iterResult(0));
expect(iter.next()).to.deep.equal(iterResult(2));
expect(iter.next()).to.deep.equal(iterDone());
});
it('cycle type', () => {
const cycleIterator = cycle([1, 2, 3]);
const iter = take(5, cycleIterator);
expect(iter.next()).to.deep.equal(iterResult(1));
expect(iter.next()).to.deep.equal(iterResult(2));
expect(iter.next()).to.deep.equal(iterResult(3));
expect(iter.next()).to.deep.equal(iterResult(1));
expect(iter.next()).to.deep.equal(iterResult(2));
expect(iter.next()).to.deep.equal(iterDone());
});
it('repeat type', () => {
const repeatIterator = repeat(0, 2);
const iter = take(2, repeatIterator);
expect(iter.next()).to.deep.equal(iterResult(0));
expect(iter.next()).to.deep.equal(iterResult(0));
expect(iter.next()).to.deep.equal(iterDone());
});
});
describe('takewhile', () => {
it('range type', () => {
const rangeIterator = range(5);
const iter = takeWhile((x: any) => x < 3, rangeIterator);
expect(iter.next()).to.deep.equal(iterResult(0));
expect(iter.next()).to.deep.equal(iterResult(1));
expect(iter.next()).to.deep.equal(iterResult(2));
expect(iter.next()).to.deep.equal(iterDone());
});
it('cycle type', () => {
const cycleIterator = cycle([1, 2, 3]);
const iter = takeWhile((x: any) => x === 1, cycleIterator);
expect(iter.next()).to.deep.equal(iterResult(1));
expect(iter.next()).to.deep.equal(iterResult(1));
expect(iter.next()).to.deep.equal(iterResult(1));
expect(iter.next()).to.deep.equal(iterResult(1));
});
});
describe('Default case: Compatibility with language specifications', () => {
it('for - of', () => {
const cycleIterator = cycle([1, 2, 3]);
const tobe = [1, 2, 3, 1, 2];
const result = [];
for (let n of take(5, cycleIterator)) {
result.push(n);
}
expect(result).to.deep.equal(tobe);
});
it('[...iterator]', () => {
const tobe = [1, 2, 3, 1, 2];
const cycleIterator = cycle([1, 2, 3]);
let numbers = [...take(5, cycleIterator)];
expect(numbers).to.deep.equal(tobe);
});
});
describe('Edge case', () => {
it('illegal input parameter', () => {
expect(() => take(5, <any>5).next()).to.throw();
expect(() => take(<any>'a', cycle([1, 2, 3])).next()).to.throw();
expect(() => takeWhile(<any>5, cycle([1, 2, 3])).next()).to.throw();
expect(() => takeWhile(<any>'a', cycle([1, 2, 3])).next()).to.throw();
});
});
});