summaryrefslogtreecommitdiff
path: root/DomainDigUITests/AccessibilityAuditHarness.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-07-23 19:20:52 -0500
committerChristian Cleberg <[email protected]>2026-07-23 19:34:57 -0500
commit7315ae3da604debfacfed9715a04dc91139a31e0 (patch)
tree13febd9af1f44de01f05c9aef661b23cd97e2770 /DomainDigUITests/AccessibilityAuditHarness.swift
parent655d11b59a273c14720952478ccebec20a9627bd (diff)
downloaddomain-dig-7315ae3da604debfacfed9715a04dc91139a31e0.tar.gz
domain-dig-7315ae3da604debfacfed9715a04dc91139a31e0.tar.bz2
domain-dig-7315ae3da604debfacfed9715a04dc91139a31e0.zip
test(a11y): Phase 6 verification — metadata assertions, middle-band sweep, 27.0 fix
Executes the Phase-6 manual runbook against the simulator, converting the mechanically-checkable parts into permanent coverage and reporting the rest honestly by tier. - Fix an enforced `.dynamicType` failure surfaced by `audit-a11y.sh current` on iOS 27.0: the Settings `Section("Services")` system header (app sets no font; 18.6 floor and 26.x CI are clean). Narrow, proven `noiseReason` carve-out scoped to dynamicType on the exact Settings header titles. Delta: current FAIL -> SUCCEEDED, finding still prints as `[noise: …]`. - AccessibilityMetadataTests: assert the icon-only control labels and the dense Watchlist/Batch row label+value contracts (green on 18.6 and 27.0). These were one-time manual VoiceOver checks; now they gate. - Middle-band Dynamic Type sweep at AccessibilityL across the seeded screens. Found no band-exclusive third bug (recorded), retained as regression insurance for a band that historically shipped two. - AccessibilityScreenshotTests: best-effort, non-gating capture utility used to produce the cross-runtime Light/Dark/AXXXL screenshots (simctl appearance does not propagate headlessly; driven through the in-app picker instead). - Docs/ACCESSIBILITY_VERIFICATION_RESULTS.md: full pass/fail/not-executable matrix + 15 screenshots. Notable positive result: Differentiate Without Color IS verifiable via the global com.apple.Accessibility defaults domain.
Diffstat (limited to 'DomainDigUITests/AccessibilityAuditHarness.swift')
-rw-r--r--DomainDigUITests/AccessibilityAuditHarness.swift32
1 files changed, 32 insertions, 0 deletions
diff --git a/DomainDigUITests/AccessibilityAuditHarness.swift b/DomainDigUITests/AccessibilityAuditHarness.swift
index 64d0993..24f900e 100644
--- a/DomainDigUITests/AccessibilityAuditHarness.swift
+++ b/DomainDigUITests/AccessibilityAuditHarness.swift
@@ -201,9 +201,41 @@ enum AccessibilityAuditHarness {
return "unattributed, audit artifact on ignored/link content"
}
+ // iOS-27-only Settings `Section` header dynamicType finding. On iOS 27.0
+ // (and only there) the audit reports "font sizes partially unsupported"
+ // against a Settings section header — the same system-rendered headers
+ // already carved out for the contrast near-miss above. Proof it is a
+ // system-chrome artifact, not an app defect:
+ // • Each is a plain `Section("Services")` etc. (ContentView.swift ~2768);
+ // the app sets no font, so the scaling is UIKit's `.footnote` header.
+ // • Version-specific: absent on the iOS 18.6 floor and on the 26.x
+ // runtime CI runs (both audit clean); it surfaces only under 27.0.
+ // ACCESSIBILITY.md's coverage table records the same asymmetry
+ // ("dynamicType finding 18.6 missed").
+ // • Attribution is unstable run-to-run across the header set
+ // (Tier/Preferences/Services), exactly like the documented contrast
+ // flip — so it lands on whichever header the traversal reaches first.
+ // Overriding every Section header with a custom scaling `Text` to chase
+ // this was rejected for the contrast case (ACCESSIBILITY.md) for trading
+ // platform convention for nothing; the same holds here. Scoped to
+ // dynamicType on the exact Settings header titles so a real regression
+ // on app-controlled text still enforces.
+ if issue.auditType.contains(.dynamicType),
+ let label = issue.element?.label,
+ settingsSectionHeaders.contains(label) {
+ return "iOS-rendered Settings section header, app sets no font (27.0-only)"
+ }
+
return nil
}
+ /// The Settings screen's `Section(_:)` header titles. UIKit renders these;
+ /// the app passes only a string literal. Used to scope the section-header
+ /// dynamicType carve-out narrowly (see `noiseReason`).
+ private static let settingsSectionHeaders: Set<String> = [
+ "Tier", "Preferences", "Services", "Data", "About"
+ ]
+
/// `XCUIAccessibilityAuditType` is an option set whose description is just a
/// raw bitmask, which makes the burndown list unreadable. Resolve it against
/// the named members rather than hard-coding bit positions, so this keeps