diff --git a/Sources/Zero/Views/CodeEditorView.swift b/Sources/Zero/Views/CodeEditorView.swift index f9e7143..ccb70e8 100644 --- a/Sources/Zero/Views/CodeEditorView.swift +++ b/Sources/Zero/Views/CodeEditorView.swift @@ -82,12 +82,12 @@ class HighlightedTextView: NSTextView { super.mouseDown(with: event) } - func setup(language: String) { + func setup(language: String, themeName: String = "xcode") { self.currentLanguage = language highlightr = Highlightr() - if highlightr?.setTheme(to: "xcode") == false { - print("Failed to load theme: xcode") + if highlightr?.setTheme(to: themeName) == false { + AppLogStore.shared.append("Failed to load theme: \(themeName)") } isEditable = true diff --git a/Tests/ZeroTests/CodeEditorViewTests.swift b/Tests/ZeroTests/CodeEditorViewTests.swift new file mode 100644 index 0000000..bbb59eb --- /dev/null +++ b/Tests/ZeroTests/CodeEditorViewTests.swift @@ -0,0 +1,58 @@ +import XCTest +import Darwin +import Foundation +@testable import Zero + +@MainActor +final class CodeEditorViewTests: XCTestCase { + override func setUp() { + super.setUp() + AppLogStore.shared.clear() + } + + override func tearDown() { + AppLogStore.shared.clear() + super.tearDown() + } + + func testSetupWithInvalidThemeDoesNotPrintToStdout() { + let textView = HighlightedTextView(frame: .zero) + + let stdout = captureStdout { + textView.setup(language: "swift", themeName: "__invalid_theme__") + } + + XCTAssertTrue(stdout.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty) + } + + func testSetupWithInvalidThemeAppendsFailureToAppLogStore() { + let textView = HighlightedTextView(frame: .zero) + + textView.setup(language: "swift", themeName: "__invalid_theme__") + + let logEntries = AppLogStore.shared.recentEntries() + XCTAssertTrue(logEntries.contains { entry in + entry.contains("Failed to load theme") && entry.contains("__invalid_theme__") + }) + } + + private func captureStdout(_ operation: () -> Void) -> String { + fflush(stdout) + + let outputPipe = Pipe() + let originalStdout = dup(STDOUT_FILENO) + dup2(outputPipe.fileHandleForWriting.fileDescriptor, STDOUT_FILENO) + + operation() + + fflush(stdout) + dup2(originalStdout, STDOUT_FILENO) + close(originalStdout) + + outputPipe.fileHandleForWriting.closeFile() + let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile() + outputPipe.fileHandleForReading.closeFile() + + return String(data: outputData, encoding: .utf8) ?? "" + } +}