import XCTest final class SubBannerGestureUITests: XCTestCase { private var app: XCUIApplication! private func launch(_ arguments: [String] = []) { continueAfterFailure = false app = XCUIApplication() app.launchArguments = arguments app.launchEnvironment["SB_TEST_NAME"] = name app.launch() XCTAssertTrue(app.staticTexts["tap-status"].waitForExistence(timeout: 5)) if !arguments.contains("empty") { XCTAssertTrue(page(1, total: arguments.contains("single") ? 1 : (arguments.contains("active") ? 2 : 3)).waitForExistence(timeout: 5)) } } private func page(_ index: Int, total: Int = 3) -> XCUIElement { app.buttons["\(index) / \(total)"].firstMatch } private func status(_ count: Int, _ last: Int = 0) { XCTAssertEqual(app.staticTexts["tap-status"].label, "taps=\(count);last=\(last)") } private func drag(_ index: Int, from: CGFloat = 0.8, to: CGFloat = 0.2, duration: TimeInterval = 0.05, total: Int = 3) { let banner = page(index, total: total) banner.coordinate(withNormalizedOffset: CGVector(dx: from, dy: 0.5)) .press(forDuration: duration, thenDragTo: banner.coordinate(withNormalizedOffset: CGVector(dx: to, dy: 0.5))) } func testSwipeDoesNotTap() { launch() drag(1) XCTAssertTrue(page(2).exists) status(0) page(2).tap() status(1, 2) } func testDirectionsWrapShortDragAndTap() { launch() page(1).tap() status(1, 1) drag(1, from: 0.2, to: 0.8) XCTAssertTrue(page(3).exists) status(1, 1) page(3).tap() status(2, 3) drag(3) XCTAssertTrue(page(1).exists) status(2, 3) drag(1, from: 0.5, to: 0.41) XCTAssertTrue(page(1).exists) status(2, 3) drag(1, from: 0.5, to: 0.455) status(2, 3) page(1).tap() status(3, 1) XCTAssertEqual(app.buttons.matching(NSPredicate(format: "label == '1 / 3'")).count, 1) } func testVerticalParentScrollDoesNotTap() { launch() let before = app.staticTexts["Content row 3"].frame.minY let banner = page(1) let start = banner.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.9)) let end = banner.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.1)) start.press(forDuration: 0.05, thenDragTo: end) status(0) XCTAssertLessThan(app.staticTexts["Content row 3"].frame.minY, before - 30) let attachment = XCTAttachment(screenshot: app.screenshot()) attachment.lifetime = .keepAlways add(attachment) } func testSingleAndEmpty() { launch(["single"]) page(1, total: 1).tap() status(1, 1) drag(1, total: 1) status(1, 1) app.terminate() launch(["empty"]) XCTAssertEqual(app.buttons.matching(NSPredicate(format: "label CONTAINS ' / '")).count, 0) XCTAssertLessThan(app.staticTexts["after-banner"].frame.minY, 200) } func testMixedRatiosAndReplacement() { launch(["mixed"]) XCTAssertEqual(page(1).frame.height, page(1).frame.width / 2, accuracy: 2) drag(1) XCTAssertEqual(page(2).frame.height, page(2).frame.width / 3, accuracy: 2) drag(2, from: 0.2, to: 0.8) drag(1, from: 0.2, to: 0.8) XCTAssertEqual(page(3).frame.height, page(3).frame.width / 2, accuracy: 2) app.buttons["Replace"].tap() XCTAssertTrue(page(1, total: 1).exists) page(1, total: 1).tap() status(1, 9) } func testManualBoundaryFrames() { launch() app.buttons["Record"].tap() drag(1, from: 0.2, to: 0.8) XCTAssertTrue(page(3).exists) status(0) let attachment = XCTAttachment(screenshot: app.screenshot()) attachment.lifetime = .keepAlways add(attachment) Thread.sleep(forTimeInterval: 1) app.buttons["Forward"].tap() drag(3) XCTAssertTrue(page(1).exists) status(0) Thread.sleep(forTimeInterval: 1) } func testSwipeReleasePositionsAndRepeatedInput() { launch() drag(1, from: 0.9, to: 0.6, duration: 0.2) XCTAssertTrue(page(2).waitForExistence(timeout: 2)) status(0) drag(2, from: 0.7, to: 0.15, duration: 0) drag(3, from: 0.6, to: 0.1, duration: 0.1) XCTAssertTrue(page(1).exists) status(0) page(1).tap() status(1, 1) } func testAutomaticFiveSecondWrapFrames() { launch(["active"]) XCTAssertTrue(page(2, total: 2).waitForExistence(timeout: 7)) XCTAssertTrue(page(1, total: 2).waitForExistence(timeout: 7)) Thread.sleep(forTimeInterval: 2) status(0) page(1, total: 2).tap() status(1, 1) } func testReplacementDuringAutomaticWrap() { launch(["active", "replace-during-wrap"]) XCTAssertTrue(page(1, total: 1).waitForExistence(timeout: 13)) Thread.sleep(forTimeInterval: 0.5) page(1, total: 1).tap() status(1, 9) } func testDisappearanceDuringAutomaticWrap() { launch(["active", "hide-during-wrap"]) XCTAssertTrue(page(2, total: 2).waitForExistence(timeout: 7)) let removed = expectation(for: NSPredicate(format: "count == 0"), evaluatedWith: app.buttons.matching(NSPredicate(format: "label CONTAINS ' / '"))) wait(for: [removed], timeout: 8) Thread.sleep(forTimeInterval: 1) status(0) app.buttons["Show"].tap() XCTAssertTrue(page(1, total: 2).waitForExistence(timeout: 2)) } func testInactiveSceneCancelsAutomaticAdvance() { launch(["active", "background"]) let label = app.buttons.matching(NSPredicate(format: "label CONTAINS ' / '")).firstMatch.label XCUIDevice.shared.press(.home) Thread.sleep(forTimeInterval: 6) app.activate() XCTAssertTrue(app.buttons[label].exists) status(0) } }