UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

240 lines 26.9 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 SearchExecuter_1 = require("../SearchExecuter"); const createSimpleResultMap_helper_1 = require("./createSimpleResultMap.helper"); const createSimpleSearch_helper_1 = require("./createSimpleSearch.helper"); /* * Most behavior has been tested in `coreSearchExecuter` and `SearchPatternFilter` classes * So there are fewer tests in here */ describe("SearchExecuter", () => { describe("new SearchExecuter", () => { it("Can be constructed", () => { new SearchExecuter_1.SearchExecuter({ searchable: createSimpleSearch_helper_1.createSimpleSearch({ m: () => true }), onRemove: () => { }, onAdd: () => { }, }); }); }); describe("SearchExecuter.setQuery", () => { it("Obtains the correct results", async () => { const search1 = createSimpleSearch_helper_1.createSimpleSearch({ id: "1", m: async (s) => { await wait_helper_1.wait(20); return s == "s" || s == "p"; }, }); const search2 = createSimpleSearch_helper_1.createSimpleSearch({ id: "2", m: async (s) => { await wait_helper_1.wait(20); return s == "s" || s == "o"; }, }); const field = new model_react_1.Field("m"); const search3 = createSimpleSearch_helper_1.createSimpleSearch({ id: "3", m: s => s == "o" || s == "p", children: (s, h) => (s == field.get(h) ? [] : [search1, search2]), }); const field3 = new model_react_1.Field("i"); const search4 = createSimpleSearch_helper_1.createSimpleSearch({ id: "4", m: s => s == "o" || s == "p", children: (s, h) => (s == field3.get(h) ? [] : [search3]), }); const field2 = new model_react_1.Field("m"); const search5 = createSimpleSearch_helper_1.createSimpleSearch({ id: "5", m: (s, h) => s == field2.get(h), }); const field4 = new model_react_1.Field("i"); const search6 = createSimpleSearch_helper_1.createSimpleSearch({ id: "6", m: s => s == "o" || s == "p", children: (s, h) => (s == field4.get(h) ? [] : [search3]), }); const search7 = createSimpleSearch_helper_1.createSimpleSearch({ id: "7", m: s => s == "o" || s == "p", children: (s, h) => [search4, search5, search6], }); const results = createSimpleResultMap_helper_1.createSimpleResultMap(); const executer = new SearchExecuter_1.SearchExecuter({ searchable: search7, ...results, }); // Check searches execute in parallel executer.setQuery("s"); await wait_helper_1.wait(30); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search1.ID, search2.ID])); await executer.setQuery("o"); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search2.ID, search3.ID, search4.ID, search6.ID, search7.ID])); await executer.setQuery("m"); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search5.ID])); // Test fields requesting updates field2.set("o"); await wait_helper_1.wait(1); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([])); await executer.setQuery("o"); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([ search2.ID, search3.ID, search4.ID, search6.ID, search7.ID, search5.ID, ])); field.set("o"); await wait_helper_1.wait(1); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search3.ID, search4.ID, search6.ID, search7.ID, search5.ID])); field.set("p"); await wait_helper_1.wait(30); // search2 takes 20ms to complete expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([ search2.ID, search3.ID, search4.ID, search6.ID, search7.ID, search5.ID, ])); field3.set("o"); await wait_helper_1.wait(10); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([ search2.ID, search3.ID, search4.ID, search6.ID, search7.ID, search5.ID, ])); field4.set("o"); await wait_helper_1.wait(1); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search4.ID, search6.ID, search7.ID, search5.ID])); }); it("Works properly with patterns", async () => { const search1 = createSimpleSearch_helper_1.createSimpleSearch({ id: "1", m: s => s == "s" || s == "p", }); const search2 = createSimpleSearch_helper_1.createSimpleSearch({ id: "2", m: s => s == "s" || s == "o", pattern: s => (s == "s" ? { name: "something" } : undefined), }); const field = new model_react_1.Field("m"); const search3 = createSimpleSearch_helper_1.createSimpleSearch({ id: "3", m: s => s == "o" || s == "p", pattern: (s, h) => (field.get(h) == s ? { name: "something" } : undefined), children: [search1, search2], }); const search4 = createSimpleSearch_helper_1.createSimpleSearch({ id: "4", m: s => s == "o" || s == "p", children: [search3], }); const search5 = createSimpleSearch_helper_1.createSimpleSearch({ id: "5", m: (s, h) => s == "o", }); const field2 = new model_react_1.Field("m"); const search6 = createSimpleSearch_helper_1.createSimpleSearch({ id: "6", m: s => s == "o" || s == "p", pattern: (s, h) => (field2.get(h) == s ? { name: "stuff" } : undefined), children: [search3], }); const search7 = createSimpleSearch_helper_1.createSimpleSearch({ id: "7", m: s => s == "o" || s == "p", children: (s, h) => [search4, search5, search6], }); const results = createSimpleResultMap_helper_1.createSimpleResultMap(); const executer = new SearchExecuter_1.SearchExecuter({ searchable: search7, ...results, }); await executer.setQuery("p"); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search1.ID, search3.ID, search4.ID, search6.ID, search7.ID])); expect(executer.getPatterns()).toEqual([]); await executer.setQuery("s"); expect(executer.getPatterns()).toEqual([{ name: "something" }]); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search2.ID])); await executer.setQuery("p"); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search1.ID, search3.ID, search4.ID, search6.ID, search7.ID])); expect(executer.getPatterns()).toEqual([]); field.set("p"); await wait_helper_1.wait(1); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search3.ID])); expect(executer.getPatterns()).toEqual([{ name: "something" }]); field2.set("p"); await wait_helper_1.wait(1); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search3.ID, search6.ID])); expect(executer.getPatterns()).toEqual([ { name: "something" }, { name: "stuff" }, ]); field.set("m"); field2.set("m"); await wait_helper_1.wait(1); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search1.ID, search3.ID, search4.ID, search6.ID, search7.ID])); expect(executer.getPatterns()).toEqual([]); field.set("s"); await executer.setQuery("s"); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search2.ID])); expect(executer.getPatterns()).toEqual([{ name: "something" }]); field.set("k"); await executer.setQuery("k"); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([])); expect(executer.getPatterns()).toEqual([{ name: "something" }]); }); it("Keeps the searching property up to date", async () => { const search1 = createSimpleSearch_helper_1.createSimpleSearch({ id: "1", m: s => s == "s" || s == "p", }); const field = new model_react_1.Field("m"); const search2 = createSimpleSearch_helper_1.createSimpleSearch({ id: "2", m: (s, h) => field.get(h) == s, pattern: s => (s == "s" ? { name: "something" } : undefined), }); const search3 = createSimpleSearch_helper_1.createSimpleSearch({ id: "3", m: s => s == "o" || s == "p", children: [search1, search2], }); const results = createSimpleResultMap_helper_1.createSimpleResultMap(); const executer = new SearchExecuter_1.SearchExecuter({ searchable: search3, ...results, }); // Basic test expect(executer.isSearching()).toBe(false); const searchPromise = executer.setQuery("m"); expect(executer.isSearching()).toBe(true); await searchPromise; expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search2.ID])); expect(executer.isSearching()).toBe(false); // Subscription test with later updates const listener = jest.fn(); new model_react_1.Observer(h => executer.isSearching(h), // When using a debounce, some searching updates are lost if too close together { debounce: -1 }).listen(listener); await executer.setQuery("p"); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search1.ID, search3.ID])); await wait_helper_1.wait(4); expect(listener.mock.calls.length).toBe(2); field.set("p"); await wait_helper_1.wait(1); expect(results.getItems()).toEqual(createSimpleResultMap_helper_1.s([search1.ID, search3.ID, search2.ID])); expect(listener.mock.calls.length).toBe(4); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoRXhlY3V0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvc2VhcmNoRXhlY3V0ZXIvX3Rlc3RzL1NlYXJjaEV4ZWN1dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQTRDO0FBQzVDLDZEQUFpRDtBQUNqRCxzREFBaUQ7QUFDakQsaUZBQXdFO0FBQ3hFLDJFQUErRDtBQUUvRDs7O0dBR0c7QUFDSCxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO0lBQzVCLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7UUFDaEMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtZQUMxQixJQUFJLCtCQUFjLENBQUM7Z0JBQ2YsVUFBVSxFQUFFLDhDQUFrQixDQUFDLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBQyxDQUFDO2dCQUMvQyxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztnQkFDbEIsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7YUFDbEIsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUNILFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7UUFDckMsRUFBRSxDQUFDLDZCQUE2QixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3pDLE1BQU0sT0FBTyxHQUFHLDhDQUFrQixDQUFDO2dCQUMvQixFQUFFLEVBQUUsR0FBRztnQkFDUCxDQUFDLEVBQUUsS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFO29CQUNULE1BQU0sa0JBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDZixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztnQkFDaEMsQ0FBQzthQUNKLENBQUMsQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLDhDQUFrQixDQUFDO2dCQUMv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Q0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRSxNQUFNLGtCQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTNDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZixNQUFNLGtCQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZCxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGdDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyJ9