ReadViewSDK/ReadViewDemo/ReadViewDemoUITests/ReaderUITests/PDFDrawingModeTests.swift

133 lines
6.2 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import XCTest
///
///
final class PDFDrawingModeTests: XCTestCase {
private let app = XCUIApplication()
override func setUpWithError() throws {
continueAfterFailure = false
XCUIDevice.shared.orientation = .portrait
}
override func tearDownWithError() throws {
XCUIDevice.shared.orientation = .portrait
}
func testLandscapeSinglePageScrollsOnlyWhenDrawingToolIsDeselected() {
app.launchAndOpenSampleBook(bookTitleQuery: "英汉大词典", displayType: "pagecurl")
app.waitForReader()
XCUIDevice.shared.orientation = .landscapeLeft
let content = app.otherElements[IDs.readerContent].firstMatch
XCTAssertTrue(content.waitForExistence(timeout: 8), "PDF 横屏阅读页面未出现")
XCTAssertTrue(waitForLandscapeLayout(), "PDF 未进入横屏单页布局")
app.showReaderChromeIfNeeded(requiredButtonIDs: [IDs.pdfDrawing])
let drawing = app.buttons[IDs.pdfDrawing]
XCTAssertTrue(drawing.waitForExistence(timeout: 5), "画笔入口未出现")
drawing.tap()
let pen = app.buttons[IDs.pdfDrawingPen]
let eraser = app.buttons[IDs.pdfDrawingEraser]
XCTAssertTrue(pen.waitForExistence(timeout: 5), "画笔工具未出现")
XCTAssertTrue(eraser.exists, "橡皮擦工具未出现")
let firstScrollablePage = app.currentDemoReaderState()?.page
XCTAssertNotNil(firstScrollablePage, "未取得初始 PDF 页码")
guard let firstScrollablePage else { return }
XCTAssertTrue(
scrollToAnotherPage(content, from: firstScrollablePage),
"未选中工具时,手机横屏单页无法连续竖滑"
)
let lockedPage = app.currentDemoReaderState()?.page
XCTAssertNotNil(lockedPage, "滚动后未取得 PDF 页码")
guard let lockedPage else { return }
pen.tap()
assertPageRemains(lockedPage, afterSwiping: content, message: "选中画笔后仍触发了页面滚动")
eraser.tap()
assertPageRemains(lockedPage, afterSwiping: content, message: "切换至橡皮擦后仍触发了页面滚动")
eraser.tap()
XCTAssertTrue(
scrollToAnotherPage(content, from: lockedPage),
"取消橡皮擦选中后,手机横屏单页没有恢复连续竖滑"
)
}
///
func testZoomedPageDragsOnlyWhenDrawingToolIsDeselected() {
app.launchAndOpenSampleBook(bookTitleQuery: "英汉大词典", displayType: "pagecurl")
app.waitForReader()
let content = app.otherElements[IDs.readerContent].firstMatch
XCTAssertTrue(content.waitForExistence(timeout: 8), "PDF 阅读页面未出现")
app.showReaderChromeIfNeeded(requiredButtonIDs: [IDs.pdfDrawing])
let drawing = app.buttons[IDs.pdfDrawing]
XCTAssertTrue(drawing.waitForExistence(timeout: 5), "画笔入口未出现")
drawing.tap()
let pen = app.buttons[IDs.pdfDrawingPen]
XCTAssertTrue(pen.waitForExistence(timeout: 5), "画笔工具未出现")
//
content.pinch(withScale: 2.5, velocity: 1)
RunLoop.current.run(until: Date().addingTimeInterval(1.0))
let zoomedFrame = content.frame
XCTAssertGreaterThan(zoomedFrame.width, app.windows.firstMatch.frame.width * 1.2, "画笔面板打开时无法双指放大页面")
//
let start = content.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))
let end = content.coordinate(withNormalizedOffset: CGVector(dx: 0.3, dy: 0.3))
start.press(forDuration: 0.05, thenDragTo: end)
RunLoop.current.run(until: Date().addingTimeInterval(0.8))
let draggedFrame = content.frame
XCTAssertNotEqual(draggedFrame.origin, zoomedFrame.origin, "未选中工具时,放大页面无法单指拖动")
//
pen.tap()
let frameBeforeStroke = content.frame
let strokeStart = content.coordinate(withNormalizedOffset: CGVector(dx: 0.45, dy: 0.45))
let strokeEnd = content.coordinate(withNormalizedOffset: CGVector(dx: 0.6, dy: 0.6))
strokeStart.press(forDuration: 0.05, thenDragTo: strokeEnd)
RunLoop.current.run(until: Date().addingTimeInterval(0.8))
XCTAssertEqual(content.frame.origin, frameBeforeStroke.origin, "选中画笔后,单指仍拖动了放大页面而不是绘制")
}
private func waitForLandscapeLayout() -> Bool {
let deadline = Date().addingTimeInterval(8)
while Date() < deadline {
let frame = app.windows.firstMatch.frame
if frame.width > frame.height { return true }
RunLoop.current.run(until: Date().addingTimeInterval(0.1))
}
return false
}
private func scrollToAnotherPage(_ content: XCUIElement, from page: Int) -> Bool {
let window = app.windows.firstMatch
for _ in 0..<5 {
//
let start = window.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.35))
let end = window.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.05))
start.press(forDuration: 0.05, thenDragTo: end, withVelocity: .fast, thenHoldForDuration: 0)
let deadline = Date().addingTimeInterval(1.5)
while Date() < deadline {
if let current = app.currentDemoReaderState()?.page, current != page { return true }
RunLoop.current.run(until: Date().addingTimeInterval(0.1))
}
}
return false
}
private func assertPageRemains(_ page: Int, afterSwiping content: XCUIElement, message: String) {
for _ in 0..<3 { content.swipeUp() }
RunLoop.current.run(until: Date().addingTimeInterval(0.8))
XCTAssertEqual(app.currentDemoReaderState()?.page, page, message)
}
}