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