import AppKit import ConjureKit import Testing @testable import Conjure @Test @MainActor func noteFormattingHidesSyntaxButPreservesMarkdownAndLiteralCode() throws { _ = NSApplication.shared let editor = NotesTextView(frame: NSRect(x: 0, y: 0, width: 600, height: 800)) let source = "# Heading\n## Subheading\n*italic* **bold** _emphasis_ __strong__ ~~gone~~ `*literal*`\n> Quote\n[Label](https://example.com)\n```text\n# Code *literal*\n```\nUnmatched * and \\*escaped*" editor.setMarkdownContents(NSAttributedString(string: source)) MarkdownHighlighting.apply(to: editor) editor.refreshTasks() let layout = try #require(editor.layoutManager) let container = try #require(editor.textContainer) layout.ensureLayout(for: container) func visibleText() -> String { var result = "" let text = editor.string as NSString for index in 0.. [NSView] { [view] + view.subviews.flatMap(descendants) } let editor = try #require(descendants(controller.view).compactMap { $0 as? NotesTextView }.first) window.makeFirstResponder(editor) editor.insertText("# Title\n*word*", replacementRange: NSRange(location: 0, length: 0)) editor.setSelectedRange(NSRange(location: 0, length: 0)) editor.insertText("A", replacementRange: editor.selectedRange()) #expect(editor.markdownString == "# ATitle\n*word*") editor.breakUndoCoalescing() editor.undoManager?.removeAllActions() editor.undoManager?.beginUndoGrouping() editor.setSelectedRange(NSRange(location: editor.string.utf16.count, length: 0)) editor.deleteBackward(nil) editor.undoManager?.endUndoGrouping() #expect(editor.markdownString == "# ATitle\n*wor*") editor.undoManager?.undo() #expect(editor.markdownString == "# ATitle\n*word*") let word = (editor.string as NSString).range(of: "word") editor.setSelectedRange(NSRange(location: word.location, length: 0)) editor.moveRight(nil) #expect(editor.selectedRange().location == word.location + 1) editor.setSelectedRange(NSRange(location: NSMaxRange(word), length: 0)) editor.moveRight(nil) #expect(editor.selectedRange().location == editor.string.utf16.count) editor.setSelectedRange(NSRange(location: word.location, length: 0)) let italic = try #require(descendants(controller.view).compactMap { $0 as? NSButton }.first { $0.toolTip == "Italic" }) // Selecting the body and toggling formatting must remove its hidden delimiters. editor.setSelectedRange(word) italic.performClick(nil) #expect(editor.markdownString == "# ATitle\nword") #expect(controller.save()) #expect(try NotesStore(directory: directory).notes.first?.contents.string == "# ATitle\nword") }