SafeTests.ts
86 lines
| 2.3 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r76 | 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(); | ||||
| }); | ||||
