textmachine/frontend/src/showcase/documents.test.ts

66 lines
2.5 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import {
closeDocument,
noDocuments,
openedIds,
pinDocument,
previewDocument,
selectDocument,
} from './documents';
// The owner's complaint (2) in executable form: five single clicks must leave ONE tab in the row.
describe('the VS Code tab model', () => {
it('five single clicks give exactly one preview tab', () => {
let documents = noDocuments;
for (const id of ['ch_1', 'ch_2', 'ch_3', 'ch_4', 'ch_5']) {
documents = previewDocument(documents, id);
}
expect(openedIds(documents)).toEqual(['ch_5']);
expect(documents.active).toBe('ch_5');
});
it('pinning makes the preview permanent, the next click opens a new one beside it', () => {
let documents = previewDocument(noDocuments, 'ch_1');
documents = pinDocument(documents, 'ch_1');
expect(documents.preview).toBeNull();
documents = previewDocument(documents, 'ch_2');
expect(openedIds(documents)).toEqual(['ch_1', 'ch_2']);
expect(documents.preview).toBe('ch_2');
// And the next single click replaces ONLY the preview, leaving the pinned one alone.
documents = previewDocument(documents, 'ch_3');
expect(openedIds(documents)).toEqual(['ch_1', 'ch_3']);
});
it('a click on an already pinned tab selects it and does not start a preview', () => {
let documents = pinDocument(previewDocument(noDocuments, 'ch_1'), 'ch_1');
documents = previewDocument(documents, 'ch_2');
documents = previewDocument(documents, 'ch_1');
expect(documents.active).toBe('ch_1');
expect(documents.preview).toBe('ch_2');
});
it('closing the selected tab moves the selection to the neighbour on the right', () => {
let documents = noDocuments;
for (const id of ['a', 'b', 'c']) documents = pinDocument(documents, id);
documents = selectDocument(documents, 'b');
documents = closeDocument(documents, 'b');
expect(documents.active).toBe('c');
expect(openedIds(documents)).toEqual(['a', 'c']);
});
it('closing the last tab leaves the centre empty rather than selected into nowhere', () => {
const documents = closeDocument(previewDocument(noDocuments, 'ch_1'), 'ch_1');
expect(openedIds(documents)).toEqual([]);
expect(documents.active).toBe('');
});
it('closing a tab that is NOT selected does not move the selection', () => {
let documents = noDocuments;
for (const id of ['a', 'b']) documents = pinDocument(documents, id);
const after = closeDocument(documents, 'a');
expect(after.active).toBe('b');
});
});