import XCTest final class VocabGridTests: XCTestCase { override func setUpWithError() throws { continueAfterFailure = false } /// Verifies the chapter reader renders vocab tables as a paired Spanish↔English grid. func testChapter4VocabGrid() throws { let app = XCUIApplication() app.launchArguments += ["-onboardingComplete", "YES"] app.launch() app.tabBars.buttons["Course"].tap() let textbookRow = app.buttons.containing(NSPredicate( format: "label CONTAINS[c] 'Complete Spanish'" )).firstMatch XCTAssertTrue(textbookRow.waitForExistence(timeout: 5)) textbookRow.tap() let ch4 = app.buttons["textbook-chapter-row-4"] XCTAssertTrue(ch4.waitForExistence(timeout: 3)) ch4.tap() attach(app, name: "01-ch4-top") // Tap the first vocab disclosure — "Vocabulary (N items)" let vocabButton = app.buttons.matching(NSPredicate( format: "label BEGINSWITH 'Vocabulary ('" )).firstMatch XCTAssertTrue(vocabButton.waitForExistence(timeout: 3)) vocabButton.tap() Thread.sleep(forTimeInterval: 0.4) attach(app, name: "02-ch4-vocab-open") // Scroll a little and screenshot a deeper vocab — numbers table is // typically a few screens down in chapter 4. app.swipeUp(velocity: .fast) app.swipeUp(velocity: .fast) attach(app, name: "03-ch4-deeper") } private func attach(_ app: XCUIApplication, name: String) { let s = app.screenshot() let a = XCTAttachment(screenshot: s) a.name = name a.lifetime = .keepAlways add(a) } }