testaro 78.0.8 → 78.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/.gitattributes +94 -0
  2. package/.github/workflows/ci.yml +58 -0
  3. package/.github/workflows/publish.yml +49 -0
  4. package/.github/workflows/typescript.yml +35 -0
  5. package/AGENTS.md +2 -2
  6. package/CLAUDE.md +24 -18
  7. package/CONTAINERS.md +9 -6
  8. package/CONTRIBUTING.md +29 -3
  9. package/Dockerfile +1 -1
  10. package/README.md +73 -19
  11. package/UPGRADES.md +4 -0
  12. package/actSpecs-doc.md +13 -1
  13. package/actSpecs.js +29 -5
  14. package/call.js +6 -5
  15. package/docker-compose.yml +8 -2
  16. package/docs/checkpoint-scanning.md +199 -0
  17. package/docs/standard-result-outcome.md +165 -0
  18. package/env.example +44 -10
  19. package/eslint.config.mjs +101 -0
  20. package/netWatch.js +372 -222
  21. package/package.json +46 -31
  22. package/pour/README.md +47 -0
  23. package/pour/pour.min.js +8 -0
  24. package/procs/actDo.js +808 -0
  25. package/procs/catalog.d.ts +17 -0
  26. package/procs/catalog.js +312 -221
  27. package/procs/catalog.ts +398 -0
  28. package/procs/checkpoint.js +110 -0
  29. package/procs/config.d.ts +35 -0
  30. package/procs/config.js +62 -0
  31. package/procs/dateTime.js +2 -1
  32. package/procs/doActs.js +442 -849
  33. package/procs/doTestAct.js +27 -121
  34. package/procs/flow.js +221 -0
  35. package/procs/generateRuleRegistry.js +94 -0
  36. package/procs/getSource.d.ts +26 -0
  37. package/procs/job.js +115 -1
  38. package/procs/launch.d.ts +40 -0
  39. package/procs/launch.js +239 -108
  40. package/procs/nu.d.ts +48 -0
  41. package/procs/scope.js +196 -0
  42. package/procs/shoot.d.ts +33 -0
  43. package/procs/standard.d.ts +18 -0
  44. package/procs/standard.js +83 -0
  45. package/procs/standard.ts +126 -0
  46. package/procs/testAct.js +145 -0
  47. package/procs/testaro.d.ts +20 -0
  48. package/procs/testaro.js +236 -189
  49. package/procs/testaro.ts +321 -0
  50. package/procs/userPath.js +126 -0
  51. package/procs/xPath.d.ts +4 -0
  52. package/procs/xPath.js +81 -69
  53. package/procs/xPath.ts +106 -0
  54. package/procs/xPathScript.d.ts +6 -0
  55. package/procs/xPathScript.js +70 -0
  56. package/run.js +3 -2
  57. package/surea11y/README.md +44 -0
  58. package/surea11y/surea11y.browser.js +14 -0
  59. package/testaro/adbID.d.ts +3 -0
  60. package/testaro/adbID.js +38 -41
  61. package/testaro/adbID.ts +66 -0
  62. package/testaro/allCapStyle.d.ts +3 -0
  63. package/testaro/allCapStyle.js +31 -34
  64. package/testaro/allCapStyle.ts +55 -0
  65. package/testaro/allCaps.d.ts +16 -0
  66. package/testaro/allCaps.js +179 -151
  67. package/testaro/allCaps.ts +228 -0
  68. package/testaro/allHidden.d.ts +13 -0
  69. package/testaro/allHidden.js +29 -30
  70. package/testaro/allHidden.ts +50 -0
  71. package/testaro/allSlanted.d.ts +3 -0
  72. package/testaro/allSlanted.js +30 -33
  73. package/testaro/allSlanted.ts +54 -0
  74. package/testaro/altScheme.d.ts +3 -0
  75. package/testaro/altScheme.js +27 -30
  76. package/testaro/altScheme.ts +50 -0
  77. package/testaro/attVal.d.ts +3 -0
  78. package/testaro/attVal.js +20 -21
  79. package/testaro/attVal.ts +52 -0
  80. package/testaro/autocomplete.d.ts +3 -0
  81. package/testaro/autocomplete.js +59 -75
  82. package/testaro/autocomplete.ts +101 -0
  83. package/testaro/bulk.d.ts +13 -0
  84. package/testaro/bulk.js +32 -33
  85. package/testaro/bulk.ts +55 -0
  86. package/testaro/buttonMenu.d.ts +9 -0
  87. package/testaro/buttonMenu.js +317 -319
  88. package/testaro/buttonMenu.ts +391 -0
  89. package/testaro/captionLoc.d.ts +3 -0
  90. package/testaro/captionLoc.js +17 -20
  91. package/testaro/captionLoc.ts +40 -0
  92. package/testaro/datalistRef.d.ts +3 -0
  93. package/testaro/datalistRef.js +33 -36
  94. package/testaro/datalistRef.ts +55 -0
  95. package/testaro/distortion.d.ts +3 -0
  96. package/testaro/distortion.js +57 -26
  97. package/testaro/distortion.ts +81 -0
  98. package/testaro/docType.d.ts +15 -0
  99. package/testaro/docType.js +25 -25
  100. package/testaro/docType.ts +45 -0
  101. package/testaro/dupAtt.d.ts +16 -0
  102. package/testaro/dupAtt.js +113 -104
  103. package/testaro/dupAtt.ts +144 -0
  104. package/testaro/elements.d.ts +6 -0
  105. package/testaro/elements.js +153 -153
  106. package/testaro/elements.ts +215 -0
  107. package/testaro/embAc.d.ts +3 -0
  108. package/testaro/embAc.js +19 -20
  109. package/testaro/embAc.ts +40 -0
  110. package/testaro/focAll.d.ts +13 -0
  111. package/testaro/focAll.js +185 -191
  112. package/testaro/focAll.ts +217 -0
  113. package/testaro/focAndOp.d.ts +3 -0
  114. package/testaro/focAndOp.js +100 -104
  115. package/testaro/focAndOp.ts +128 -0
  116. package/testaro/focInd.d.ts +3 -0
  117. package/testaro/focInd.js +64 -66
  118. package/testaro/focInd.ts +96 -0
  119. package/testaro/focVis.d.ts +3 -0
  120. package/testaro/focVis.js +28 -30
  121. package/testaro/focVis.ts +52 -0
  122. package/testaro/headEl.d.ts +10 -0
  123. package/testaro/headEl.js +61 -62
  124. package/testaro/headEl.ts +82 -0
  125. package/testaro/headingAmb.d.ts +3 -0
  126. package/testaro/headingAmb.js +54 -63
  127. package/testaro/headingAmb.ts +72 -0
  128. package/testaro/hovInd.d.ts +12 -0
  129. package/testaro/hovInd.js +163 -130
  130. package/testaro/hovInd.ts +199 -0
  131. package/testaro/hover.d.ts +3 -0
  132. package/testaro/hover.js +155 -126
  133. package/testaro/hover.ts +154 -0
  134. package/testaro/hr.d.ts +3 -0
  135. package/testaro/hr.js +14 -17
  136. package/testaro/hr.ts +36 -0
  137. package/testaro/imageLink.d.ts +3 -0
  138. package/testaro/imageLink.js +17 -20
  139. package/testaro/imageLink.ts +42 -0
  140. package/testaro/labClash.d.ts +3 -0
  141. package/testaro/labClash.js +31 -33
  142. package/testaro/labClash.ts +54 -0
  143. package/testaro/legendLoc.d.ts +3 -0
  144. package/testaro/legendLoc.js +17 -20
  145. package/testaro/legendLoc.ts +42 -0
  146. package/testaro/lineHeight.d.ts +3 -0
  147. package/testaro/lineHeight.js +43 -48
  148. package/testaro/lineHeight.ts +70 -0
  149. package/testaro/linkAmb.d.ts +7 -0
  150. package/testaro/linkAmb.js +79 -80
  151. package/testaro/linkAmb.ts +105 -0
  152. package/testaro/linkExt.d.ts +3 -0
  153. package/testaro/linkExt.js +13 -16
  154. package/testaro/linkExt.ts +35 -0
  155. package/testaro/linkOldAtt.d.ts +3 -0
  156. package/testaro/linkOldAtt.js +25 -28
  157. package/testaro/linkOldAtt.ts +48 -0
  158. package/testaro/linkTo.d.ts +3 -0
  159. package/testaro/linkTo.js +22 -22
  160. package/testaro/linkTo.ts +43 -0
  161. package/testaro/linkUl.d.ts +3 -0
  162. package/testaro/linkUl.js +30 -34
  163. package/testaro/linkUl.ts +54 -0
  164. package/testaro/miniText.d.ts +3 -0
  165. package/testaro/miniText.js +41 -44
  166. package/testaro/miniText.ts +68 -0
  167. package/testaro/motion.d.ts +10 -0
  168. package/testaro/motion.js +92 -96
  169. package/testaro/motion.ts +125 -0
  170. package/testaro/nonTable.d.ts +3 -0
  171. package/testaro/nonTable.js +39 -45
  172. package/testaro/nonTable.ts +66 -0
  173. package/testaro/optRoleSel.d.ts +3 -0
  174. package/testaro/optRoleSel.js +16 -19
  175. package/testaro/optRoleSel.ts +41 -0
  176. package/testaro/phOnly.d.ts +3 -0
  177. package/testaro/phOnly.js +18 -21
  178. package/testaro/phOnly.ts +43 -0
  179. package/testaro/pseudoP.d.ts +3 -0
  180. package/testaro/pseudoP.js +36 -38
  181. package/testaro/pseudoP.ts +59 -0
  182. package/testaro/radioSet.d.ts +3 -0
  183. package/testaro/radioSet.js +57 -59
  184. package/testaro/radioSet.ts +79 -0
  185. package/testaro/registry.d.ts +63 -0
  186. package/testaro/registry.js +67 -0
  187. package/testaro/registry.ts +141 -0
  188. package/testaro/role.d.ts +3 -0
  189. package/testaro/role.js +27 -29
  190. package/testaro/role.ts +53 -0
  191. package/testaro/secHeading.d.ts +3 -0
  192. package/testaro/secHeading.js +30 -33
  193. package/testaro/secHeading.ts +53 -0
  194. package/testaro/styleDiff.d.ts +25 -0
  195. package/testaro/styleDiff.js +248 -252
  196. package/testaro/styleDiff.ts +303 -0
  197. package/testaro/tabNav.d.ts +33 -0
  198. package/testaro/tabNav.js +272 -342
  199. package/testaro/tabNav.ts +454 -0
  200. package/testaro/targetsNear.d.ts +9 -0
  201. package/testaro/targetsNear.js +130 -132
  202. package/testaro/targetsNear.ts +160 -0
  203. package/testaro/textNodes.d.ts +6 -0
  204. package/testaro/textNodes.js +139 -135
  205. package/testaro/textNodes.ts +185 -0
  206. package/testaro/textSem.d.ts +3 -0
  207. package/testaro/textSem.js +25 -28
  208. package/testaro/textSem.ts +47 -0
  209. package/testaro/title.d.ts +9 -0
  210. package/testaro/title.js +16 -13
  211. package/testaro/title.ts +31 -0
  212. package/testaro/titledEl.d.ts +3 -0
  213. package/testaro/titledEl.js +15 -18
  214. package/testaro/titledEl.ts +38 -0
  215. package/testaro/zIndex.d.ts +3 -0
  216. package/testaro/zIndex.js +19 -22
  217. package/testaro/zIndex.ts +42 -0
  218. package/tests/alfa.d.ts +45 -0
  219. package/tests/alfa.js +138 -141
  220. package/tests/alfa.ts +214 -0
  221. package/tests/aslint.d.ts +33 -0
  222. package/tests/aslint.js +272 -249
  223. package/tests/aslint.ts +301 -0
  224. package/tests/axe.d.ts +27 -0
  225. package/tests/axe.js +199 -200
  226. package/tests/axe.ts +277 -0
  227. package/tests/ed11y.d.ts +28 -0
  228. package/tests/ed11y.js +141 -99
  229. package/tests/ed11y.ts +178 -0
  230. package/tests/htmlcs.d.ts +21 -0
  231. package/tests/htmlcs.js +174 -140
  232. package/tests/htmlcs.ts +181 -0
  233. package/tests/ibm.d.ts +52 -0
  234. package/tests/ibm.js +164 -166
  235. package/tests/ibm.ts +251 -0
  236. package/tests/nuVal.d.ts +13 -0
  237. package/tests/nuVal.js +107 -112
  238. package/tests/nuVal.ts +145 -0
  239. package/tests/nuVnu.d.ts +15 -0
  240. package/tests/nuVnu.js +141 -111
  241. package/tests/nuVnu.ts +144 -0
  242. package/tests/pour.d.ts +31 -0
  243. package/tests/pour.js +242 -0
  244. package/tests/pour.ts +273 -0
  245. package/tests/qualWeb.d.ts +39 -0
  246. package/tests/qualWeb.js +302 -272
  247. package/tests/qualWeb.ts +415 -0
  248. package/tests/surea11y.d.ts +33 -0
  249. package/tests/surea11y.js +288 -0
  250. package/tests/surea11y.ts +334 -0
  251. package/tests/testaro.d.ts +25 -0
  252. package/tests/testaro.js +745 -652
  253. package/tests/testaro.ts +862 -0
  254. package/tests/wave.d.ts +46 -0
  255. package/tests/wave.js +166 -177
  256. package/tests/wave.ts +252 -0
  257. package/tsconfig.json +17 -0
  258. package/types.d.ts +243 -0
  259. package/types.js +10 -0
  260. package/types.ts +376 -0
  261. package/validation/act/README.md +46 -0
  262. package/validation/act/capture.js +424 -0
  263. package/validation/act/chromium-issue-draft.md +66 -0
  264. package/validation/act/fp-triage-2026-08-22.md +86 -0
  265. package/validation/act/isolation-notes.md +159 -0
  266. package/validation/act/playwright-issue-draft.md +73 -0
  267. package/validation/act/propose-mappings.js +0 -0
  268. package/validation/act/repro-cdp-raw.js +105 -0
  269. package/validation/act/repro-metarefresh.js +65 -0
  270. package/validation/act/score.js +184 -0
  271. package/validation/act/stage3a-stress-report.md +69 -0
  272. package/validation/act/stage3b-mapping-proposals.md +94 -0
  273. package/validation/act/stage3b-triage-draft.md +138 -0
  274. package/validation/act/surea11y-track-a-2026-09-01.md +50 -0
  275. package/validation/executors/netWatch.js +180 -90
  276. package/validation/executors/test.js +17 -2
  277. package/validation/executors/tests.js +118 -10
  278. package/validation/jobs/reports/raw/260901T1000-surea11y-validation.json +964 -0
  279. package/validation/jobs/todo/240101T1200-simple-example.json +14 -6
  280. package/validation/jobs/todo/240101T1300-shoot-example.json +2 -1
  281. package/validation/jobs/todo/260821T1900-pour-validation.json +45 -0
  282. package/validation/jobs/todo/260901T1000-surea11y-validation.json +45 -0
  283. package/validation/knownFailures.json +1 -0
  284. package/validation/tests/jobProperties/adbID.json +27 -2
  285. package/validation/tests/jobProperties/{focOp.json → allCapStyle.json} +56 -53
  286. package/validation/tests/jobProperties/allCaps.json +25 -0
  287. package/validation/tests/jobProperties/allHidden.json +133 -13
  288. package/validation/tests/jobProperties/allSlanted.json +3 -3
  289. package/validation/tests/jobProperties/altScheme.json +23 -8
  290. package/validation/tests/jobProperties/attVal.json +57 -57
  291. package/validation/tests/jobProperties/autocomplete.json +11 -1
  292. package/validation/tests/jobProperties/bulk.json +6 -1
  293. package/validation/tests/jobProperties/buttonMenu.json +63 -42
  294. package/validation/tests/jobProperties/captionLoc.json +1 -6
  295. package/validation/tests/jobProperties/checkpoint-browser.json +401 -0
  296. package/validation/tests/jobProperties/checkpoint-page.json +397 -0
  297. package/validation/tests/jobProperties/checkpoint.json +395 -0
  298. package/validation/tests/jobProperties/datalistRef.json +20 -5
  299. package/validation/tests/jobProperties/distortion.json +28 -3
  300. package/validation/tests/jobProperties/docType.json +2 -2
  301. package/validation/tests/jobProperties/dupAtt.json +48 -33
  302. package/validation/tests/jobProperties/elements.json +28 -28
  303. package/validation/tests/jobProperties/embAc.json +36 -31
  304. package/validation/tests/jobProperties/focAndOp.json +284 -0
  305. package/validation/tests/jobProperties/focInd.json +34 -34
  306. package/validation/tests/jobProperties/focVis.json +1 -1
  307. package/validation/tests/jobProperties/hover.json +39 -37
  308. package/validation/tests/jobProperties/hr.json +13 -3
  309. package/validation/tests/jobProperties/imageLink.json +0 -5
  310. package/validation/tests/jobProperties/labClash.json +68 -33
  311. package/validation/tests/jobProperties/legendLoc.json +1 -6
  312. package/validation/tests/jobProperties/lineHeight.json +2 -2
  313. package/validation/tests/jobProperties/linkAmb.json +13 -18
  314. package/validation/tests/jobProperties/linkExt.json +1 -1
  315. package/validation/tests/jobProperties/linkOldAtt.json +12 -2
  316. package/validation/tests/jobProperties/linkTo.json +1 -1
  317. package/validation/tests/jobProperties/linkUl.json +65 -65
  318. package/validation/tests/jobProperties/miniText.json +7 -2
  319. package/validation/tests/jobProperties/motion.json +4 -50
  320. package/validation/tests/jobProperties/nonTable.json +48 -3
  321. package/validation/tests/jobProperties/optRoleSel.json +12 -2
  322. package/validation/tests/jobProperties/phOnly.json +6 -16
  323. package/validation/tests/jobProperties/pseudoP.json +17 -2
  324. package/validation/tests/jobProperties/radioSet.json +30 -30
  325. package/validation/tests/jobProperties/role.json +25 -5
  326. package/validation/tests/jobProperties/secHeading.json +26 -21
  327. package/validation/tests/jobProperties/styleDiff.json +35 -5
  328. package/validation/tests/jobProperties/tabNav.json +3 -1
  329. package/validation/tests/jobProperties/targetsNear.json +237 -0
  330. package/validation/tests/jobProperties/textNodes.json +29 -29
  331. package/validation/tests/jobProperties/textSem.json +26 -1
  332. package/validation/tests/jobProperties/title.json +12 -2
  333. package/validation/tests/jobProperties/titledEl.json +39 -9
  334. package/validation/tests/jobProperties/userPath.json +317 -0
  335. package/validation/tests/jobProperties/zIndex.json +40 -35
  336. package/validation/tests/targets/allCapStyle/index.html +26 -0
  337. package/validation/tests/targets/checkpoint/index.html +38 -0
  338. package/validation/tests/targets/datalistRef/index.html +1 -1
  339. package/validation/tests/targets/focAndOp/bad.html +29 -0
  340. package/validation/tests/targets/{focOp → focAndOp}/good.html +3 -1
  341. package/validation/tests/targets/focInd/bad.html +2 -1
  342. package/validation/tests/targets/headEl/index.html +10 -1
  343. package/validation/tests/targets/{targetSmall → targetsNear}/index.html +15 -1
  344. package/validation/tests/targets/userPath/index.html +42 -0
  345. package/validation/validateTest.js +61 -9
  346. package/.claude/settings.local.json +0 -11
  347. package/.eslintrc.json +0 -41
  348. package/htmlcs/.eslintrc.json +0 -67
  349. package/validation/tests/jobProperties/linkTitle.json +0 -127
  350. package/validation/tests/jobProperties/opFoc.json +0 -164
  351. package/validation/tests/jobProperties/targetSmall.json +0 -152
  352. package/validation/tests/jobProperties/targetTiny.json +0 -142
  353. package/validation/tests/targets/focOp/bad.html +0 -25
  354. package/validation/tests/targets/linkTitle/index.html +0 -24
  355. package/validation/tests/targets/opFoc/bad.html +0 -26
  356. package/validation/tests/targets/opFoc/good.html +0 -23
