mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-28 06:22:45 -08:00
111 lines
3.3 KiB
TypeScript
111 lines
3.3 KiB
TypeScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { KikuFieldGroupingChoice } from '../../types';
|
|
import { createFieldGroupingCallbackRuntime, sendToVisibleOverlayRuntime } from './overlay-bridge';
|
|
|
|
test('sendToVisibleOverlayRuntime restores visibility flag when opening hidden overlay modal', () => {
|
|
const sent: unknown[][] = [];
|
|
const restoreSet = new Set<'runtime-options' | 'subsync'>();
|
|
let visibleOverlayVisible = false;
|
|
|
|
const ok = sendToVisibleOverlayRuntime({
|
|
mainWindow: {
|
|
isDestroyed: () => false,
|
|
webContents: {
|
|
isLoading: () => false,
|
|
send: (...args: unknown[]) => {
|
|
sent.push(args);
|
|
},
|
|
},
|
|
} as unknown as Electron.BrowserWindow,
|
|
visibleOverlayVisible,
|
|
setVisibleOverlayVisible: (visible: boolean) => {
|
|
visibleOverlayVisible = visible;
|
|
},
|
|
channel: 'runtime-options:open',
|
|
restoreOnModalClose: 'runtime-options',
|
|
restoreVisibleOverlayOnModalClose: restoreSet,
|
|
});
|
|
|
|
assert.equal(ok, true);
|
|
assert.equal(visibleOverlayVisible, true);
|
|
assert.equal(restoreSet.has('runtime-options'), true);
|
|
assert.deepEqual(sent, [['runtime-options:open']]);
|
|
});
|
|
|
|
test('sendToVisibleOverlayRuntime waits for overlay page before sending open command', () => {
|
|
const sent: unknown[][] = [];
|
|
const restoreSet = new Set<'runtime-options' | 'subsync'>();
|
|
let loading = true;
|
|
let currentURL = '';
|
|
const finishCallbacks: Array<() => void> = [];
|
|
|
|
const ok = sendToVisibleOverlayRuntime({
|
|
mainWindow: {
|
|
isDestroyed: () => false,
|
|
webContents: {
|
|
isLoading: () => loading,
|
|
getURL: () => currentURL,
|
|
send: (...args: unknown[]) => {
|
|
sent.push(args);
|
|
},
|
|
once: (_event: string, callback: () => void) => {
|
|
finishCallbacks.push(callback);
|
|
},
|
|
},
|
|
} as unknown as Electron.BrowserWindow,
|
|
visibleOverlayVisible: false,
|
|
setVisibleOverlayVisible: () => {},
|
|
channel: 'runtime-options:open',
|
|
restoreOnModalClose: 'runtime-options',
|
|
restoreVisibleOverlayOnModalClose: restoreSet,
|
|
});
|
|
|
|
assert.equal(ok, true);
|
|
assert.deepEqual(sent, []);
|
|
assert.equal(restoreSet.has('runtime-options'), true);
|
|
|
|
loading = false;
|
|
currentURL = 'file:///overlay/index.html?layer=visible';
|
|
assert.ok(finishCallbacks[0]);
|
|
finishCallbacks[0]!();
|
|
|
|
assert.deepEqual(sent, [['runtime-options:open']]);
|
|
});
|
|
|
|
test('createFieldGroupingCallbackRuntime cancels when overlay request cannot be sent', async () => {
|
|
let resolver: ((choice: KikuFieldGroupingChoice) => void) | null = null;
|
|
const callback = createFieldGroupingCallbackRuntime<'runtime-options' | 'subsync'>({
|
|
getVisibleOverlayVisible: () => false,
|
|
setVisibleOverlayVisible: () => {},
|
|
getResolver: () => resolver,
|
|
setResolver: (next) => {
|
|
resolver = next;
|
|
},
|
|
sendToVisibleOverlay: () => false,
|
|
});
|
|
|
|
const result = await callback({
|
|
original: {
|
|
noteId: 1,
|
|
expression: 'a',
|
|
sentencePreview: 'a',
|
|
hasAudio: false,
|
|
hasImage: false,
|
|
isOriginal: true,
|
|
},
|
|
duplicate: {
|
|
noteId: 2,
|
|
expression: 'b',
|
|
sentencePreview: 'b',
|
|
hasAudio: false,
|
|
hasImage: false,
|
|
isOriginal: false,
|
|
},
|
|
});
|
|
|
|
assert.equal(result.cancelled, true);
|
|
assert.equal(result.keepNoteId, 0);
|
|
assert.equal(result.deleteNoteId, 0);
|
|
});
|