// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Test simple select. "use strict"; const Channel = require("../../lib"); it(`select`, async function() { const closed = Channel(); closed.close(); let counter = 0; let shift = 0; const GetValue = () => { counter++; return 1 << shift; }; const Send = async (a, b) => { let done = false; let i = 0; do { switch (await Channel.select([ a.push(GetValue()), b.push(GetValue()), closed.shift() ])) { case a: i++; a = Channel(); break; case b: i++; b = Channel(); break; default: done = true; } shift++; } while (!done); return i; }; let a = Channel(1); let b = Channel(1); let v = await Send(a, b); if (v !== 2) { throw new Error(`Send returned ${v} !== 2`); } const av = await a.shift(); const bv = await b.shift(); if ((av | bv) !== 3) { throw new Error(`bad values ${av} ${bv}`); } v = await Send(a, Channel()); if (v !== 1) { throw new Error(`Send returned ${v} !== 1`); } if (counter !== 10) { throw new Error(`counter is ${counter} !== 10`); } });