42 lines
1.2 KiB
JavaScript
42 lines
1.2 KiB
JavaScript
import {serial as test} from 'ava';
|
|
import delay from 'delay';
|
|
import inRange from 'in-range';
|
|
import timeSpan from 'time-span';
|
|
import m from './';
|
|
|
|
const input = [
|
|
[1, 300],
|
|
[2, 400],
|
|
[3, 200],
|
|
Promise.resolve([4, 100]) // ensures promises work in the input
|
|
];
|
|
|
|
const tester = ([val, ms]) => delay(ms).then(() => val === 2 || val === 3);
|
|
|
|
test('main', async t => {
|
|
const end = timeSpan();
|
|
t.is((await m(input, tester))[0], 2);
|
|
t.true(inRange(end(), 370, 450), 'should be time of item `2`');
|
|
});
|
|
|
|
test('option {preserveOrder:false}', async t => {
|
|
const end = timeSpan();
|
|
t.is((await m(input, tester, {preserveOrder: false}))[0], 3);
|
|
t.true(inRange(end(), 170, 250), 'should be time of item `3`');
|
|
});
|
|
|
|
test('option {concurrency:1}', async t => {
|
|
const end = timeSpan();
|
|
t.is((await m(input, tester, {concurrency: 1}))[0], 2);
|
|
t.true(inRange(end(), 670, 750), 'should be time of items `1` and `2`, since they run serially');
|
|
});
|
|
|
|
test('returns `undefined` when nothing could be found', async t => {
|
|
t.is((await m([1, 2, 3], () => false)), undefined);
|
|
});
|
|
|
|
test('rejected return value in `tester` rejects the promise', async t => {
|
|
const fixtureErr = new Error('fixture');
|
|
await t.throws(m([1, 2, 3], () => Promise.reject(fixtureErr)), fixtureErr.message);
|
|
});
|