@@ -0,0 +1,317 @@
1
+ {
2
+ "rule": "userPath",
3
+ "timeLimit": 120,
4
+ "what": "acts produced by procs/userPath.js getUserPathActs from a recorded user path (fill, select, checkpoint, click, wait, checkpoint, navigate, checkpoint) with a testaro test act per checkpoint",
5
+ "acts": [
6
+ {
7
+ "type": "launch",
8
+ "target": {
9
+ "url": "file://validation/tests/targets/userPath/index.html",
10
+ "what": "form whose completion reveals defects"
11
+ }
12
+ },
13
+ {
14
+ "type": "text",
15
+ "selector": "#name",
16
+ "what": "Ada",
17
+ "clear": true
18
+ },
19
+ {
20
+ "type": "select",
21
+ "selector": "#color",
22
+ "what": "green"
23
+ },
24
+ {
25
+ "type": "checkpoint",
26
+ "which": "filled",
27
+ "what": "filled"
28
+ },
29
+ {
30
+ "type": "test",
31
+ "which": "testaro",
32
+ "withItems": true,
33
+ "rules": [
34
+ "y",
35
+ "altScheme",
36
+ "linkTo",
37
+ "phOnly"
38
+ ],
39
+ "stopOnFail": false,
40
+ "scope": "page",
41
+ "expect": [
42
+ [
43
+ "checkpoint",
44
+ "=",
45
+ 1
46
+ ],
47
+ [
48
+ "scope",
49
+ "=",
50
+ "page"
51
+ ],
52
+ [
53
+ "standardResult.instances.length",
54
+ "=",
55
+ 1
56
+ ],
57
+ [
58
+ "standardResult.instances.0.ruleID",
59
+ "=",
60
+ "phOnly"
61
+ ],
62
+ [
63
+ "standardResult.instances.0.id",
64
+ "=",
65
+ "name"
66
+ ],
67
+ [
68
+ "data.scope"
69
+ ]
70
+ ]
71
+ },
72
+ {
73
+ "type": "button",
74
+ "selector": "role=button[name=\"Continue\"]",
75
+ "what": "continue"
76
+ },
77
+ {
78
+ "type": "state",
79
+ "which": "idle",
80
+ "what": "pause 200 ms"
81
+ },
82
+ {
83
+ "type": "checkpoint",
84
+ "which": "continued",
85
+ "what": "continued"
86
+ },
87
+ {
88
+ "type": "test",
89
+ "which": "testaro",
90
+ "withItems": true,
91
+ "rules": [
92
+ "y",
93
+ "altScheme",
94
+ "linkTo",
95
+ "phOnly"
96
+ ],
97
+ "stopOnFail": false,
98
+ "scope": "changed",
99
+ "expect": [
100
+ [
101
+ "checkpoint",
102
+ "=",
103
+ 2
104
+ ],
105
+ [
106
+ "data.scope.applied",
107
+ "=",
108
+ true
109
+ ],
110
+ [
111
+ "data.scope.pathIDs",
112
+ "e",
113
+ [
114
+ "/html/body/main[1]/div[1]/section[1]"
115
+ ]
116
+ ],
117
+ [
118
+ "data.scope.localRules",
119
+ "e",
120
+ [
121
+ "altScheme",
122
+ "linkTo",
123
+ "phOnly"
124
+ ]
125
+ ],
126
+ [
127
+ "standardResult.instances.length",
128
+ "=",
129
+ 2
130
+ ],
131
+ [
132
+ "standardResult.instances.0.ruleID",
133
+ "=",
134
+ "altScheme"
135
+ ],
136
+ [
137
+ "standardResult.instances.1.ruleID",
138
+ "=",
139
+ "linkTo"
140
+ ],
141
+ [
142
+ "data.replay.acts",
143
+ "=",
144
+ 3
145
+ ]
146
+ ]
147
+ },
148
+ {
149
+ "type": "url",
150
+ "which": "file://validation/tests/targets/checkpoint/index.html",
151
+ "what": "go to another page"
152
+ },
153
+ {
154
+ "type": "checkpoint",
155
+ "which": "checkpoint3"
156
+ },
157
+ {
158
+ "type": "test",
159
+ "which": "testaro",
160
+ "withItems": true,
161
+ "rules": [
162
+ "y",
163
+ "altScheme",
164
+ "linkTo",
165
+ "phOnly"
166
+ ],
167
+ "stopOnFail": false,
168
+ "scope": "changed",
169
+ "expect": [
170
+ [
171
+ "checkpoint",
172
+ "=",
173
+ 3
174
+ ],
175
+ [
176
+ "data.scope.requested",
177
+ "=",
178
+ "changed"
179
+ ],
180
+ [
181
+ "standardResult.instances.length",
182
+ "=",
183
+ 0
184
+ ],
185
+ [
186
+ "data.replay"
187
+ ]
188
+ ]
189
+ }
190
+ ],
191
+ "expectReport": [
192
+ [
193
+ "checkpoints.length",
194
+ "=",
195
+ 4
196
+ ],
197
+ [
198
+ "checkpoints.1.name",
199
+ "=",
200
+ "filled"
201
+ ],
202
+ [
203
+ "checkpoints.1.kind",
204
+ "=",
205
+ "interaction"
206
+ ],
207
+ [
208
+ "checkpoints.1.replay",
209
+ "e",
210
+ [
211
+ 1,
212
+ 2
213
+ ]
214
+ ],
215
+ [
216
+ "checkpoints.2.name",
217
+ "=",
218
+ "continued"
219
+ ],
220
+ [
221
+ "checkpoints.2.kind",
222
+ "=",
223
+ "interaction"
224
+ ],
225
+ [
226
+ "checkpoints.2.replay",
227
+ "e",
228
+ [
229
+ 1,
230
+ 2,
231
+ 5
232
+ ]
233
+ ],
234
+ [
235
+ "checkpoints.3.name",
236
+ "=",
237
+ "checkpoint3"
238
+ ],
239
+ [
240
+ "checkpoints.3.kind",
241
+ "=",
242
+ "navigation"
243
+ ],
244
+ [
245
+ "checkpoints.3.replay",
246
+ "e",
247
+ []
248
+ ],
249
+ [
250
+ "checkpoints.1.structure"
251
+ ],
252
+ [
253
+ "flow.deltas.length",
254
+ "=",
255
+ 3
256
+ ],
257
+ [
258
+ "flow.deltas.0.notObserved",
259
+ "e",
260
+ [
261
+ "testaro"
262
+ ]
263
+ ],
264
+ [
265
+ "flow.deltas.1.tools",
266
+ "e",
267
+ [
268
+ "testaro"
269
+ ]
270
+ ],
271
+ [
272
+ "flow.deltas.1.added.length",
273
+ "=",
274
+ 2
275
+ ],
276
+ [
277
+ "flow.deltas.1.removed.length",
278
+ "=",
279
+ 0
280
+ ],
281
+ [
282
+ "flow.deltas.1.notRetested.length",
283
+ "=",
284
+ 1
285
+ ],
286
+ [
287
+ "flow.deltas.1.notRetested.0.ruleID",
288
+ "=",
289
+ "phOnly"
290
+ ],
291
+ [
292
+ "flow.deltas.1.structure.roots",
293
+ "e",
294
+ [
295
+ "/html/body/main[1]/div[1]/section[1]"
296
+ ]
297
+ ],
298
+ [
299
+ "flow.deltas.2.tools",
300
+ "e",
301
+ [
302
+ "testaro"
303
+ ]
304
+ ],
305
+ [
306
+ "jobData.catalogData.checkpoints.0.entryCount",
307
+ "=",
308
+ 0
309
+ ],
310
+ [
311
+ "pathIDs"
312
+ ],
313
+ [
314
+ "catalogNextIndex"
315
+ ]
316
+ ]
317
+ }
@@ -5,42 +5,10 @@
5
5
  {
6
6
  "type": "launch",
7
7
  "target": {
8
- "url": "file://validation/tests/targets/zIndex/good.html",
9
- "what": "page with no explicit z-index attributes"
8
+ "url": "file://validation/tests/targets/zIndex/bad.html",
9
+ "what": "page with explicit z-index attributes"
10
10
  }
11
11
  },
