UNPKG

suspenders-js

Version:

Asynchronous programming library utilizing coroutines, functional reactive programming and structured concurrency.

153 lines 5.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const Channel_1 = require("./Channel"); const Scope_1 = require("./Scope"); describe(`channel tests`, () => { it(`channel send/receive messages`, (done) => { const channel = new Channel_1.Channel(); const scope = new Scope_1.Scope({ errorCallback: (error) => { done(error); } }); scope.launch(function* () { try { if ((yield* this.suspend(channel.receive)) !== 0) { done(`didn't receive expected message`); return; } done(); } finally { this.cancel(); } }); scope.launch(function* () { yield channel.send(0); }); }); it(`channel multiple receiver round robin order`, (done) => { const channel = new Channel_1.Channel(); const scope = new Scope_1.Scope({ errorCallback: (error) => { done(error); } }); scope.launch(function* () { if ((yield* this.suspend(channel.receive)) !== 0) { done(`received out of order 0`); this.cancel(); return; } if ((yield* this.suspend(channel.receive)) !== 3) { done(`received out of order 3`); this.cancel(); return; } }); scope.launch(function* () { try { if ((yield* this.suspend(channel.receive)) !== 1) { done(`received out of order 1`); return; } if ((yield* this.suspend(channel.receive)) !== 4) { done(`received out of order 4`); return; } done(); } finally { this.cancel(); } }); scope.launch(function* () { try { if ((yield* this.suspend(channel.receive)) !== 2) { done(`received out of order 2`); return; } if ((yield* this.suspend(channel.receive)) !== 5) { done(`received out of order 5`); return; } done(); } finally { this.cancel(); } }); scope.launch(function* () { yield channel.send(0); yield channel.send(1); yield channel.send(2); yield channel.send(3); yield channel.send(4); yield channel.send(5); }); }); it(`channel multiple sender round robin order`, (done) => { const channel = new Channel_1.Channel(); const scope = new Scope_1.Scope({ errorCallback: (error) => { done(error); } }); scope.launch(function* () { yield channel.send(0); yield channel.send(3); }); scope.launch(function* () { yield channel.send(1); yield channel.send(4); }); scope.launch(function* () { yield channel.send(2); yield channel.send(5); }); scope.launch(function* () { try { if ((yield* this.suspend(channel.receive)) !== 0) { done(`received out of order 0`); return; } if ((yield* this.suspend(channel.receive)) !== 1) { done(`received out of order 1`); return; } if ((yield* this.suspend(channel.receive)) !== 2) { done(`received out of order 2`); return; } if ((yield* this.suspend(channel.receive)) !== 3) { done(`received out of order 3`); return; } if ((yield* this.suspend(channel.receive)) !== 4) { done(`received out of order 4`); return; } if ((yield* this.suspend(channel.receive)) !== 5) { done(`received out of order 5`); return; } done(); } finally { this.cancel(); } }); }); it(`channel buffer single message`, (done) => { const channel = new Channel_1.Channel({ bufferSize: 1 }); const scope = new Scope_1.Scope({ errorCallback: (error) => { done(error); } }); scope.launch(function* () { yield channel.send(0); done(); this.cancel(); yield channel.send(1); }); }); it(`channel receiving buffered message resumes suspended sender`, (done) => { const channel = new Channel_1.Channel({ bufferSize: 1 }); const scope = new Scope_1.Scope({ errorCallback: (error) => { done(error); } }); scope.launch(function* () { yield channel.send(0); yield channel.send(1); done(); this.cancel(); }); scope.launch(function* () { yield channel.receive; }); }); }); //# sourceMappingURL=Channel.spec.js.map