diff options
| author | Christian Cleberg <[email protected]> | 2026-07-23 19:20:52 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-07-23 19:34:57 -0500 |
| commit | 7315ae3da604debfacfed9715a04dc91139a31e0 (patch) | |
| tree | 13febd9af1f44de01f05c9aef661b23cd97e2770 /DomainDigUITests/AccessibilityAuditHarness.swift | |
| parent | 655d11b59a273c14720952478ccebec20a9627bd (diff) | |
| download | domain-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.swift | 32 |
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 |