12
- {
13
- "type": "test",
14
- "which": "testaro",
15
- "withItems": true,
16
- "stopOnFail": true,
17
- "expect": [
18
- [
19
- "standardResult.totals.0",
20
- "=",
21
- 0
22
- ],
23
- [
24
- "standardResult.totals.1",
25
- "=",
26
- 0
27
- ],
28
- [
29
- "standardResult.instances.length",
30
- "=",
31
- 0
32
- ]
33
- ],
34
- "rules": [
35
- "y",
36
- "zIndex"
37
- ]
38
- },
39
- {
40
- "type": "url",
41
- "which": "file://validation/tests/targets/zIndex/bad.html",
42
- "what": "page with explicit z-index attributes"
43
- },
44
12
  {
45
13
  "type": "test",
46
14
  "which": "testaro",
@@ -65,7 +33,7 @@
65
33
  [
66
34
  "standardResult.instances.0.what",
67
35
  "i",
68
- "non-default Z index (1)"
36
+ "z-index style property of the element is 1"
69
37
  ],
70
38
  [
71
39
  "standardResult.instances.0.ordinalSeverity",
@@ -87,6 +55,11 @@
87
55
  "i",
88
56
  "Button 0"
89
57
  ],
58
+ [
59
+ "standardResult.instances.1.what",
60
+ "=",
61
+ "z-index style property of the element is 2"
62
+ ],
90
63
  [
91
64
  "standardResult.instances.1.excerpt",
92
65
  "i",
@@ -139,6 +112,38 @@
139
112
  "y",
140
113
  "zIndex"
141
114
  ]
115
+ },
116
+ {
117
+ "type": "url",
118
+ "which": "file://validation/tests/targets/zIndex/good.html",
119
+ "what": "page with no explicit z-index attributes"
120
+ },
121
+ {
122
+ "type": "test",
123
+ "which": "testaro",
124
+ "withItems": true,
125
+ "stopOnFail": true,
126
+ "expect": [
127
+ [
128
+ "standardResult.totals.0",
129
+ "=",
130
+ 0
131
+ ],
132
+ [
133
+ "standardResult.totals.1",
134
+ "=",
135
+ 0
136
+ ],
137
+ [
138
+ "standardResult.instances.length",
139
+ "=",
140
+ 0
141
+ ]
142
+ ],
143
+ "rules": [
144
+ "y",
145
+ "zIndex"
146
+ ]
142
147
  }
