@launchmenu/core
Version:
An environment for visual keyboard controlled applets
247 lines • 28.2 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const model_react_1 = require("model-react");
const wait_helper_1 = require("../../../_tests/wait.helper");
const reduceActions_1 = require("../reduceActions");
function createAction(name, transformer) {
return {
transform: transformer,
name,
parents: [],
get: () => { },
};
}
function createNode(action, children = [], bindingsData = []) {
return {
action,
children,
bindings: bindingsData.map(([data, index]) => ({
action,
index,
...(data instanceof Function ? { subscribableData: data } : { data }),
})),
};
}
describe("reduceActions", () => {
it("Should properly apply the transformer of the action", () => {
const action = createAction("A", (inp) => ({ result: inp.join("-") }));
const node = createNode(action, [], [
["hoi", 0],
["bye", 1],
]);
const result = reduceActions_1.reduceActions([node], []);
expect(result === null || result === void 0 ? void 0 : result.result).toEqual("hoi-bye");
});
it("Should forward results of handlers", () => {
const action = createAction("A", (inp) => ({ result: inp.join("-") }));
const actionHandler = createAction("B", (inp) => ({
children: [{ action, data: inp.join("+") }],
}));
const handlerNode = createNode(actionHandler, [], [
["hoi", 0],
["bye", 1],
]);
const node = createNode(action, [handlerNode], [["stuff", 2]]);
const result = reduceActions_1.reduceActions([handlerNode, node], []);
expect(result === null || result === void 0 ? void 0 : result.result).toEqual("hoi+bye-stuff");
});
it("Should forward multiple layers of results of handlers", () => {
const action = createAction("A", (inp) => ({ result: inp.join("-") }));
const actionHandler = createAction("B", (inp) => ({
children: [{ action, data: inp.join("+") }],
}));
const actionHandlerHandler = createAction("C", (inp) => ({
children: inp.map(d => ({ action: actionHandler, data: `(${d})` })),
}));
const handlerHandlerNode = createNode(actionHandlerHandler, [], [
["hoi", 0],
["bye", 1],
]);
const handlerNode = createNode(actionHandler, [handlerHandlerNode], [
["oranges", 2],
["potatoes", 3],
]);
const node = createNode(action, [handlerNode], [["stuff", 4]]);
const result = reduceActions_1.reduceActions([handlerHandlerNode, handlerNode, node], []);
expect(result === null || result === void 0 ? void 0 : result.result).toEqual("(hoi)+(bye)+oranges+potatoes-stuff");
});
it("Should skip actions without bindings, except for the last", () => {
const actionMock = jest.fn((inp) => ({ result: inp.join("-") }));
const actionHandlerMock = jest.fn((inp) => ({
children: [{ action, data: inp.join("+") }],
}));
const action = createAction("A", actionMock);
const actionHandler = createAction("B", actionHandlerMock);
const handlerNode = createNode(actionHandler, [], []);
const node = createNode(action, [handlerNode], []);
const result = reduceActions_1.reduceActions([handlerNode, node], []);
expect(result === null || result === void 0 ? void 0 : result.result).toEqual("");
expect(actionMock).toBeCalledTimes(1);
expect(actionHandlerMock).toBeCalledTimes(0);
});
describe("ordering", () => {
it("Should pass the inputs in the order of their bindings", () => {
const action = createAction("A", (inp) => ({
result: inp.join("-"),
}));
const node = createNode(action, [], [
["stuff", 0],
["oranges", 1],
]);
const result = reduceActions_1.reduceActions([node], []);
expect(result === null || result === void 0 ? void 0 : result.result).toEqual("stuff-oranges");
});
it("Should decide combined handlers indices to be the same as their first input's index", () => {
const action = createAction("A", (inp) => ({
result: inp.join("-"),
}));
const actionHandler = createAction("B", (inp) => ({
children: [{ action, data: inp.join("+") }],
}));
const handlerNode1 = createNode(actionHandler, [], [
["oranges", 0],
["potatoes", 1],
]);
const node1 = createNode(action, [handlerNode1], [["stuff", 2]]);
const result = reduceActions_1.reduceActions([handlerNode1, node1], []);
expect(result === null || result === void 0 ? void 0 : result.result).toEqual("oranges+potatoes-stuff");
const handlerNode2 = createNode(actionHandler, [], [
["oranges", 0],
["potatoes", 2],
]);
const node2 = createNode(action, [handlerNode2], [["stuff", 1]]);
const result2 = reduceActions_1.reduceActions([handlerNode2, node2], []);
expect(result2 === null || result2 === void 0 ? void 0 : result2.result).toEqual("oranges+potatoes-stuff");
const handlerNode3 = createNode(actionHandler, [], [
["oranges", 1],
["potatoes", 2],
]);
const node3 = createNode(action, [handlerNode3], [["stuff", 0]]);
const result3 = reduceActions_1.reduceActions([handlerNode3, node3], []);
expect(result3 === null || result3 === void 0 ? void 0 : result3.result).toEqual("stuff-oranges+potatoes");
});
it("Should decide mapped handlers indices to be the same as their inputs", () => {
const action = createAction("A", (inp) => ({
result: inp.join("-"),
}));
const actionHandler = createAction("B", (inp) => ({
children: inp.map(d => ({ action, data: `(${d})` })),
}));
const handlerNode = createNode(actionHandler, [], [
["oranges", 0],
["potatoes", 2],
]);
const node = createNode(action, [handlerNode], [
["stuff", 1],
["crap", 3],
]);
const result = reduceActions_1.reduceActions([handlerNode, node], []);
expect(result === null || result === void 0 ? void 0 : result.result).toEqual("(oranges)-stuff-(potatoes)-crap");
});
it("Should decide mapped handlers indices to be the same as their inputs for multiple actions", () => {
const action = createAction("A", (inp) => ({
result: inp.join("-"),
}));
const action2 = createAction("B", (inp) => ({
result: inp.join("*"),
}));
const actionHandler = createAction("C", (inp) => ({
children: [
...inp.map(d => ({ action, data: `(${d})` })),
...inp.map(d => ({ action: action2, data: `[${d}]` })),
],
}));
const handlerNode = createNode(actionHandler, [], [
["oranges", 0],
["potatoes", 2],
]);
const node = createNode(action, [handlerNode], [
["stuff", 1],
["crap", 3],
]);
const result = reduceActions_1.reduceActions([handlerNode, node], []);
expect(result === null || result === void 0 ? void 0 : result.result).toEqual("(oranges)-stuff-(potatoes)-crap");
const handlerNode2 = createNode(actionHandler, [], [
["oranges", 0],
["potatoes", 2],
]);
const node2 = createNode(action2, [handlerNode2], [
["stuff", 1],
["crap", 3],
]);
const result2 = reduceActions_1.reduceActions([handlerNode2, node2], []);
expect(result2 === null || result2 === void 0 ? void 0 : result2.result).toEqual("[oranges]*stuff*[potatoes]*crap");
});
it("Should allow for manual index assignment", () => {
const action = createAction("A", (inp) => ({
result: inp.join("-"),
}));
const actionHandler = createAction("B", (inp, indices) => ({
children: inp.map((d, i) => ({
action,
data: `(${d})`,
index: indices[indices.length - 1 - i],
})),
}));
const handlerNode = createNode(actionHandler, [], [
["oranges", 0],
["potatoes", 2],
]);
const node = createNode(action, [handlerNode], [
["stuff", 1],
["crap", 3],
]);
const result = reduceActions_1.reduceActions([handlerNode, node], []);
expect(result === null || result === void 0 ? void 0 : result.result).toEqual("(potatoes)-stuff-(oranges)-crap");
});
it("Should keep the order when the indices are the same", () => {
const action = createAction("A", (inp) => ({
result: inp.join("-"),
}));
const actionHandler = createAction("B", (inp, indices) => {
var _a, _b;
return ({
children: [
{ action, data: inp.join("+"), index: (_a = indices[0]) !== null && _a !== void 0 ? _a : Infinity },
{ action, data: inp.join("*"), index: (_b = indices[0]) !== null && _b !== void 0 ? _b : Infinity },
],
});
});
const handlerNode1 = createNode(actionHandler, [], [
["oranges", 0],
["potatoes", 1],
["things", 3],
]);
const node1 = createNode(action, [handlerNode1], [["stuff", 2]]);
const result = reduceActions_1.reduceActions([handlerNode1, node1], []);
expect(result === null || result === void 0 ? void 0 : result.result).toEqual("oranges+potatoes+things-oranges*potatoes*things-stuff");
});
});
it("Should inform about changes", async () => {
const action = createAction("A", (inp) => ({ result: inp.join("-") }));
const actionHandler = createAction("B", (inp) => ({
children: [{ action, data: inp.join("+") }],
}));
const actionHandlerHandler = createAction("C", (inp) => ({
children: inp.map(d => ({ action: actionHandler, data: `(${d})` })),
}));
const oranges = new model_react_1.Field("oranges");
const handlerHandlerNode = createNode(actionHandlerHandler, [], [
["hoi", 0],
["bye", 1],
]);
const handlerNode = createNode(actionHandler, [handlerHandlerNode], [
[h => oranges.get(h), 2],
["potatoes", 3],
]);
const node = createNode(action, [handlerNode], [["stuff", 4]]);
const listener = jest.fn();
new model_react_1.Observer(h => reduceActions_1.reduceActions([handlerHandlerNode, handlerNode, node], [], h)).listen(listener, true);
oranges.set("smth");
await wait_helper_1.wait();
expect(listener).toBeCalledTimes(2);
expect(listener.mock.calls[0][0].result).toEqual("(hoi)+(bye)+oranges+potatoes-stuff");
expect(listener.mock.calls[1][0].result).toEqual("(hoi)+(bye)+smth+potatoes-stuff");
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlQWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hY3Rpb25zL2FjdGlvbkdyYXBoL190ZXN0cy9yZWR1Y2VBY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXVEO0FBQ3ZELDZEQUFpRDtBQUlqRCxvREFBK0M7QUFFL0MsU0FBUyxZQUFZLENBQ2pCLElBQVksRUFDWixXQUE4QztJQUU5QyxPQUFPO1FBQ0gsU0FBUyxFQUFFLFdBQVc7UUFDdEIsSUFBSTtRQUNKLE9BQU8sRUFBRSxFQUFFO1FBQ1gsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7S0FDaEIsQ0FBQztBQUNOLENBQUM7QUFDRCxTQUFTLFVBQVUsQ0FDZixNQUE0QixFQUM1QixXQUEwQixFQUFFLEVBQzVCLGVBQXNELEVBQUU7SUFFeEQsT0FBTztRQUNILE1BQU07UUFDTixRQUFRO1FBQ1IsUUFBUSxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzQyxNQUFNO1lBQ04sS0FBSztZQUNMLEdBQUcsQ0FBQyxJQUFJLFlBQVksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFDLGdCQUFnQixFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDO1NBQ3BFLENBQUMsQ0FBQztLQUNOLENBQUM7QUFDTixDQUFDO0FBRUQsUUFBUSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7SUFDM0IsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsRUFBRTtRQUMzRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFD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
;