Sapling/Tests/SaplingEditorTests/MarkdownPresentationSnapshotTests.swift

120 lines
4.4 KiB
Swift

import XCTest
@testable import SaplingEditor
#if os(macOS)
import AppKit
final class MarkdownPresentationSnapshotTests: XCTestCase {
func testInitialUnfocusedPresentationRendersHeading() {
let source = "# Heading\nParagraph"
let snapshot = MarkdownPresentationSnapshot.make(source: source, activeLineIndex: -1)
XCTAssertTrue(snapshot.signature.contains("system:28.000"))
XCTAssertTrue(snapshot.signature.contains("hidden=true"))
}
func testDirtyActiveLineRoundTripMatchesFreshPresentation() {
let source = """
# Heading
Paragraph with enough words to exercise wrapping and paragraph style.
* [ ] Move with arrow keys.
"""
let lineIndex = DocumentLineIndex(source: source)
let storage = NSTextStorage(string: source)
MarkdownTextStyler.apply(
to: storage,
lineIndex: lineIndex,
invalidationPlan: EditorDirtyLineInvalidator.plan(
previousText: nil,
currentLineIndex: lineIndex,
edit: nil,
previousActiveLineIndex: nil,
currentActiveLineIndex: -1
),
activeLineIndex: -1,
backgroundColor: .textBackgroundColor,
activeLineBackgroundColor: .controlAccentColor.withAlphaComponent(0.10),
textColor: .labelColor,
secondaryTextColor: .secondaryLabelColor,
accentColor: .controlAccentColor,
usesRenderedControls: true
)
MarkdownTextStyler.apply(
to: storage,
lineIndex: lineIndex,
invalidationPlan: EditorDirtyLineInvalidationPlan(
reason: .activeLineChange,
isFullRender: false,
dirtyLineIndexes: [1]
),
activeLineIndex: 1,
backgroundColor: .textBackgroundColor,
activeLineBackgroundColor: .controlAccentColor.withAlphaComponent(0.10),
textColor: .labelColor,
secondaryTextColor: .secondaryLabelColor,
accentColor: .controlAccentColor,
usesRenderedControls: true
)
MarkdownTextStyler.apply(
to: storage,
lineIndex: lineIndex,
invalidationPlan: EditorDirtyLineInvalidationPlan(
reason: .activeLineChange,
isFullRender: false,
dirtyLineIndexes: [1]
),
activeLineIndex: -1,
backgroundColor: .textBackgroundColor,
activeLineBackgroundColor: .controlAccentColor.withAlphaComponent(0.10),
textColor: .labelColor,
secondaryTextColor: .secondaryLabelColor,
accentColor: .controlAccentColor,
usesRenderedControls: true
)
let roundTrip = MarkdownPresentationSnapshot.make(from: storage, lineIndex: lineIndex)
let fresh = MarkdownPresentationSnapshot.make(source: source, activeLineIndex: -1)
XCTAssertEqual(roundTrip, fresh)
}
func testChecklistContentGeometryIsStableAcrossToggleState() throws {
let unchecked = "* [ ] Move with arrow keys."
let checked = "* [x] Move with arrow keys."
let uncheckedOrigin = MarkdownPresentationSnapshot.contentOrigin(
source: unchecked,
text: "Move",
activeLineIndex: -1,
usesRenderedControls: true
)
let checkedOrigin = MarkdownPresentationSnapshot.contentOrigin(
source: checked,
text: "Move",
activeLineIndex: -1,
usesRenderedControls: true
)
let uncheckedPoint = try XCTUnwrap(uncheckedOrigin)
let checkedPoint = try XCTUnwrap(checkedOrigin)
XCTAssertEqual(uncheckedPoint.x, checkedPoint.x, accuracy: 0.001)
XCTAssertEqual(uncheckedPoint.y, checkedPoint.y, accuracy: 0.001)
}
func testParagraphGeometryIsStableAcrossRepeatedPresentation() {
let source = """
Intro paragraph with enough words to wrap in a predictable container width for presentation snapshots.
Another paragraph that should keep the same geometry when presentation is regenerated.
"""
let first = MarkdownPresentationSnapshot.make(source: source, activeLineIndex: -1, containerWidth: 240)
let second = MarkdownPresentationSnapshot.make(source: source, activeLineIndex: -1, containerWidth: 240)
XCTAssertEqual(first, second)
}
}
#endif