143
148
  ]
144
149
  }
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <!--
3
+ © 2021–2023 CVS Health and/or one of its affiliates. All rights reserved.
4
+ © 2026 Jeff Witt.
5
+
6
+ Licensed under the MIT License. See LICENSE file at the project root or
7
+ https://opensource.org/license/mit/ for details.
8
+
9
+ SPDX-License-Identifier: MIT
10
+ -->
11
+ <html lang="en-US">
12
+ <head>
13
+ <meta charset="utf-8">
14
+ <title>Page with all-capital text transformations</title>
15
+ <meta name="description" content="tester">
16
+ <meta name="viewport" content="width=device-width, initial-scale=1">
17
+ </head>
18
+ <body>
19
+ <main>
20
+ <h1>Page with all-capital text transformations</h1>
21
+ <p>This paragraph has ordinary text with an <abbr>HTML</abbr> abbreviation typed in capitals, which is not a style transformation.</p>
22
+ <p id="shout" style="text-transform: uppercase">Defect 1: This paragraph is transformed into capitals. Its <span>child span</span> inherits the transformation and is not separately reported.</p>
23
+ <p>Defect 2: This paragraph contains a <span id="capSpan" style="text-transform: uppercase">span transformed into capitals</span> within ordinary text.</p>
24
+ </main>
25
+ </body>
26
+ </html>
@@ -0,0 +1,38 @@
1
+ <!DOCTYPE html>
2
+ <!--
3
+ © 2026 Jeff Witt.
4
+
5
+ Licensed under the MIT License. See LICENSE file at the project root or
6
+ https://opensource.org/license/mit/ for details.
7
+
8
+ SPDX-License-Identifier: MIT
9
+ -->
10
+ <html lang="en-US">
11
+ <head>
12
+ <meta charset="utf-8">
13
+ <title>Page whose defects appear after an action</title>
14
+ <meta name="description" content="tester">
15
+ <meta name="viewport" content="width=device-width, initial-scale=1">
16
+ </head>
17
+ <body>
18
+ <main>
19
+ <h1>Page whose defects appear after an action</h1>
20
+ <p>At first the page has no defects. Activating the button below inserts a section containing a link without a destination and an image whose alternative text is a URL (defects the testaro linkTo and altScheme rules report), and an image without alternative text and a link without text (defects axe reports), so a test act at a checkpoint after the activation reports defects that a test act before it does not.</p>
21
+ <p><button id="more" type="button">Show more</button></p>
22
+ <div id="extra"></div>
23
+ </main>
24
+ <script>
25
+ document.getElementById('more').addEventListener('click', () => {
26
+ const extra = document.getElementById('extra');
27
+ if (! extra.firstElementChild) {
28
+ extra.innerHTML = '<section id="revealed"><h2>More</h2>'
29
+ + '<p>A link with no destination: <a id="noHref">Nowhere</a></p>'
30
+ + '<p>An image whose alternative text is a URL: <img src="data:image/gif;base64,R0lGODlhAQABAAAAACw=" alt="https://example.com/photo.png" width="20" height="20"></p>'
31
+ + '<p>An image with no alternative text: <img src="data:image/gif;base64,R0lGODlhAQABAAAAACw=" width="20" height="20"></p>'
32
+ + '<p>A link with no text: <a id="emptyLink" href="#more"></a></p>'
33
+ + '</section>';
34
+ }
35
+ });
36
+ </script>
37
+ </body>
38
+ </html>
@@ -28,7 +28,7 @@
28
28
  <p><label>Name a thing: <input type="text" name="thing" list="nonDatalist"></label></p>
