import XCTest @testable import SaplingEditor #if os(macOS) import AppKit @MainActor final class HybridMarkdownLiveEditorHarnessTests: XCTestCase { func testLiveInitialFirstResponderDoesNotShowHeadingSourceBeforeUserInteraction() { let harness = HybridMarkdownLiveEditorHarness(source: "# Heading\nParagraph") harness.simulateLaunchFirstResponder() XCTAssertTrue(harness.headingMarkerIsHidden()) } func testLiveParagraphGeometryReturnsAfterClickAndFocusAway() throws { let source = """ # Heading Paragraph with **bold**, *italic*, `code`, and [Link](https://example.com) markers. Outro """ let harness = HybridMarkdownLiveEditorHarness(source: source) harness.simulateLaunchFirstResponder() let initialPoint = try XCTUnwrap(harness.point(for: "Paragraph")) let paragraphLocation = (source as NSString).range(of: "bold").location harness.setSelection(NSRange(location: paragraphLocation, length: 0)) harness.simulateFocusAway() let finalPoint = try XCTUnwrap(harness.point(for: "Paragraph")) XCTAssertEqual(initialPoint.x, finalPoint.x, accuracy: 0.001) XCTAssertEqual(initialPoint.y, finalPoint.y, accuracy: 0.001) } func testLiveCheckboxClickPreservesSelectionActiveLineAndGeometry() throws { let source = "Editing here\n* [ ] Move with arrow keys." let editingRange = (source as NSString).range(of: "Editing") let harness = HybridMarkdownLiveEditorHarness( source: source, selectedRange: NSRange(location: editingRange.location, length: 0) ) harness.simulateLaunchFirstResponder() harness.setSelection(NSRange(location: editingRange.location, length: 0)) let selectionBefore = harness.selectedRange() let activeLineBefore = harness.effectiveActiveLineIndex() let labelPointBefore = try XCTUnwrap(harness.point(for: "Move")) let checkboxFrameBefore = try XCTUnwrap(harness.checklistButtonFrame(lineIndex: 1)) harness.clickRenderedCheckbox(lineIndex: 1) let labelPointAfter = try XCTUnwrap(harness.point(for: "Move")) let checkboxFrameAfter = try XCTUnwrap(harness.checklistButtonFrame(lineIndex: 1)) XCTAssertEqual(harness.selectedRange(), selectionBefore) XCTAssertEqual(harness.effectiveActiveLineIndex(), activeLineBefore) XCTAssertTrue(harness.source().contains("* [x] Move with arrow keys.")) XCTAssertEqual(labelPointBefore.x, labelPointAfter.x, accuracy: 0.001) XCTAssertEqual(labelPointBefore.y, labelPointAfter.y, accuracy: 0.001) XCTAssertEqual(checkboxFrameBefore.origin.x, checkboxFrameAfter.origin.x, accuracy: 0.001) XCTAssertEqual(checkboxFrameBefore.origin.y, checkboxFrameAfter.origin.y, accuracy: 0.001) XCTAssertEqual(checkboxFrameBefore.size.width, checkboxFrameAfter.size.width, accuracy: 0.001) XCTAssertEqual(checkboxFrameBefore.size.height, checkboxFrameAfter.size.height, accuracy: 0.001) } } #endif