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) } }