Files
t8y2--dbx/packages/app-tests/closeBracketsExtension.test.ts
2026-07-13 13:09:14 +08:00

87 lines
3.2 KiB
TypeScript
Vendored

import { strict as assert } from "node:assert";
import { test } from "vitest";
import { closeBrackets, closeBracketsKeymap } from "@codemirror/autocomplete";
import { EditorState, Compartment } from "@codemirror/state";
import { keymap } from "@codemirror/view";
/**
* Replicates the closeBracketsExtension logic from QueryEditor.vue so we can
* verify that the Compartment-based toggle correctly includes/excludes both
* the closeBrackets() extension and the closeBracketsKeymap.
*/
function closeBracketsExtension(enabled: boolean) {
if (!enabled) return [];
const exts: any[] = [closeBrackets()];
if (closeBracketsKeymap.length) {
exts.push(keymap.of([...closeBracketsKeymap]));
}
return exts;
}
test("closeBracketsExtension returns empty array when disabled", () => {
const exts = closeBracketsExtension(false);
assert.deepEqual(exts, []);
});
test("closeBracketsExtension includes closeBrackets and its keymap when enabled", () => {
const exts = closeBracketsExtension(true);
assert.equal(exts.length, 2, "should contain closeBrackets() and keymap");
});
test("closeBracketsKeymap is non-empty so the keymap entry is always included when enabled", () => {
assert.ok(closeBracketsKeymap.length > 0, "closeBracketsKeymap should have bindings");
});
test("Compartment can create EditorState with closeBrackets enabled", () => {
const comp = new Compartment();
const state = EditorState.create({
doc: "select 1",
extensions: [comp.of(closeBracketsExtension(true))],
});
assert.ok(state.toJSON().doc, "state should be created with closeBrackets enabled");
});
test("Compartment reconfigure from enabled to disabled succeeds", () => {
const comp = new Compartment();
const stateOn = EditorState.create({
doc: "select 1",
extensions: [comp.of(closeBracketsExtension(true))],
});
// Toggle off — this verifies that closeBracketsExtension(false) returns []
// which means both the extension and the keymap are removed
const stateOff = stateOn.update({ effects: comp.reconfigure(closeBracketsExtension(false)) }).state;
assert.equal(stateOff.toJSON().doc, "select 1", "state should still be valid after reconfigure to disabled");
});
test("Compartment reconfigure from disabled to enabled succeeds", () => {
const comp = new Compartment();
const stateOff = EditorState.create({
doc: "select 1",
extensions: [comp.of(closeBracketsExtension(false))],
});
// Toggle on — this verifies that closeBracketsExtension(true) returns both
// the closeBrackets() extension and the keymap
const stateOn = stateOff.update({ effects: comp.reconfigure(closeBracketsExtension(true)) }).state;
assert.equal(stateOn.toJSON().doc, "select 1", "state should still be valid after reconfigure to enabled");
});
test("closeBracketsExtension(false) produces zero extensions", () => {
// The key assertion: when disabled, both closeBrackets() and
// closeBracketsKeymap are absent — no partial keymap leakage
const exts = closeBracketsExtension(false);
assert.equal(exts.length, 0);
});
test("closeBracketsExtension(true) produces exactly two extension groups", () => {
// When enabled, both closeBrackets() and the keymap are present
const exts = closeBracketsExtension(true);
assert.equal(exts.length, 2);
});