@launchmenu/core
Version:
An environment for visual keyboard controlled applets
240 lines • 26.9 kB
JavaScript
"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