feat(recommendation): 추천 서브 배너와 연속 순환을 추가한다
This commit is contained in:
@@ -0,0 +1,169 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user