// // GhosttyMouseStateTests.swift // Ghostty // // Created by Lukas on 19.03.2026. // import XCTest final class GhosttyMouseStateTests: GhosttyCustomConfigCase { override static var runsForEachTargetApplicationUIConfiguration: Bool { false } // https://github.com/ghostty-org/ghostty/pull/11276 @MainActor func testSelectionFocusChange() async throws { let app = XCUIApplication() app.activate() // Write dummy text to a temp file, cat it into the terminal, then clean up let lines = (1...200).map { "Line \($0): The quick brown fox jumps over the lazy dog. Lorem ipsum dolor sit amet, consectetur adipiscing elit." } let text = lines.joined(separator: "\n") + "\n" let tmpFile = NSTemporaryDirectory() + "ghostty_test_dummy.txt" try text.write(toFile: tmpFile, atomically: true, encoding: .utf8) defer { try? FileManager.default.removeItem(atPath: tmpFile) } app.typeText("cat \(tmpFile)\r") app.menuItems["Command Palette"].firstMatch.click() let finder = XCUIApplication(bundleIdentifier: "com.apple.finder") finder.activate() app.activate() app.buttons .containing(NSPredicate(format: "label CONTAINS[c] 'Clear Screen'")) .firstMatch .click() let surface = app.groups["Terminal pane"] surface .coordinate(withNormalizedOffset: .zero) .withOffset(.init(dx: 20, dy: 10)) .click() surface .coordinate(withNormalizedOffset: .zero) .withOffset(.init(dx: 20, dy: surface.frame.height * 0.5)) .hover() NSPasteboard.general.clearContents() app.typeKey("c", modifierFlags: .command) XCTAssertEqual(NSPasteboard.general.string(forType: .string), nil, "Moving mouse shouldn't select any texts") } @MainActor func testSearchFocusState() async throws { let app = try ghosttyApplication() app.activate() XCTAssertTrue(app.windows.firstMatch.waitForExistence(timeout: 5), "New window should appear") app.typeKey("f", modifierFlags: .command) let textfield = app.textFields.firstMatch XCTAssertTrue(textfield.waitForExistence(timeout: 5), "Search field should appear") app.typeText("a") XCTAssertTrue(textfield.stringValue == "a", "Search text should be `a`") textfield.coordinate(withNormalizedOffset: .zero) .withOffset(.init(dx: textfield.frame.width * 0.5, dy: 0)) .click() app.typeText("b") XCTAssertTrue(textfield.stringValue == "ab", "Search text should be `ab`") // resign app.typeKey(.escape, modifierFlags: []) // dismiss app.typeKey(.escape, modifierFlags: []) XCTAssertTrue(textfield.waitForNonExistence(timeout: 5), "Search field should disappear") } } private extension XCUIElement { var stringValue: String? { (value as? String) } }