Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions AxePlaygroundApp/AxePlayground/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,16 @@ struct ContentView: View {
SearchableTestView()
case "toolbar-picker-test":
ToolbarPickerTestView()
case "alert-test":
AlertTestView()
case "sheet-test":
SheetTestView()
case "context-menu-test":
ContextMenuTestView()
case "modal-navigation-test":
ModalNavigationTestView()
case "long-scroll-test":
LongScrollTestView()

// Input & Text
case "text-input":
Expand Down Expand Up @@ -117,6 +127,13 @@ struct MainMenuView: View {
("slider-value-test", "Slider Value Test", "Numeric AXValue with selector tap"),
("searchable-test", "Searchable Test", "Navigation search field targeting"),
("toolbar-picker-test", "Toolbar Picker Test", "Toolbar segmented picker targeting")
]),
("Presentation", [
("alert-test", "Alert Test", "Alert presentation and button targeting"),
("sheet-test", "Sheet Test", "Sheet presentation and actions"),
("context-menu-test", "Context Menu Test", "Long press menu targeting"),
("modal-navigation-test", "Modal Navigation Test", "Modal route and nested navigation refresh"),
("long-scroll-test", "Long Scroll Test", "Dedicated long scroll coverage")
])
]

Expand Down
190 changes: 190 additions & 0 deletions AxePlaygroundApp/AxePlayground/Views/AccessibilityFixturesView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -112,3 +112,193 @@ struct ToolbarPickerTestView: View {
}
}
}

struct AlertTestView: View {
@State private var state = "Initial"
@State private var isShowingAlert = false

var body: some View {
VStack(spacing: 24) {
Text("Alert State: \(state)")
.accessibilityIdentifier("alert-test-state")
.accessibilityValue(state)

Button("Show Alert") {
isShowingAlert = true
}
.buttonStyle(.borderedProminent)
.accessibilityIdentifier("alert-test-show-alert")
}
.padding()
.navigationTitle("Alert Test")
.navigationBarTitleDisplayMode(.inline)
.alert("Delete Draft?", isPresented: $isShowingAlert) {
Button("Cancel", role: .cancel) {
state = "Cancelled"
}
Button("Delete", role: .destructive) {
state = "Deleted"
}
} message: {
Text("This alert is used for deterministic automation coverage.")
}
}
}

struct SheetTestView: View {
@State private var state = "Initial"
@State private var isShowingSheet = false

var body: some View {
VStack(spacing: 24) {
Text("Sheet State: \(state)")
.accessibilityIdentifier("sheet-test-state")
.accessibilityValue(state)

Button("Open Sheet") {
isShowingSheet = true
}
.buttonStyle(.borderedProminent)
.accessibilityIdentifier("sheet-test-open-sheet")
}
.padding()
.navigationTitle("Sheet Test")
.navigationBarTitleDisplayMode(.inline)
.sheet(isPresented: $isShowingSheet) {
NavigationStack {
VStack(spacing: 24) {
Text("Sheet Fixture")
.font(.title2)
.fontWeight(.bold)

Button("Run Sheet Action") {
state = "Sheet action tapped"
}
.buttonStyle(.borderedProminent)
.accessibilityIdentifier("sheet-test-action")

Button("Close Sheet") {
isShowingSheet = false
}
.buttonStyle(.bordered)
.accessibilityIdentifier("sheet-test-close")
}
.padding()
.navigationTitle("Sheet Fixture")
.navigationBarTitleDisplayMode(.inline)
.accessibilityIdentifier("sheet-test-sheet")
}
.presentationDetents([.medium])
}
}
}

struct ContextMenuTestView: View {
@State private var state = "Initial"

var body: some View {
VStack(spacing: 24) {
Text("Context Menu State: \(state)")
.accessibilityIdentifier("context-menu-test-state")
.accessibilityValue(state)

Text("Long Press Target")
.font(.headline)
.frame(maxWidth: .infinity)
.padding()
.background(.blue.opacity(0.15), in: RoundedRectangle(cornerRadius: 12))
.accessibilityIdentifier("context-menu-test-target")
.contextMenu {
Button("Favorite") {
state = "Favorited"
}
Button("Archive") {
state = "Archived"
}
}
}
.padding()
.navigationTitle("Context Menu")
.navigationBarTitleDisplayMode(.inline)
}
}

struct ModalNavigationTestView: View {
@State private var state = "Initial"
@State private var isShowingModal = false

var body: some View {
VStack(spacing: 24) {
Text("Modal Navigation State: \(state)")
.accessibilityIdentifier("modal-navigation-test-state")
.accessibilityValue(state)

Button("Open Modal Flow") {
isShowingModal = true
}
.buttonStyle(.borderedProminent)
.accessibilityIdentifier("modal-navigation-test-open")
}
.padding()
.navigationTitle("Modal Navigation")
.navigationBarTitleDisplayMode(.inline)
.sheet(isPresented: $isShowingModal) {
NavigationStack {
List {
NavigationLink("Open Detail") {
VStack(spacing: 24) {
Text("Modal Detail")
.font(.title2)
.accessibilityIdentifier("modal-navigation-test-detail")

Button("Mark Complete") {
state = "Completed"
}
.buttonStyle(.borderedProminent)
.accessibilityIdentifier("modal-navigation-test-complete")
}
.padding()
.navigationTitle("Modal Detail")
.navigationBarTitleDisplayMode(.inline)
}
.accessibilityIdentifier("modal-navigation-test-detail-link")
}
.navigationTitle("Modal Flow")
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .topBarTrailing) {
Button("Done") {
isShowingModal = false
}
.accessibilityIdentifier("modal-navigation-test-done")
}
}
.accessibilityIdentifier("modal-navigation-test-modal")
}
}
}
}

struct LongScrollTestView: View {
private let rows = Array(1...80)

var body: some View {
List {
Text("Long Scroll Start")
.font(.headline)
.accessibilityIdentifier("long-scroll-test-start")

ForEach(rows, id: \.self) { row in
Text("Long Scroll Row \(row)")
.accessibilityIdentifier("long-scroll-test-row-\(row)")
}

Text("Long Scroll End")
.font(.headline)
.accessibilityIdentifier("long-scroll-test-end")
}
.navigationTitle("Long Scroll")
.navigationBarTitleDisplayMode(.inline)
.accessibilityIdentifier("long-scroll-test-list")
}
}
Loading
Loading