29
29
  <p><button>Submit</button></p>
30
30
  </form>
31
- <p>The material and city inputs are defective.</p>
31
+ <p>The material, city, and thing inputs are defective: the list attribute is empty, references a missing element, or references a non-datalist element.</p>
32
32
  </main>
33
33
  </body>
34
34
  </html>
@@ -0,0 +1,29 @@
1
+ <!DOCTYPE html>
2
+ <!--
3
+ © 2021–2023 CVS Health and/or one of its affiliates. All rights reserved.
4
+ © 2026 Jeff Witt.
5
+
6
+ Licensed under the MIT License. See LICENSE file at the project root or
7
+ https://opensource.org/license/mit/ for details.
8
+
9
+ SPDX-License-Identifier: MIT
10
+ -->
11
+ <html lang="en-US">
12
+ <head>
13
+ <meta charset="utf-8">
14
+ <title>Page with deviant focusability and operability</title>
15
+ <meta name="description" content="tester">
16
+ <meta name="viewport" content="width=device-width, initial-scale=1">
17
+ </head>
18
+ <body>
19
+ <main>
20
+ <h1>Page with deviant focusability and operability</h1>
21
+ <p>This paragraph contains a link to <a href="https://en.wikipedia.org">information</a>, a <button id="badButton" type="button" tabindex="-1">button</button>, and a <label>text input <input type="text"></label>. Defect 1: The button is operable but not focusable.</p>
22
+ <p>Defect 2: This <span id="badSpan" tabindex="0">focusable span</span> is not operable.</p>
23
+ <p>But this <span tabindex="0" onclick="window.alert('Clicked')">second focusable span</span> is deemed operable, since it has a click handler, and this <span tabindex="0" role="button">third focusable span</span> is deemed operable, since it has a button role.</p>
24
+ <p>Defect 3: This paragraph contains a <span style="font-weight: bold" tabindex="0">focusable part</span> that is not operable.</p>
25
+ <p>Defect 4: If you click <span id="clickable" style="color: red" onclick="document.getElementById('clickable').style.color = 'black'">this text</span>, it will turn black, but it is not focusable.</p>
26
+ <p>Defect 5: This <span id="pointer" style="cursor: pointer">word</span> is not focusable, but its cursor makes you think it is operable.</p>
27
+ </main>
28
+ </body>
29
+ </html>
@@ -1,6 +1,7 @@
1
1
  <!DOCTYPE html>
