219 lines
7.6 KiB
Swift
219 lines
7.6 KiB
Swift
//
|
|
// BlackjackUITests.swift
|
|
// BlackjackUITests
|
|
//
|
|
// Created by Matt Bruce on 12/17/25.
|
|
//
|
|
|
|
import XCTest
|
|
|
|
final class BlackjackUITests: XCTestCase {
|
|
|
|
var app: XCUIApplication!
|
|
|
|
override func setUpWithError() throws {
|
|
// Put setup code here. This method is called before the invocation of each test method in the class.
|
|
|
|
// In UI tests it is usually best to stop immediately when a failure occurs.
|
|
continueAfterFailure = false
|
|
|
|
app = XCUIApplication()
|
|
app.launchArguments = ["UI-TESTING"]
|
|
|
|
// In UI tests it's important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
|
|
}
|
|
|
|
override func tearDownWithError() throws {
|
|
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
|
app = nil
|
|
}
|
|
|
|
@MainActor
|
|
func testExample() throws {
|
|
// UI tests must launch the application that they test.
|
|
app.launch()
|
|
|
|
// Use XCTAssert and related functions to verify your tests produce the correct results.
|
|
}
|
|
|
|
// MARK: - UI Navigation Tests
|
|
|
|
@MainActor
|
|
func testAppLaunches() throws {
|
|
app.launch()
|
|
XCTAssertTrue(app.exists, "App should launch successfully")
|
|
}
|
|
|
|
@MainActor
|
|
func testTopBarElements() throws {
|
|
app.launch()
|
|
|
|
// Wait for the app to load
|
|
let balanceText = app.staticTexts.matching(identifier: "balance").firstMatch
|
|
XCTAssertTrue(balanceText.waitForExistence(timeout: 2), "Balance should be visible")
|
|
|
|
// Check settings button exists
|
|
let settingsButton = app.buttons.matching(identifier: "settings").firstMatch
|
|
XCTAssertTrue(settingsButton.exists, "Settings button should exist")
|
|
|
|
// Check help button exists
|
|
let helpButton = app.buttons.matching(identifier: "help").firstMatch
|
|
XCTAssertTrue(helpButton.exists, "Help button should exist")
|
|
|
|
// Check stats button exists
|
|
let statsButton = app.buttons.matching(identifier: "stats").firstMatch
|
|
XCTAssertTrue(statsButton.exists, "Stats button should exist")
|
|
}
|
|
|
|
@MainActor
|
|
func testSettingsSheet() throws {
|
|
app.launch()
|
|
|
|
// Find and tap settings button
|
|
let settingsButton = app.buttons.matching(identifier: "settings").firstMatch
|
|
XCTAssertTrue(settingsButton.waitForExistence(timeout: 2), "Settings button should exist")
|
|
settingsButton.tap()
|
|
|
|
// Wait for settings sheet to appear
|
|
let settingsSheet = app.scrollViews.firstMatch
|
|
XCTAssertTrue(settingsSheet.waitForExistence(timeout: 2), "Settings sheet should appear")
|
|
|
|
// Check for some expected elements in settings
|
|
XCTAssertTrue(app.staticTexts["Table Limits"].waitForExistence(timeout: 1) ||
|
|
app.staticTexts["Game Settings"].waitForExistence(timeout: 1),
|
|
"Settings content should be visible")
|
|
|
|
// Close settings (tap outside or dismiss button)
|
|
if app.buttons["Done"].exists {
|
|
app.buttons["Done"].tap()
|
|
} else {
|
|
// Tap outside to dismiss
|
|
app.coordinate(withNormalizedOffset: CGVector(dx: 0.1, dy: 0.1)).tap()
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
func testHelpSheet() throws {
|
|
app.launch()
|
|
|
|
// Find and tap help button
|
|
let helpButton = app.buttons.matching(identifier: "help").firstMatch
|
|
XCTAssertTrue(helpButton.waitForExistence(timeout: 2), "Help button should exist")
|
|
helpButton.tap()
|
|
|
|
// Wait for help sheet to appear
|
|
let helpSheet = app.scrollViews.firstMatch
|
|
XCTAssertTrue(helpSheet.waitForExistence(timeout: 2), "Help sheet should appear")
|
|
|
|
// Check for rules content
|
|
XCTAssertTrue(app.staticTexts["Rules"].exists ||
|
|
app.staticTexts["How to Play"].exists,
|
|
"Rules content should be visible")
|
|
}
|
|
|
|
// MARK: - Betting Tests
|
|
|
|
@MainActor
|
|
func testChipSelector() throws {
|
|
app.launch()
|
|
|
|
// Wait for chip selector to appear
|
|
let chipSelector = app.otherElements["chip-selector"]
|
|
XCTAssertTrue(chipSelector.waitForExistence(timeout: 2) ||
|
|
app.buttons.matching(NSPredicate(format: "label CONTAINS '$'")).count > 0,
|
|
"Chip selector should be visible")
|
|
|
|
// Find a chip button (they should have $ in the label)
|
|
let chipButtons = app.buttons.matching(NSPredicate(format: "label CONTAINS '$'"))
|
|
XCTAssertGreaterThan(chipButtons.count, 0, "Should have chip buttons")
|
|
}
|
|
|
|
@MainActor
|
|
func testPlaceBet() throws {
|
|
app.launch()
|
|
|
|
// Wait for betting area
|
|
sleep(1)
|
|
|
|
// Find deal button (should be disabled initially)
|
|
let dealButton = app.buttons["Deal"]
|
|
XCTAssertTrue(dealButton.waitForExistence(timeout: 2), "Deal button should exist")
|
|
|
|
// Initially deal button should be disabled
|
|
XCTAssertFalse(dealButton.isEnabled, "Deal button should be disabled before bet")
|
|
|
|
// Tap on betting zone
|
|
let bettingZone = app.otherElements["betting-zone"]
|
|
if bettingZone.exists {
|
|
bettingZone.tap()
|
|
|
|
// Deal button should now be enabled (or still disabled if bet is below minimum)
|
|
// We can't reliably test this without knowing the bet amount vs minimum
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
func testClearButton() throws {
|
|
app.launch()
|
|
|
|
// Wait and place a bet by tapping betting zone
|
|
sleep(1)
|
|
let bettingZone = app.otherElements["betting-zone"]
|
|
if bettingZone.exists {
|
|
bettingZone.tap()
|
|
}
|
|
|
|
// Find clear button
|
|
let clearButton = app.buttons["Clear"]
|
|
if clearButton.exists {
|
|
clearButton.tap()
|
|
|
|
// After clearing, deal button should be disabled again
|
|
let dealButton = app.buttons["Deal"]
|
|
XCTAssertFalse(dealButton.isEnabled, "Deal button should be disabled after clear")
|
|
}
|
|
}
|
|
|
|
// MARK: - Gameplay Tests
|
|
|
|
@MainActor
|
|
func testDealCards() throws {
|
|
app.launch()
|
|
|
|
sleep(1)
|
|
|
|
// Place a bet by tapping betting zone multiple times to ensure we meet minimum
|
|
let bettingZone = app.otherElements["betting-zone"]
|
|
if bettingZone.exists {
|
|
for _ in 1...5 {
|
|
bettingZone.tap()
|
|
}
|
|
}
|
|
|
|
// Find and tap deal button
|
|
let dealButton = app.buttons["Deal"]
|
|
if dealButton.waitForExistence(timeout: 2) && dealButton.isEnabled {
|
|
dealButton.tap()
|
|
|
|
// Wait for cards to be dealt
|
|
sleep(2)
|
|
|
|
// After dealing, we should see hit/stand buttons or a result
|
|
let hitButton = app.buttons["Hit"]
|
|
let standButton = app.buttons["Stand"]
|
|
let newRoundButton = app.buttons["New Round"]
|
|
|
|
XCTAssertTrue(hitButton.exists || standButton.exists || newRoundButton.exists,
|
|
"Should see action buttons after dealing")
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
func testLaunchPerformance() throws {
|
|
// This measures how long it takes to launch your application.
|
|
measure(metrics: [XCTApplicationLaunchMetric()]) {
|
|
XCUIApplication().launch()
|
|
}
|
|
}
|
|
}
|