add combos tool
All checks were successful
Deploy Sokko G / deploy (push) Successful in 7s

This commit is contained in:
Shinuwa 2026-07-31 14:46:28 +02:00
parent 025cd4bf22
commit 7b4cfb7dc2
13 changed files with 1829 additions and 2 deletions

View file

@ -4,7 +4,7 @@ import assert from "node:assert/strict";
import { evaluateTableCell } from "../website/src/features/toolboxes/modules/tableFormulaEngine.js";
import { parseColonImportLines } from "../website/src/features/toolboxes/modules/textImport.js";
import { getTimePatternRecurrenceMs, getTimePatternTargetMs } from "../website/src/features/toolboxes/modules/timerUtils.js";
import { compactModuleDataForStorage, createToolboxExportPayload, normalizeNotepadData, normalizeTableData, normalizeTaskPlannerData } from "../website/src/features/toolboxes/storage/toolboxStorage.js";
import { compactModuleDataForStorage, createToolboxExportPayload, normalizeCombosData, normalizeNotepadData, normalizeTableData, normalizeTaskPlannerData } from "../website/src/features/toolboxes/storage/toolboxStorage.js";
test("colon text import keeps urls intact after the first separator", () => {
assert.deepEqual(parseColonImportLines("Build:https://example.com/build?class=rogue\nPotion:10"), [
@ -95,6 +95,82 @@ test("table storage clamps dimensions and compacts non-empty cells", () => {
assert.equal(compactModuleDataForStorage("table", { rows: 10, columns: 6, cells: {} }), null);
});
test("combos storage normalizes devices, steps and compact export ids", () => {
const longText = "x".repeat(120);
const normalized = normalizeCombosData({
device: "invalid",
combos: [
{
id: "rootCombo",
name: "Root",
device: "switch",
inputs: [[{ kind: "button", value: "triangle" }]]
}
],
categories: [
{
id: "category1",
title: `${longText} `,
collapsed: true,
combos: [
{
id: "combo1",
device: "n64",
name: `${longText} `,
inputs: [
[
{ kind: "direction", value: "down" },
{ kind: "button", value: "cross" },
{ kind: "bad", value: "ignored" }
],
[],
[{ kind: "key", value: "space" }]
]
},
{ id: "empty", name: " ", inputs: [] }
]
},
{ id: "emptyCategory", title: " ", combos: [] },
{ id: "titledEmptyCategory", title: "Empty", combos: [] }
]
});
assert.equal(normalized.device, "playstation");
assert.equal(normalized.combos.length, 1);
assert.equal(normalized.combos[0].device, "switch");
assert.equal(normalized.categories.length, 1);
assert.equal(normalized.categories[0].title.length, 80);
assert.equal(normalized.categories[0].collapsed, true);
assert.equal(normalized.categories[0].combos.length, 1);
assert.equal(normalized.categories[0].combos[0].name.length, 80);
assert.equal("note" in normalized.categories[0].combos[0], false);
assert.deepEqual(normalized.categories[0].combos[0].inputs, [
[
{ kind: "direction", value: "down" },
{ kind: "button", value: "cross" }
],
[{ kind: "key", value: "space" }]
]);
const compact = compactModuleDataForStorage("combos", { ...normalized, device: "xbox" });
assert.equal(compact.device, "xbox");
assert.equal(compact.combos[0].id, "rootCombo");
assert.equal(compact.combos[0].device, "switch");
assert.equal(compact.categories[0].id, "category1");
assert.equal(compact.categories[0].combos[0].device, "n64");
assert.equal(compact.categories[0].combos[0].id, "combo1");
const exported = createToolboxExportPayload(
{ id: "toolbox1", name: "Combos", modules: [{ id: "module1", type: "combos" }], updatedAt: "2026-01-01T00:00:00.000Z" },
{ "toolbox1:module1": compact }
);
assert.equal(exported.modules.m1.combos[0].id, "o1");
assert.equal(exported.modules.m1.combos[0].device, "switch");
assert.equal(exported.modules.m1.categories[0].id, "g1");
assert.equal(exported.modules.m1.categories[0].combos[0].id, "o2");
assert.equal(exported.modules.m1.categories[0].combos[0].device, "n64");
});
test("notepad data migrates text, sanitizes html and compacts drawings", () => {
const migrated = normalizeNotepadData({ text: "Boss\nPhase 2" });
assert.equal(migrated.text, "Boss\nPhase 2");