2
2
  <!--
3
- © 2022–2023 CVS Health and/or one of its affiliates. All rights reserved.
3
+ © 2021–2023 CVS Health and/or one of its affiliates. All rights reserved.
4
+ © 2026 Jeff Witt.
4
5
 
5
6
  Licensed under the MIT License. See LICENSE file at the project root or
6
7
  https://opensource.org/license/mit/ for details.
@@ -18,6 +19,7 @@
18
19
  <main>
19
20
  <h1>Page with standard focusability and operability</h1>
20
21
  <p>This paragraph contains a link to <a href="https://en.wikipedia.org">information</a>, a <button type="button">button</button>, and a <label>text input <input type="text"></label>. All three are focusable and operable.</p>
22
+ <p>This <span tabindex="0" onclick="window.alert('Clicked')">focusable span</span> is operable, since it has a click handler, and this <span tabindex="0" role="button">other focusable span</span> is operable, since it has a button role.</p>
21
23
  </main>
22
24
  </body>
23
25
  </html>
@@ -20,7 +20,8 @@
20
20
  outline-offset: 2px;
21
21
  }
22
22
  #checkbox {
23
- transition-property: outline;
23
+ outline: 0px solid transparent;
24
+ transition-property: outline-width, outline-color;
24
25
  transition-delay: 35ms;
