|
|
import tape = require("tape");
|
|
|
import { delay } from "./TestTraits";
|
|
|
import { Cancellation } from "@implab/core/Cancellation";
|
|
|
import { first, isPromise } from "@implab/core/safe";
|
|
|
|
|
|
tape("await delay test", async t => {
|
|
|
// schedule delay
|
|
|
let resolved = false;
|
|
|
let res = delay(0).then(() => resolved = true);
|
|
|
|
|
|
t.false(resolved, "the delay should be async");
|
|
|
|
|
|
await res;
|
|
|
t.pass("await delay");
|
|
|
|
|
|
// create cancellation token
|
|
|
let cancel: (e?: any) => void;
|
|
|
const ct = new Cancellation(c => cancel = c);
|
|
|
|
|
|
// schedule delay
|
|
|
resolved = false;
|
|
|
res = delay(0, ct).then(() => resolved = true);
|
|
|
|
|
|
t.false(resolved, "created delay with ct");
|
|
|
|
|
|
// cancel
|
|
|
cancel();
|
|
|
|
|
|
try {
|
|
|
await res;
|
|
|
t.fail("the delay should fail when it is cancelled");
|
|
|
} catch {
|
|
|
t.pass("the delay is cancelled");
|
|
|
}
|
|
|
|
|
|
let died = false;
|
|
|
|
|
|
// try schedule delay after the cancellation is requested
|
|
|
res = delay(0, ct).then(x => true, () => died = true);
|
|
|
|
|
|
t.false(died, "The delay should be scheduled even if the cancellation is requested");
|
|
|
|
|
|
await res;
|
|
|
t.true(died, "the delay should fail when cancelled");
|
|
|
|
|
|
t.end();
|
|
|
});
|
|
|
|
|
|
tape("sequemce test", async t => {
|
|
|
const sequence = ["a", "b", "c"];
|
|
|
const empty = [];
|
|
|
|
|
|
// synchronous tests
|
|
|
t.equals(first(sequence), "a", "Should return the first element");
|
|
|
|
|
|
let v: string;
|
|
|
let e: Error;
|
|
|
first(sequence, x => v = x);
|
|
|
t.equal(v, "a", "The callback should be called for the first element");
|
|
|
|
|
|
t.throws(() => {
|
|
|
first(empty);
|
|
|
}, "Should throw when the sequence is empty");
|
|
|
|
|
|
t.throws(() => {
|
|
|
first(empty, x => v = x);
|
|
|
}, "Should throw when the sequence is empty");
|
|
|
|
|
|
first(empty, null, x => e = x);
|
|
|
t.true(e, "The errorback should be called for the empty sequence");
|
|
|
|
|
|
// async tests
|
|
|
const asyncSequence = Promise.resolve(sequence);
|
|
|
const asyncEmptySequence = Promise.resolve(empty);
|
|
|
|
|
|
const promise = first(asyncSequence);
|
|
|
t.true(isPromise(promise), "Should return promise");
|
|
|
|
|
|
v = await promise;
|
|
|
t.equal(v, "a", "Should return the first element");
|
|
|
|
|
|
v = await new Promise(resolve => first(asyncSequence, resolve));
|
|
|
t.equal(v, "a", "The callback should be called for the first element");
|
|
|
|
|
|
t.end();
|
|
|
});
|
|
|
|