diff --git a/Package.swift b/Package.swift index 452e602..e49b1ef 100644 --- a/Package.swift +++ b/Package.swift @@ -62,6 +62,10 @@ let package = Package( .testTarget( name: "SaplingCoreTests", dependencies: ["SaplingCore"] + ), + .testTarget( + name: "SaplingEditorTests", + dependencies: ["SaplingCore", "SaplingEditor"] ) ] ) diff --git a/Tests/SaplingEditorTests/EditorStateTests.swift b/Tests/SaplingEditorTests/EditorStateTests.swift new file mode 100644 index 0000000..1fb9807 --- /dev/null +++ b/Tests/SaplingEditorTests/EditorStateTests.swift @@ -0,0 +1,59 @@ +import XCTest +import SaplingCore +@testable import SaplingEditor + +final class EditorStateTests: XCTestCase { + func testActiveLineFollowsSelection() { + let source = "# Heading\nRendered **line**\nRaw source line" + let document = EditorDocument( + url: URL(fileURLWithPath: "/tmp/EditorStateTests.md"), + title: "EditorStateTests", + source: source + ) + var state = EditorState(document: document) + + let secondLineLocation = (source as NSString).range(of: "Rendered").location + state.updateSelection(EditorSelection(location: secondLineLocation, length: 0)) + + XCTAssertEqual(state.activeLineIndex, 1) + XCTAssertEqual(state.lines[0].mode, .rendered) + XCTAssertEqual(state.lines[1].mode, .source) + XCTAssertEqual(state.lines[2].mode, .rendered) + } + + func testUpdatingSourceTracksUnsavedChanges() { + let document = EditorDocument( + url: URL(fileURLWithPath: "/tmp/EditorStateTests.md"), + title: "EditorStateTests", + source: "Initial" + ) + var state = EditorState(document: document) + + state.updateSource("Initial\nChanged") + + XCTAssertTrue(state.hasUnsavedChanges) + XCTAssertEqual(state.lines.count, 2) + + state.markSaved() + + XCTAssertFalse(state.hasUnsavedChanges) + } + + @MainActor + func testViewModelSavesDocumentToDisk() throws { + let directory = FileManager.default.temporaryDirectory + .appendingPathComponent(UUID().uuidString, isDirectory: true) + try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true) + let url = directory.appendingPathComponent("Note.md") + try "# Note\n".write(to: url, atomically: true, encoding: .utf8) + + let document = try HybridMarkdownEditorViewModel.loadDocument(at: url) + let viewModel = HybridMarkdownEditorViewModel(document: document) + viewModel.updateSource("# Note\n\nUpdated") + try viewModel.save() + + let saved = try String(contentsOf: url, encoding: .utf8) + XCTAssertEqual(saved, "# Note\n\nUpdated") + XCTAssertFalse(viewModel.hasUnsavedChanges) + } +}