25
26
  transition-duration: 40ms;
26
27
  }
@@ -13,7 +13,16 @@
13
13
  <title>Page with valid and invalid elements in the head</title>
14
14
  <meta name="description" content="tester">
15
15
  <meta name="viewport" content="width=device-width, initial-scale=1">
16
- <p>This is a paragraph containing a <span id="headSpan">span</span>. Both are invalid.</p>
16
+ <!-- The HTML parser moves any p or span written literally inside the head into the body, so the invalid head children must be created by script for the rule to see them in the DOM. -->
17
+ <script>
18
+ const headP = document.createElement('p');
19
+ headP.textContent = 'This is a paragraph. It is invalid in the head.';
20
+ document.head.appendChild(headP);
21
+ const headSpan = document.createElement('span');
22
+ headSpan.id = 'headSpan';
23
+ headSpan.textContent = 'This span is also invalid in the head.';
24
+ document.head.appendChild(headSpan);
25
+ </script>
17
26
  </head>
18
27
  <body>
19
28
  <main>
@@ -46,6 +46,16 @@
46
46
  background-color: #ccc;
47
47
  margin: 0.5rem 0;
48
48
  }
49
+ ul.tight > li {
50
+ margin: 0;
51
+ height: 16px;
52
+ }
53
+ a.stacked {
54
+ display: block;
55
+ padding: 0;
56
+ height: 16px;
57
+ line-height: 16px;
58
+ }
49
59
  </style>
