ObservableTests.ts
74 lines
| 2.0 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r89 | import { TraceSource } from "../log/TraceSource"; | ||
| import { Observable } from "../Observable"; | ||||
| import { IObservable } from "../interfaces"; | ||||
|
|
r115 | import { delay, fork } from "../safe"; | ||
|
|
r89 | import { test } from "./TestTraits"; | ||
| const trace = TraceSource.get("ObservableTests"); | ||||
| test("events sequence example", async t => { | ||||
|
|
r115 | let events: IObservable<number> | undefined; | ||
|
|
r89 | |||
| const done = new Promise<void>(resolve => { | ||||
| events = new Observable<number>(async (notify, fail, finish) => { | ||||
| for (let i = 0; i < 10; i++) { | ||||
|
|
r115 | await fork(); | ||
|
|
r89 | notify(i); | ||
| } | ||||
| finish(); | ||||
| resolve(); | ||||
| }); | ||||
| }); | ||||
| let count = 0; | ||||
| let complete = false; | ||||
|
|
r115 | if (!events) | ||
| throw new Error("events === undefined"); | ||||
| events.on(x => count = count + x, undefined, () => complete = true); | ||||
|
|
r89 | |||
| const first = await events.next(); | ||||
| t.equals(first, 0, "the first event"); | ||||
| t.false(complete, "the sequence is not complete"); | ||||
| await done; | ||||
| t.equals(count, 45, "the summ of the evetns"); | ||||
| t.true(complete, "the sequence is complete"); | ||||
| }); | ||||
| test("event sequence termination", async t => { | ||||
|
|
r115 | let events: IObservable<number> | undefined; | ||
|
|
r89 | |||
| const done = new Promise<void>(resolve => { | ||||
| events = new Observable<number>(async (notify, fail, complete) => { | ||||
|
|
r115 | await fork(); | ||
|
|
r89 | notify(1); | ||
| complete(); | ||||
| notify(2); | ||||
| complete(); | ||||
| fail("Sequence terminated"); | ||||
| resolve(); | ||||
| }); | ||||
| }); | ||||
|
|
r115 | if (!events) | ||
| throw new Error("events === undefined"); | ||||
|
|
r89 | let count = 0; | ||
| events.on(() => {}, e => count++, () => count++); | ||||
| const first = await events.next(); | ||||
| t.equals(first, 1, "the first message"); | ||||
| try { | ||||
| await events.next(); | ||||
| t.fail("shoud throw an exception"); | ||||
| } catch (e) { | ||||
| t.pass("the sequence is terminated"); | ||||
| } | ||||
| await done; | ||||
| t.equals(count, 1, "the sequence must be terminated once"); | ||||
| }); | ||||
