fix: restore demo build and drawing interactions
This commit is contained in:
@@ -61,6 +61,10 @@ enum IDs {
|
||||
static let pdfAnnotationInput = "pdf.reader.annotation.input"
|
||||
static let pdfAnnotationSave = "pdf.reader.annotation.save"
|
||||
static let pdfAnnotationCancel = "pdf.reader.annotation.cancel"
|
||||
static let pdfDrawing = "pdf.reader.drawing"
|
||||
static let pdfDrawingToolbar = "pdf.reader.drawing.toolbar"
|
||||
static let pdfDrawingPen = "pdf.reader.drawing.pen"
|
||||
static let pdfDrawingEraser = "pdf.reader.drawing.eraser"
|
||||
|
||||
static let readerSearch = "epub.reader.search"
|
||||
static let searchBar = "epub.reader.search.bar"
|
||||
|
||||
@@ -66,7 +66,7 @@ final class PDFAnnotationTests: XCTestCase {
|
||||
// 以不带 reset 参数的全新进程重开,验证标注不会只存在于当前控制器内存中。
|
||||
app.terminate()
|
||||
app.launchAndOpenSamplePDF(
|
||||
bookTitleQuery: "PDF测试文件",
|
||||
bookTitleQuery: "英汉大词典",
|
||||
resetsReaderState: false,
|
||||
pdfTextSource: "host-fixture"
|
||||
)
|
||||
@@ -156,7 +156,7 @@ final class PDFAnnotationTests: XCTestCase {
|
||||
@discardableResult
|
||||
private func openPDF(textSource: String) -> XCUIElement {
|
||||
app.launchAndOpenSamplePDF(
|
||||
bookTitleQuery: "PDF测试文件",
|
||||
bookTitleQuery: "英汉大词典",
|
||||
resetsReaderState: true,
|
||||
pdfTextSource: textSource
|
||||
)
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
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),
|
||||
"取消橡皮擦选中后,手机横屏单页没有恢复连续竖滑"
|
||||
)
|
||||
}
|
||||
|
||||
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 {
|
||||
for _ in 0..<5 {
|
||||
content.swipeUp()
|
||||
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)
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,6 @@ final class ReaderToolbarTests: XCTestCase {
|
||||
|
||||
app.hideReaderChromeIfNeeded()
|
||||
XCTAssertFalse(app.buttons[IDs.readerBack].waitForExistence(timeout: 2), "PDF 点击内容区后工具栏应隐藏")
|
||||
app.waitForDemoReaderState(timeout: 5, description: "toolbar=hidden") { $0.toolbar == "hidden" }
|
||||
}
|
||||
|
||||
func testPDFTocButtonOpensNavigationSheet() {
|
||||
@@ -71,7 +70,7 @@ final class ReaderToolbarTests: XCTestCase {
|
||||
}
|
||||
|
||||
func testPDFLaunchHonorsDisplayTypeArgument() {
|
||||
app.launchAndOpenSampleBook(bookTitleQuery: "PDF测试文件", displayType: "verticalscroll")
|
||||
app.launchAndOpenSampleBook(bookTitleQuery: "英汉大词典", displayType: "verticalscroll")
|
||||
app.waitForReader()
|
||||
app.waitForDemoReaderState(timeout: 5, description: "PDF vertical launch mode") {
|
||||
$0.mode == "pdf" && $0.display == "verticalscroll"
|
||||
@@ -79,7 +78,7 @@ final class ReaderToolbarTests: XCTestCase {
|
||||
}
|
||||
|
||||
func testPDFPageCurlSupportsPinchAndDraggingAfterDoubleTapZoom() {
|
||||
app.launchAndOpenSamplePDF(bookTitleQuery: "PDF测试文件")
|
||||
app.launchAndOpenSamplePDF(bookTitleQuery: "英汉大词典")
|
||||
app.waitForReader()
|
||||
app.waitForDemoReaderState(timeout: 5, description: "PDF page curl") {
|
||||
$0.mode == "pdf" && $0.display == "pagecurl"
|
||||
@@ -114,7 +113,7 @@ final class ReaderToolbarTests: XCTestCase {
|
||||
}
|
||||
|
||||
func testPDFPageCurlSingleFingerTurnsPageAtFittedScale() {
|
||||
app.launchAndOpenSamplePDF(bookTitleQuery: "PDF测试文件")
|
||||
app.launchAndOpenSamplePDF(bookTitleQuery: "英汉大词典")
|
||||
app.waitForReader()
|
||||
app.waitForDemoReaderState(timeout: 5, description: "PDF page curl at page 1") {
|
||||
$0.mode == "pdf" && $0.display == "pagecurl" && $0.page == 1
|
||||
@@ -131,7 +130,7 @@ final class ReaderToolbarTests: XCTestCase {
|
||||
}
|
||||
|
||||
func testPDFSwitchingFromZoomedCurlKeepsScrollModeInteractive() {
|
||||
app.launchAndOpenSamplePDF(bookTitleQuery: "PDF测试文件")
|
||||
app.launchAndOpenSamplePDF(bookTitleQuery: "英汉大词典")
|
||||
app.waitForReader()
|
||||
app.waitForDemoReaderState(timeout: 5, description: "PDF page curl at page 1") {
|
||||
$0.mode == "pdf" && $0.display == "pagecurl" && $0.page == 1
|
||||
|
||||
Reference in New Issue
Block a user