ObservableTests.ts
73 lines
| 1.9 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r40 | import { TraceSource, DebugLevel } from "@implab/core/log/TraceSource"; | ||
| import * as tape from "tape"; | ||||
| import { TapeWriter, delay } from "./TestTraits"; | ||||
| import { Observable } from "@implab/core/Observable"; | ||||
| import { IObservable } from "@implab/core/interfaces"; | ||||
|
|
r24 | |||
|
|
r40 | const trace = TraceSource.get("ObservableTests"); | ||
|
|
r24 | |||
|
|
r40 | tape("events sequence example", async t => { | ||
|
|
r24 | |||
|
|
r40 | let events: IObservable<number>; | ||
|
|
r24 | |||
|
|
r40 | const done = new Promise<void>(resolve => { | ||
| events = new Observable<number>(async (notify, fail, finish) => { | ||||
|
|
r24 | for (let i = 0; i < 10; i++) { | ||
| await delay(0); | ||||
| notify(i); | ||||
| } | ||||
|
|
r40 | finish(); | ||
|
|
r24 | resolve(); | ||
| }); | ||||
| }); | ||||
| let count = 0; | ||||
|
|
r26 | let complete = false; | ||
| events.on(x => count = count + x, null, () => complete = true); | ||||
|
|
r24 | |||
|
|
r40 | const first = await events.next(); | ||
|
|
r24 | |||
| t.equals(first, 0, "the first event"); | ||||
|
|
r26 | t.false(complete, "the sequence is not complete"); | ||
|
|
r24 | |||
| await done; | ||||
| t.equals(count, 45, "the summ of the evetns"); | ||||
|
|
r26 | t.true(complete, "the sequence is complete"); | ||
| t.end(); | ||||
| }); | ||||
|
|
r40 | tape("event sequence termination", async t => { | ||
| let events: IObservable<number>; | ||||
|
|
r26 | |||
|
|
r40 | const done = new Promise<void>(resolve => { | ||
|
|
r26 | events = new Observable<number>(async (notify, fail, complete) => { | ||
| await delay(0); | ||||
| notify(1); | ||||
| complete(); | ||||
| notify(2); | ||||
| complete(); | ||||
| fail("Sequence terminated"); | ||||
| resolve(); | ||||
| }); | ||||
| }); | ||||
| let count = 0; | ||||
|
|
r40 | events.on(() => {}, e => count++, () => count++); | ||
|
|
r26 | |||
|
|
r40 | const first = await events.next(); | ||
|
|
r26 | t.equals(first, 1, "the first message"); | ||
| try { | ||||
| await events.next(); | ||||
| t.fail("shoud throw an exception"); | ||||
|
|
r40 | } catch (e) { | ||
|
|
r26 | t.pass("the sequence is terminated"); | ||
| } | ||||
| await done; | ||||
| t.equals(count, 1, "the sequence must be terminated once"); | ||||
|
|
r24 | |||
| t.end(); | ||||
|
|
r40 | }); | ||
