UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

258 lines 26.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const SearchMenu_1 = require("../SearchMenu"); const MenuItem_helper_1 = require("./MenuItem.helper"); const wait_helper_1 = require("../../../_tests/wait.helper"); const context_helper_1 = require("../../../_tests/context.helper"); const model_react_1 = require("model-react"); describe("SearchMenu", () => { describe("new SearchMenu", () => { it("Properly creates a new search menu", () => { new SearchMenu_1.SearchMenu(context_helper_1.dummyContext); }); it("Can be initialized with a config", () => { new SearchMenu_1.SearchMenu(context_helper_1.dummyContext, { batchInterval: 200, }); }); }); describe("SearchMenu.addSearchItem -> SearchMenu.setSearch", () => { let menu; beforeEach(() => { menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext); }); it("Only includes non 0 priority search results", async () => { const item = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 1 }, }); menu.addSearchItem(item); const item2 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { poop: 1 } }); menu.addSearchItem(item2); await menu.setSearch("something"); menu.flushBatch(); expect(menu.getItems()).toEqual([item]); }); it("Properly sorts search results", async () => { const item = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 1 }, }); menu.addSearchItem(item); const item2 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 2 }, }); menu.addSearchItem(item2); await menu.setSearch("something"); menu.flushBatch(); expect(menu.getItems()).toEqual([item2, item]); }); it("Properly filters old items", async () => { const item = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 1, oranges: 1 }, }); menu.addSearchItem(item); const item2 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 2 }, }); menu.addSearchItem(item2); await menu.setSearch("something"); menu.flushBatch(); expect(menu.getItems()).toEqual([item2, item]); await menu.setSearch("oranges"); menu.flushBatch(); expect(menu.getItems()).toEqual([item]); }); }); describe("SearchMenu.removeSearchItem -> SearchMenu.setSearch", () => { it("Doesn't include removed items in new search results", async () => { const menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext); const item = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 1 }, }); menu.addSearchItem(item); const item2 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 1 }, }); menu.addSearchItem(item2); menu.removeSearchItem(item); await menu.setSearch("something"); menu.flushBatch(); expect(menu.getItems()).toEqual([item2]); }); }); describe("SearchMenu.setSearch -> SearchMenu.addSearchItem", () => { it("Correctly adds search results for the last search", async () => { const menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext); await menu.setSearch("something"); const item = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 1 }, }); menu.addSearchItem(item); const item2 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 2 }, }); menu.addSearchItem(item2); await wait_helper_1.wait(1); menu.flushBatch(); expect(menu.getItems()).toEqual([item2, item]); }); }); describe("SearchMenu.setSearch -> SearchMenu.removeSearchItem", () => { it("Cleans up previous search results", async () => { const menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext); const item = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 1 }, }); menu.addSearchItem(item); const item2 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 2 }, }); menu.addSearchItem(item2); await menu.setSearch("something"); menu.flushBatch(); expect(menu.getItems()).toEqual([item2, item]); menu.removeSearchItem(item); await wait_helper_1.wait(1); menu.flushBatch(); expect(menu.getItems()).toEqual([item2]); }); }); describe("SearchMenu.setSearchItems", () => { it("Correctly adds items", async () => { const menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext); const item = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 1 }, }); const item2 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 2 }, }); const item3 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 4 }, }); const item4 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 3 }, }); menu.setSearchItems([item, item2]); await menu.setSearch("something"); menu.flushBatch(); expect(menu.getItems()).toEqual([item2, item]); menu.setSearchItems([item3, item, item2, item4]); await wait_helper_1.wait(1); menu.flushBatch(); expect(menu.getItems()).toEqual([item3, item4, item2, item]); }); it("Correctly removes items", async () => { const menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext); const item = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 1 }, }); const item2 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 2 }, }); const item3 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 4 }, }); const item4 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 3 }, }); menu.setSearchItems([item3, item, item2, item4]); await menu.setSearch("something"); menu.flushBatch(); expect(menu.getItems()).toEqual([item3, item4, item2, item]); menu.setSearchItems([item, item2]); await wait_helper_1.wait(1); menu.flushBatch(); expect(menu.getItems()).toEqual([item2, item]); }); }); describe("SearchMenu.getSearch", () => { it("Returns the last search value", async () => { const menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext); await menu.setSearch("oranges"); expect(menu.getSearch()).toBe("oranges"); }); it("Can be subscribed to", async () => { const menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext); const callback = jest.fn(); menu.setSearch("oranges"); new model_react_1.Observer(h => menu.getSearch(h)).listen(callback); expect(callback.mock.calls.length).toBe(0); menu.setSearch("stuff"); await wait_helper_1.wait(10); expect(callback.mock.calls.length).toBe(1); }); }); describe("SearchMenu.getHighlightText", () => { it("Returns the last search value", async () => { const menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext); await menu.setSearch("oranges"); expect(menu.getHighlight()).toEqual({ search: "oranges", context: context_helper_1.dummyContext, }); }); it("Can be subscribed to", async () => { const menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext); const callback = jest.fn(); menu.setSearch("oranges"); new model_react_1.Observer(h => menu.getHighlight(h)).listen(callback); expect(callback.mock.calls.length).toBe(0); menu.setSearch("stuff"); await wait_helper_1.wait(10); expect(callback.mock.calls.length).toBe(1); }); }); describe("showAllOnEmptySearch", () => { it("When set to true, shows the search items when the search is empty", async () => { const menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext, { showAllOnEmptySearch: true }); const item = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 1 }, }); const item2 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 2 }, }); menu.setSearchItems([item, item2]); menu.flushBatch(); expect(menu.getItems()).toEqual([item, item2]); }); it("When set to true, removes the search items when the search is not empty", async () => { const menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext, { showAllOnEmptySearch: true }); const item = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 1 }, }); const item2 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 2 }, }); menu.setSearchItems([item, item2]); menu.flushBatch(); expect(menu.getItems()).toEqual([item, item2]); await menu.setSearch("hoi"); menu.flushBatch(); expect(menu.getItems()).toEqual([]); await menu.setSearch(""); menu.flushBatch(); expect(menu.getItems()).toEqual([item, item2]); }); it("When set to false, does not show anything when search is empty", async () => { const menu = new SearchMenu_1.SearchMenu(context_helper_1.dummyContext, { showAllOnEmptySearch: false }); const item = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 1 }, }); const item2 = MenuItem_helper_1.createDummySearchableMenuItem({ searchPriorities: { something: 2 }, }); menu.setSearchItems([item, item2]); menu.flushBatch(); expect(menu.getItems()).toEqual([]); await menu.setSearch("hoi"); menu.flushBatch(); expect(menu.getItems()).toEqual([]); await menu.setSearch("something"); menu.flushBatch(); expect(menu.getItems()).toEqual([item2, item]); await menu.setSearch(""); menu.flushBatch(); expect(menu.getItems()).toEqual([]); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoTWVudS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tZW51cy9tZW51L190ZXN0cy9TZWFyY2hNZW51LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsOENBQXlDO0FBQ3pDLHVEQUFnRTtBQUNoRSw2REFBaUQ7QUFDakQsbUVBQTREO0FBQzVELDZDQUFxQztBQUVyQyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtJQUN4QixRQUFRLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO1FBQzVCLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7WUFDMUMsSUFBSSx1QkFBVSxDQUFDLDZCQUFZLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDeEMsSUFBSSx1QkFBVSxDQUFDLDZCQUFZLEVBQUU7Z0JBQ3pCLGFBQWEsRUFBRSxHQUFHO2FBQ3JCLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDSCxRQUFRLENBQUMsa0RBQWtELEVBQUUsR0FBRyxFQUFFO1FBQzlELElBQUksSUFBZ0IsQ0FBQztRQUNyQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxHQUFHLElBQUksdUJBQVUsQ0FBQyw2QkFBWSxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDekQsTUFBTSxJQUFJLEdBQUcsK0NBQTZCLENBQUM7Z0JBQ3ZDLGdCQUFnQixFQUFFLEVBQUMsU0FBUyxFQUFFLENBQUMsRUFBQzthQUNuQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sS0FBSyxHQUFHLCtDQUE2QixDQUFDLEVBQUMsZ0JBQWdCLEVBQUUs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