50
60
  </head>
51
61
  <body>
@@ -75,7 +85,11 @@
75
85
  <li style="min-height: 3rem">W3C: <a class="deep" href="https://w3c.org">World Wide Web Consortium (big)</a></li>
76
86
  <li>WF: <a href="https://wikimedia.org">Wikimedia Foundation (small but inline)</a></li>
77
87
  <li>WF: <a href="https://wikimedia.org">Wikimedia Foundation (tiny but inline)</a></li>
78
- <p>Violations to be determined after refactoring and redefinition</p>
88
+ </ul>
89
+ <p>Here are two links stacked with no space between them:</p>
90
+ <ul class="tight">
91
+ <li><a class="stacked" href="https://w3c.org">World Wide Web Consortium (stacked)</a></li>
92
+ <li><a class="stacked" href="https://wikimedia.org">Wikimedia Foundation (stacked)</a></li>
79
93
  </ul>
80
94
  </main>
81
95
  </body>
@@ -0,0 +1,42 @@
1
+ <!DOCTYPE html>
2
+ <!--
3
+ © 2026 Jeff Witt.
4
+
5
+ Licensed under the MIT License. See LICENSE file at the project root or
6
+ https://opensource.org/license/mit/ for details.
7
+
8
+ SPDX-License-Identifier: MIT
9
+ -->
10
+ <html lang="en-US">
11
+ <head>
12
+ <meta charset="utf-8">
13
+ <title>Form whose completion reveals defects</title>
14
+ <meta name="description" content="tester">
15
+ <meta name="viewport" content="width=device-width, initial-scale=1">
16
+ </head>
17
+ <body>
18
+ <main>
19
+ <h1>Form whose completion reveals defects</h1>
20
+ <p>A recorded user path fills the name, chooses a color, and activates Continue. The name input has only a placeholder as its label (a defect the testaro phOnly rule reports). Continuing inserts a section containing a link without a destination and an image whose alternative text is a URL (defects the linkTo and altScheme rules report), so a test act at a checkpoint after the activation reports defects that one before it does not.</p>
21
+ <form>
22
+ <p><input id="name" type="text" placeholder="Your name"></p>
23
+ <p><label for="color">Favorite color</label> <select id="color"><option value="">Choose</option><option value="red">Red</option><option value="green">Green</option></select></p>
24
+ <p><button id="continue" type="button">Continue</button></p>
25
+ </form>
26
+ <div id="extra"></div>
27
+ </main>
28
+ <script>
29
+ document.getElementById('continue').addEventListener('click', () => {
30
+ const extra = document.getElementById('extra');
31
+ const name = document.getElementById('name').value;
32
+ const color = document.getElementById('color').value;
33
+ if (! extra.firstElementChild && name && color) {
34
+ extra.innerHTML = '<section id="revealed"><h2>Thanks, ' + name + '</h2>'
35
+ + '<p>Your color is ' + color + '. A link with no destination: <a id="noHref">Nowhere</a></p>'
36
+ + '<p>An image whose alternative text is a URL: <img src="data:image/gif;base64,R0lGODlhAQABAAAAACw=" alt="https://example.com/photo.png" width="20" height="20"></p>'
37
+ + '</section>';
38
+ }
39
+ });
40
+ </script>
41
+ </body>
42
+ </html>