cmux/cmuxUITests/SidebarResizeUITests.swift
2026-03-16 23:57:48 -07:00

103 lines
4.4 KiB
Swift

import XCTest
final class SidebarResizeUITests: XCTestCase {
override func setUp() {
super.setUp()
continueAfterFailure = false
}
func testSidebarResizerTracksCursor() {
let app = XCUIApplication()
app.launch()
let elements = app.descendants(matching: .any)
let resizer = elements["SidebarResizer"]
XCTAssertTrue(resizer.waitForExistence(timeout: 5.0))
XCTAssertTrue(waitForElementHittable(resizer, timeout: 5.0), "Expected sidebar resizer to become hittable")
let initialX = resizer.frame.minX
let start = resizer.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))
let end = start.withOffset(CGVector(dx: 80, dy: 0))
start.press(forDuration: 0.1, thenDragTo: end)
let afterX = resizer.frame.minX
let rightDelta = afterX - initialX
XCTAssertGreaterThanOrEqual(rightDelta, 40, "Expected drag-right to move resizer meaningfully")
XCTAssertLessThanOrEqual(rightDelta, 82, "Resizer moved farther than requested drag-right offset")
let startBack = resizer.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))
let endBack = startBack.withOffset(CGVector(dx: -120, dy: 0))
startBack.press(forDuration: 0.1, thenDragTo: endBack)
let afterBackX = resizer.frame.minX
let leftDelta = afterBackX - afterX
// Sidebar width is clamped in-product; a large left drag may hit the minimum width.
XCTAssertLessThanOrEqual(leftDelta, -40, "Expected drag-left to move resizer left")
XCTAssertGreaterThanOrEqual(leftDelta, -122, "Resizer moved farther than requested drag-left offset")
}
func testSidebarResizerAllowsSmallerMinimumWidth() {
let app = XCUIApplication()
app.launch()
let window = app.windows.firstMatch
XCTAssertTrue(window.waitForExistence(timeout: 5.0))
let elements = app.descendants(matching: .any)
let resizer = elements["SidebarResizer"]
XCTAssertTrue(resizer.waitForExistence(timeout: 5.0))
XCTAssertTrue(waitForElementHittable(resizer, timeout: 5.0), "Expected sidebar resizer to become hittable")
let start = resizer.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))
let farLeft = start.withOffset(CGVector(dx: -max(200, window.frame.width), dy: 0))
start.press(forDuration: 0.1, thenDragTo: farLeft)
let sidebarWidth = max(0, resizer.frame.midX - window.frame.minX)
XCTAssertLessThanOrEqual(
sidebarWidth,
185,
"Expected sidebar minimum width to allow a narrower sidebar than the previous 186 px floor. width=\(sidebarWidth)"
)
}
func testSidebarResizerHasMaximumWidthCap() {
let app = XCUIApplication()
app.launch()
let window = app.windows.firstMatch
XCTAssertTrue(window.waitForExistence(timeout: 5.0))
let elements = app.descendants(matching: .any)
let resizer = elements["SidebarResizer"]
XCTAssertTrue(resizer.waitForExistence(timeout: 5.0))
XCTAssertTrue(waitForElementHittable(resizer, timeout: 5.0), "Expected sidebar resizer to become hittable")
let start = resizer.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))
let farRight = start.withOffset(CGVector(dx: max(1200, window.frame.width * 2.0), dy: 0))
start.press(forDuration: 0.1, thenDragTo: farRight)
let windowFrame = window.frame
let remainingWidth = max(0, windowFrame.maxX - resizer.frame.maxX)
let minimumExpectedRemaining = windowFrame.width * 0.45
XCTAssertGreaterThanOrEqual(
remainingWidth,
minimumExpectedRemaining,
"Expected sidebar max-width clamp to leave substantial terminal width. " +
"remaining=\(remainingWidth), window=\(windowFrame.width)"
)
}
private func waitForElementHittable(_ element: XCUIElement, timeout: TimeInterval) -> Bool {
let expectation = XCTNSPredicateExpectation(
predicate: NSPredicate { _, _ in
guard element.exists, element.isHittable else { return false }
let frame = element.frame
return frame.width > 1 && frame.height > 1
},
object: NSObject()
)
return XCTWaiter().wait(for: [expectation], timeout: timeout) == .completed
}
}