120 lines
4.4 KiB
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
|