@davidcal/fec-raptorq
Version:
Node.js wrapper for RaptorQ forward error correction
181 lines (154 loc) • 4.42 kB
JavaScript
import { api } from "./api.js";
import { test } from "./test.js";
import { unpacker_map } from "./unpacker_map.js";
await test("basic test", async () => {
const m = unpacker_map(($) => {
$.$fall((input) => {
if (input === undefined) {
return "hello";
}
return "world";
});
});
return await m() === "hello" && await m.foo() === "world";
});
await test("simple leaf values", async () => {
const person = unpacker_map(($) => {
$.name.$ret("John Doe");
$.age.$ret(27);
$.friends.$ret(["mary", "jane", "joseph"]);
});
return (true
&& await person.name() === "John Doe"
&& await person.age() === 27
&& (friends => ["mary", "jane", "joseph"].every(entry => friends.includes(entry)))(await person.friends())
);
});
await test("nested leaf values", async () => {
const person = unpacker_map(($) => {
$.name.$ret("John Doe");
$.age.$ret(27);
$.friends.$ret(["mary", "jane", "joseph"]);
$.address(($) => {
$.$ret("123 Main St, Monopoly Town, CA");
$.street.$ret("123 Main St");
$.city.$ret("Monopoly Town");
$.state.$ret("CA");
});
});
return (true
&& await person.name() === "John Doe"
&& await person.age() === 27
&& (friends => ["mary", "jane", "joseph"].every(entry => friends.includes(entry)))(await person.friends())
&& await person.address() === "123 Main St, Monopoly Town, CA"
&& await person.address.street() === "123 Main St"
&& await person.address.city() === "Monopoly Town"
&& await person.address.state() === "CA"
);
});
await test("map calls", async () => {
const m = unpacker_map(($) => {
$.greet.$call(async (input) => {
return `Hello, ${await input.name()}!`;
});
$.converse.$call(async (input) => {
return `How are you today, ${await input.name()}?`;
});
});
const person = unpacker_map(($) => {
$.name.$ret("Jim");
});
return (true
&& await m.greet(person)() === "Hello, Jim!"
&& await m.converse(person)() === "How are you today, Jim?"
);
});
await test("map calls returning maps", async () => {
const m = unpacker_map(($) => {
$.greet.$call(async (input) => {
return unpacker_map(($) => {
$.option_a.$ret_lazy(async () => `Hello, ${await input.name()}!`);
$.option_b.$ret_lazy(async () => `Bye, ${await input.name()}!`);
});
});
});
const person = unpacker_map(($) => {
$.name.$ret("Jim");
});
return (true
&& await m.greet(person).option_a() === "Hello, Jim!"
&& await m.greet(person).option_b() === "Bye, Jim!"
);
});
await test("map calls returning maps async", async () => {
const m = unpacker_map(($) => {
$.greet.$call(async (input) => {
return unpacker_map(async ($) => {
$.option_a.$ret(`Hello, ${await input.name()}!`);
$.option_b.$ret(`Bye, ${await input.name()}!`);
});
});
});
const person = unpacker_map(($) => {
$.name.$ret("Jim");
});
return (true
&& await m.greet(person).option_a() === "Hello, Jim!"
&& await m.greet(person).option_b() === "Bye, Jim!"
);
});
await test("map call returning maps sugar", async () => {
const m = unpacker_map(($) => {
$.greet.$call(async (input, $) => {
$.$ret(await input.name());
$.option_a.$ret(`Hello, ${await input.name()}!`);
$.option_b.$ret(`Bye, ${await input.name()}!`);
});
});
const person = unpacker_map(($) => {
$.name.$ret("Jim");
});
return (true
&& await m.greet(person)() === "Jim"
&& await m.greet(person).option_a() === "Hello, Jim!"
&& await m.greet(person).option_b() === "Bye, Jim!"
);
});
await test("api calls", async () => {
const m = unpacker_map(($) => {
$.query_foo.$ret(api(() => {
return unpacker_map(($) => {
$.foo.$ret("bar");
});
}));
$.query_bar.$call((input, $) => {
$.$ret(api(() => {
return unpacker_map(async ($) => {
$.bar.$ret(`baz ${await input.dat()}`);
});
}));
});
});
return (true
&& await m.query_foo().foo() === "bar"
&& await m.query_bar(unpacker_map(($) => {
$.dat.$ret("lipsum");
}))().bar() === "baz lipsum"
);
});
await test("fancy api call sugar", async () => {
const m = unpacker_map(($) => {
$.query_foo.$ret_api(($) => {
$.foo.$ret("bar");
});
$.query_bar.$call_api(async (input, $) => {
$.bar.$ret(`baz ${await input.dat()}`);
});
});
return (true
&& await m.query_foo().foo() === "bar"
&& await m.query_bar(unpacker_map(($) => {
$.dat.$ret("lipsum");
}))().bar() === "baz lipsum"
);
});