UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

247 lines 28.2 kB
"use strict"; 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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