import XCTest @testable import CommandNotch final class TerminalScrollCoordinatorTests: XCTestCase { func testScrollAwayFromBottomDisablesOutputFollow() { let coordinator = TerminalScrollCoordinator() coordinator.terminalDidScroll(to: 0.42, canScroll: true) XCTAssertFalse(coordinator.followsOutput) XCTAssertEqual(coordinator.outputRestorePosition(canScroll: true) ?? .nan, 0.42, accuracy: 0.0001) } func testTypingReEnablesFollowAndRequestsJumpToBottom() { let coordinator = TerminalScrollCoordinator() coordinator.terminalDidScroll(to: 0.42, canScroll: true) let shouldJump = coordinator.userDidStartTyping() XCTAssertTrue(shouldJump) XCTAssertTrue(coordinator.followsOutput) XCTAssertNil(coordinator.outputRestorePosition(canScroll: true)) } func testScrollingBackToBottomReEnablesOutputFollow() { let coordinator = TerminalScrollCoordinator() coordinator.terminalDidScroll(to: 0.42, canScroll: true) coordinator.terminalDidScroll(to: 1, canScroll: true) XCTAssertTrue(coordinator.followsOutput) XCTAssertNil(coordinator.outputRestorePosition(canScroll: true)) } func testSuppressedTrackingIgnoresProgrammaticScrollUpdates() { let coordinator = TerminalScrollCoordinator() coordinator.terminalDidScroll(to: 0.42, canScroll: true) coordinator.suppressTracking { coordinator.terminalDidScroll(to: 1, canScroll: true) } XCTAssertFalse(coordinator.followsOutput) XCTAssertEqual(coordinator.outputRestorePosition(canScroll: true) ?? .nan, 0.42, accuracy: 0.0001) } func testMouseCaptureCoordinatorSuppressesStaleCaptureAfterCommandFinish() { let coordinator = TerminalMouseCaptureCoordinator() let requiresReset = coordinator.commandDidFinish(mouseCaptured: true) XCTAssertFalse(coordinator.shouldForwardMouseInput(mouseCaptured: true)) XCTAssertTrue(coordinator.shouldBypassEnhancedKeyboardInput(mouseCaptured: true)) XCTAssertTrue(coordinator.suppressesMouseReporting) XCTAssertTrue(requiresReset) } func testMouseCaptureCoordinatorDoesNotRequestResetForCleanCommandFinish() { let coordinator = TerminalMouseCaptureCoordinator() let requiresReset = coordinator.commandDidFinish(mouseCaptured: false) XCTAssertFalse(requiresReset) XCTAssertFalse(coordinator.shouldBypassEnhancedKeyboardInput(mouseCaptured: false)) XCTAssertTrue(coordinator.shouldForwardMouseInput(mouseCaptured: false)) } func testMouseCaptureCoordinatorClearsSuppressionWhenCaptureDrops() { let coordinator = TerminalMouseCaptureCoordinator() coordinator.commandDidFinish(mouseCaptured: true) XCTAssertFalse(coordinator.shouldBypassEnhancedKeyboardInput(mouseCaptured: false)) XCTAssertTrue(coordinator.shouldForwardMouseInput(mouseCaptured: false)) XCTAssertFalse(coordinator.suppressesMouseReporting) } func testMouseCaptureCoordinatorClearsSuppressionWhenUserSubmitsCommand() { let coordinator = TerminalMouseCaptureCoordinator() coordinator.commandDidFinish(mouseCaptured: true) coordinator.userDidSubmitCommand() XCTAssertTrue(coordinator.shouldForwardMouseInput(mouseCaptured: true)) XCTAssertFalse(coordinator.suppressesMouseReporting) } }