clone

a browser-first diagram editor with live svg previews, local drafts and encrypted, accountless sharing

main
diagramzip / apps / editor / test / source-editor.test.js
source-editor.test.js 2.7K
1import assert from 'node:assert/strict'2import test from 'node:test'3import { editorBackendFor } from '../src/source-editor.js'4import { createEditor } from '../src/editors/textarea-editor.js'56test('selects Monaco for precise pointers and textarea for coarse pointers', () => {7 assert.equal(editorBackendFor({ search: '', coarsePointer: false }), 'monaco')8 assert.equal(editorBackendFor({ search: '', coarsePointer: true }), 'textarea')9})1011test('allows an explicit diagnostic editor override', () => {12 assert.equal(editorBackendFor({ search: '?editor=textarea', coarsePointer: false }), 'textarea')13 assert.equal(editorBackendFor({ search: '?editor=monaco', coarsePointer: true }), 'monaco')14 assert.equal(editorBackendFor({ search: '?editor=unknown', coarsePointer: false }), 'monaco')15})1617test('textarea backend preserves source and suppresses programmatic change notifications', () => {18 const previousDocument = globalThis.document19 const textarea = new FakeTextarea()20 globalThis.document = { createElement: () => textarea }21 let changes = 022 let saves = 023 const element = {24 replaceChildren(child) {25 assert.equal(child, textarea)26 },27 }2829 try {30 const editor = createEditor({31 element,32 source: 'alpha\n',33 diagramType: 'mermaid',34 onChange: () => { changes += 1 },35 onSave: () => { saves += 1 },36 })3738 assert.equal(editor.getValue(), 'alpha\n')39 assert.equal(textarea.attributes.get('aria-label'), 'Diagram source editor')4041 textarea.selectionStart = 9942 textarea.selectionEnd = 9943 editor.setDocument({ source: 'βeta', diagramType: 'graphviz' })44 assert.equal(editor.getValue(), 'βeta')45 assert.equal(textarea.dataset.language, 'graphviz')46 assert.equal(textarea.selectionStart, 4)47 assert.equal(changes, 0)4849 textarea.value = 'βeta!\n'50 textarea.dispatchEvent(new Event('input'))51 assert.equal(editor.getValue(), 'βeta!\n')52 assert.equal(changes, 1)5354 const saveEvent = new Event('keydown', { cancelable: true })55 Object.assign(saveEvent, { metaKey: true, ctrlKey: false, key: 's' })56 textarea.dispatchEvent(saveEvent)57 assert.equal(saveEvent.defaultPrevented, true)58 assert.equal(saves, 1)5960 editor.dispose()61 textarea.dispatchEvent(new Event('input'))62 assert.equal(changes, 1)63 } finally {64 globalThis.document = previousDocument65 }66})6768class FakeTextarea extends EventTarget {69 constructor() {70 super()71 this.attributes = new Map()72 this.dataset = {}73 this.selectionStart = 074 this.selectionEnd = 075 this.value = ''76 }7778 setAttribute(name, value) {79 this.attributes.set(name, value)80 }8182 setSelectionRange(start, end) {83 this.selectionStart = start84 this.selectionEnd = end85 }8687 focus() {}88 remove() {}89}