testaro 78.0.6 → 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 (361) 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 +25 -19
  7. package/CONTAINERS.md +10 -6
  8. package/CONTRIBUTING.md +29 -3
  9. package/Dockerfile +1 -1
  10. package/README.md +75 -20
  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 +373 -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 +313 -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 +63 -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/getSource.js +1 -0
  38. package/procs/job.js +116 -1
  39. package/procs/launch.d.ts +40 -0
  40. package/procs/launch.js +239 -108
  41. package/procs/nu.d.ts +48 -0
  42. package/procs/nu.js +1 -0
  43. package/procs/scope.js +196 -0
  44. package/procs/shoot.d.ts +33 -0
  45. package/procs/shoot.js +3 -1
  46. package/procs/standard.d.ts +18 -0
  47. package/procs/standard.js +83 -0
  48. package/procs/standard.ts +126 -0
  49. package/procs/testAct.js +145 -0
  50. package/procs/testaro.d.ts +20 -0
  51. package/procs/testaro.js +237 -189
  52. package/procs/testaro.ts +321 -0
  53. package/procs/userPath.js +126 -0
  54. package/procs/xPath.d.ts +4 -0
  55. package/procs/xPath.js +82 -64
  56. package/procs/xPath.ts +106 -0
  57. package/procs/xPathScript.d.ts +6 -0
  58. package/procs/xPathScript.js +70 -0
  59. package/run.js +3 -2
  60. package/surea11y/README.md +44 -0
  61. package/surea11y/surea11y.browser.js +14 -0
  62. package/testaro/adbID.d.ts +3 -0
  63. package/testaro/adbID.js +39 -41
  64. package/testaro/adbID.ts +66 -0
  65. package/testaro/allCapStyle.d.ts +3 -0
  66. package/testaro/allCapStyle.js +32 -34
  67. package/testaro/allCapStyle.ts +55 -0
  68. package/testaro/allCaps.d.ts +16 -0
  69. package/testaro/allCaps.js +179 -151
  70. package/testaro/allCaps.ts +228 -0
  71. package/testaro/allHidden.d.ts +13 -0
  72. package/testaro/allHidden.js +30 -30
  73. package/testaro/allHidden.ts +50 -0
  74. package/testaro/allSlanted.d.ts +3 -0
  75. package/testaro/allSlanted.js +31 -33
  76. package/testaro/allSlanted.ts +54 -0
  77. package/testaro/altScheme.d.ts +3 -0
  78. package/testaro/altScheme.js +28 -30
  79. package/testaro/altScheme.ts +50 -0
  80. package/testaro/attVal.d.ts +3 -0
  81. package/testaro/attVal.js +21 -21
  82. package/testaro/attVal.ts +52 -0
  83. package/testaro/autocomplete.d.ts +3 -0
  84. package/testaro/autocomplete.js +60 -75
  85. package/testaro/autocomplete.ts +101 -0
  86. package/testaro/bulk.d.ts +13 -0
  87. package/testaro/bulk.js +33 -33
  88. package/testaro/bulk.ts +55 -0
  89. package/testaro/buttonMenu.d.ts +9 -0
  90. package/testaro/buttonMenu.js +318 -319
  91. package/testaro/buttonMenu.ts +391 -0
  92. package/testaro/captionLoc.d.ts +3 -0
  93. package/testaro/captionLoc.js +18 -20
  94. package/testaro/captionLoc.ts +40 -0
  95. package/testaro/datalistRef.d.ts +3 -0
  96. package/testaro/datalistRef.js +34 -36
  97. package/testaro/datalistRef.ts +55 -0
  98. package/testaro/distortion.d.ts +3 -0
  99. package/testaro/distortion.js +58 -26
  100. package/testaro/distortion.ts +81 -0
  101. package/testaro/docType.d.ts +15 -0
  102. package/testaro/docType.js +26 -25
  103. package/testaro/docType.ts +45 -0
  104. package/testaro/dupAtt.d.ts +16 -0
  105. package/testaro/dupAtt.js +114 -104
  106. package/testaro/dupAtt.ts +144 -0
  107. package/testaro/elements.d.ts +6 -0
  108. package/testaro/elements.js +153 -153
  109. package/testaro/elements.ts +215 -0
  110. package/testaro/embAc.d.ts +3 -0
  111. package/testaro/embAc.js +20 -20
  112. package/testaro/embAc.ts +40 -0
  113. package/testaro/focAll.d.ts +13 -0
  114. package/testaro/focAll.js +186 -191
  115. package/testaro/focAll.ts +217 -0
  116. package/testaro/focAndOp.d.ts +3 -0
  117. package/testaro/focAndOp.js +101 -104
  118. package/testaro/focAndOp.ts +128 -0
  119. package/testaro/focInd.d.ts +3 -0
  120. package/testaro/focInd.js +65 -66
  121. package/testaro/focInd.ts +96 -0
  122. package/testaro/focVis.d.ts +3 -0
  123. package/testaro/focVis.js +29 -30
  124. package/testaro/focVis.ts +52 -0
  125. package/testaro/headEl.d.ts +10 -0
  126. package/testaro/headEl.js +62 -62
  127. package/testaro/headEl.ts +82 -0
  128. package/testaro/headingAmb.d.ts +3 -0
  129. package/testaro/headingAmb.js +55 -63
  130. package/testaro/headingAmb.ts +72 -0
  131. package/testaro/hovInd.d.ts +12 -0
  132. package/testaro/hovInd.js +164 -130
  133. package/testaro/hovInd.ts +199 -0
  134. package/testaro/hover.d.ts +3 -0
  135. package/testaro/hover.js +156 -126
  136. package/testaro/hover.ts +154 -0
  137. package/testaro/hr.d.ts +3 -0
  138. package/testaro/hr.js +15 -17
  139. package/testaro/hr.ts +36 -0
  140. package/testaro/imageLink.d.ts +3 -0
  141. package/testaro/imageLink.js +18 -20
  142. package/testaro/imageLink.ts +42 -0
  143. package/testaro/labClash.d.ts +3 -0
  144. package/testaro/labClash.js +32 -33
  145. package/testaro/labClash.ts +54 -0
  146. package/testaro/legendLoc.d.ts +3 -0
  147. package/testaro/legendLoc.js +18 -20
  148. package/testaro/legendLoc.ts +42 -0
  149. package/testaro/lineHeight.d.ts +3 -0
  150. package/testaro/lineHeight.js +44 -48
  151. package/testaro/lineHeight.ts +70 -0
  152. package/testaro/linkAmb.d.ts +7 -0
  153. package/testaro/linkAmb.js +80 -80
  154. package/testaro/linkAmb.ts +105 -0
  155. package/testaro/linkExt.d.ts +3 -0
  156. package/testaro/linkExt.js +14 -16
  157. package/testaro/linkExt.ts +35 -0
  158. package/testaro/linkOldAtt.d.ts +3 -0
  159. package/testaro/linkOldAtt.js +26 -28
  160. package/testaro/linkOldAtt.ts +48 -0
  161. package/testaro/linkTo.d.ts +3 -0
  162. package/testaro/linkTo.js +23 -22
  163. package/testaro/linkTo.ts +43 -0
  164. package/testaro/linkUl.d.ts +3 -0
  165. package/testaro/linkUl.js +31 -34
  166. package/testaro/linkUl.ts +54 -0
  167. package/testaro/miniText.d.ts +3 -0
  168. package/testaro/miniText.js +42 -44
  169. package/testaro/miniText.ts +68 -0
  170. package/testaro/motion.d.ts +10 -0
  171. package/testaro/motion.js +93 -96
  172. package/testaro/motion.ts +125 -0
  173. package/testaro/nonTable.d.ts +3 -0
  174. package/testaro/nonTable.js +40 -45
  175. package/testaro/nonTable.ts +66 -0
  176. package/testaro/optRoleSel.d.ts +3 -0
  177. package/testaro/optRoleSel.js +17 -19
  178. package/testaro/optRoleSel.ts +41 -0
  179. package/testaro/phOnly.d.ts +3 -0
  180. package/testaro/phOnly.js +19 -21
  181. package/testaro/phOnly.ts +43 -0
  182. package/testaro/pseudoP.d.ts +3 -0
  183. package/testaro/pseudoP.js +37 -38
  184. package/testaro/pseudoP.ts +59 -0
  185. package/testaro/radioSet.d.ts +3 -0
  186. package/testaro/radioSet.js +58 -59
  187. package/testaro/radioSet.ts +79 -0
  188. package/testaro/registry.d.ts +63 -0
  189. package/testaro/registry.js +67 -0
  190. package/testaro/registry.ts +141 -0
  191. package/testaro/role.d.ts +3 -0
  192. package/testaro/role.js +28 -29
  193. package/testaro/role.ts +53 -0
  194. package/testaro/secHeading.d.ts +3 -0
  195. package/testaro/secHeading.js +31 -33
  196. package/testaro/secHeading.ts +53 -0
  197. package/testaro/styleDiff.d.ts +25 -0
  198. package/testaro/styleDiff.js +249 -252
  199. package/testaro/styleDiff.ts +303 -0
  200. package/testaro/tabNav.d.ts +33 -0
  201. package/testaro/tabNav.js +273 -342
  202. package/testaro/tabNav.ts +454 -0
  203. package/testaro/targetsNear.d.ts +9 -0
  204. package/testaro/targetsNear.js +131 -132
  205. package/testaro/targetsNear.ts +160 -0
  206. package/testaro/textNodes.d.ts +6 -0
  207. package/testaro/textNodes.js +139 -135
  208. package/testaro/textNodes.ts +185 -0
  209. package/testaro/textSem.d.ts +3 -0
  210. package/testaro/textSem.js +26 -28
  211. package/testaro/textSem.ts +47 -0
  212. package/testaro/title.d.ts +9 -0
  213. package/testaro/title.js +16 -13
  214. package/testaro/title.ts +31 -0
  215. package/testaro/titledEl.d.ts +3 -0
  216. package/testaro/titledEl.js +16 -18
  217. package/testaro/titledEl.ts +38 -0
  218. package/testaro/zIndex.d.ts +3 -0
  219. package/testaro/zIndex.js +20 -22
  220. package/testaro/zIndex.ts +42 -0
  221. package/tests/alfa.d.ts +45 -0
  222. package/tests/alfa.js +139 -141
  223. package/tests/alfa.ts +214 -0
  224. package/tests/aslint.d.ts +33 -0
  225. package/tests/aslint.js +273 -249
  226. package/tests/aslint.ts +301 -0
  227. package/tests/axe.d.ts +27 -0
  228. package/tests/axe.js +200 -200
  229. package/tests/axe.ts +277 -0
  230. package/tests/ed11y.d.ts +28 -0
  231. package/tests/ed11y.js +142 -99
  232. package/tests/ed11y.ts +178 -0
  233. package/tests/htmlcs.d.ts +21 -0
  234. package/tests/htmlcs.js +175 -140
  235. package/tests/htmlcs.ts +181 -0
  236. package/tests/ibm.d.ts +52 -0
  237. package/tests/ibm.js +165 -166
  238. package/tests/ibm.ts +251 -0
  239. package/tests/nuVal.d.ts +13 -0
  240. package/tests/nuVal.js +107 -112
  241. package/tests/nuVal.ts +145 -0
  242. package/tests/nuVnu.d.ts +15 -0
  243. package/tests/nuVnu.js +142 -111
  244. package/tests/nuVnu.ts +144 -0
  245. package/tests/pour.d.ts +31 -0
  246. package/tests/pour.js +242 -0
  247. package/tests/pour.ts +273 -0
  248. package/tests/qualWeb.d.ts +39 -0
  249. package/tests/qualWeb.js +303 -272
  250. package/tests/qualWeb.ts +415 -0
  251. package/tests/surea11y.d.ts +33 -0
  252. package/tests/surea11y.js +288 -0
  253. package/tests/surea11y.ts +334 -0
  254. package/tests/testaro.d.ts +25 -0
  255. package/tests/testaro.js +746 -652
  256. package/tests/testaro.ts +862 -0
  257. package/tests/wave.d.ts +46 -0
  258. package/tests/wave.js +167 -177
  259. package/tests/wave.ts +252 -0
  260. package/tsconfig.json +17 -0
  261. package/types.d.ts +243 -0
  262. package/types.js +10 -0
  263. package/types.ts +376 -0
  264. package/validation/act/README.md +46 -0
  265. package/validation/act/capture.js +424 -0
  266. package/validation/act/chromium-issue-draft.md +66 -0
  267. package/validation/act/fp-triage-2026-08-22.md +86 -0
  268. package/validation/act/isolation-notes.md +159 -0
  269. package/validation/act/playwright-issue-draft.md +73 -0
  270. package/validation/act/propose-mappings.js +0 -0
  271. package/validation/act/repro-cdp-raw.js +105 -0
  272. package/validation/act/repro-metarefresh.js +65 -0
  273. package/validation/act/score.js +184 -0
  274. package/validation/act/stage3a-stress-report.md +69 -0
  275. package/validation/act/stage3b-mapping-proposals.md +94 -0
  276. package/validation/act/stage3b-triage-draft.md +138 -0
  277. package/validation/act/surea11y-track-a-2026-09-01.md +50 -0
  278. package/validation/executors/netWatch.js +180 -90
  279. package/validation/executors/test.js +17 -2
  280. package/validation/executors/tests.js +118 -10
  281. package/validation/jobs/reports/raw/260901T1000-surea11y-validation.json +964 -0
  282. package/validation/jobs/todo/240101T1200-simple-example.json +14 -6
  283. package/validation/jobs/todo/240101T1300-shoot-example.json +2 -1
  284. package/validation/jobs/todo/260821T1900-pour-validation.json +45 -0
  285. package/validation/jobs/todo/260901T1000-surea11y-validation.json +45 -0
  286. package/validation/knownFailures.json +1 -0
  287. package/validation/tests/jobProperties/adbID.json +27 -2
  288. package/validation/tests/jobProperties/{focOp.json → allCapStyle.json} +56 -53
  289. package/validation/tests/jobProperties/allCaps.json +25 -0
  290. package/validation/tests/jobProperties/allHidden.json +133 -13
  291. package/validation/tests/jobProperties/allSlanted.json +3 -3
  292. package/validation/tests/jobProperties/altScheme.json +23 -8
  293. package/validation/tests/jobProperties/attVal.json +57 -57
  294. package/validation/tests/jobProperties/autocomplete.json +11 -1
  295. package/validation/tests/jobProperties/bulk.json +6 -1
  296. package/validation/tests/jobProperties/buttonMenu.json +63 -42
  297. package/validation/tests/jobProperties/captionLoc.json +1 -6
  298. package/validation/tests/jobProperties/checkpoint-browser.json +401 -0
  299. package/validation/tests/jobProperties/checkpoint-page.json +397 -0
  300. package/validation/tests/jobProperties/checkpoint.json +395 -0
  301. package/validation/tests/jobProperties/datalistRef.json +20 -5
  302. package/validation/tests/jobProperties/distortion.json +28 -3
  303. package/validation/tests/jobProperties/docType.json +2 -2
  304. package/validation/tests/jobProperties/dupAtt.json +48 -33
  305. package/validation/tests/jobProperties/elements.json +28 -28
  306. package/validation/tests/jobProperties/embAc.json +36 -31
  307. package/validation/tests/jobProperties/focAndOp.json +284 -0
  308. package/validation/tests/jobProperties/focInd.json +34 -34
  309. package/validation/tests/jobProperties/focVis.json +1 -1
  310. package/validation/tests/jobProperties/hover.json +39 -37
  311. package/validation/tests/jobProperties/hr.json +13 -3
  312. package/validation/tests/jobProperties/imageLink.json +0 -5
  313. package/validation/tests/jobProperties/labClash.json +68 -33
  314. package/validation/tests/jobProperties/legendLoc.json +1 -6
  315. package/validation/tests/jobProperties/lineHeight.json +2 -2
  316. package/validation/tests/jobProperties/linkAmb.json +13 -18
  317. package/validation/tests/jobProperties/linkExt.json +1 -1
  318. package/validation/tests/jobProperties/linkOldAtt.json +12 -2
  319. package/validation/tests/jobProperties/linkTo.json +1 -1
  320. package/validation/tests/jobProperties/linkUl.json +65 -65
  321. package/validation/tests/jobProperties/miniText.json +7 -2
  322. package/validation/tests/jobProperties/motion.json +4 -50
  323. package/validation/tests/jobProperties/nonTable.json +48 -3
  324. package/validation/tests/jobProperties/optRoleSel.json +12 -2
  325. package/validation/tests/jobProperties/phOnly.json +6 -16
  326. package/validation/tests/jobProperties/pseudoP.json +17 -2
  327. package/validation/tests/jobProperties/radioSet.json +30 -30
  328. package/validation/tests/jobProperties/role.json +25 -5
  329. package/validation/tests/jobProperties/secHeading.json +26 -21
  330. package/validation/tests/jobProperties/styleDiff.json +35 -5
  331. package/validation/tests/jobProperties/tabNav.json +3 -1
  332. package/validation/tests/jobProperties/targetsNear.json +237 -0
  333. package/validation/tests/jobProperties/textNodes.json +29 -29
  334. package/validation/tests/jobProperties/textSem.json +26 -1
  335. package/validation/tests/jobProperties/title.json +12 -2
  336. package/validation/tests/jobProperties/titledEl.json +39 -9
  337. package/validation/tests/jobProperties/userPath.json +317 -0
  338. package/validation/tests/jobProperties/zIndex.json +40 -35
  339. package/validation/tests/targets/allCapStyle/index.html +26 -0
  340. package/validation/tests/targets/checkpoint/index.html +38 -0
  341. package/validation/tests/targets/datalistRef/index.html +1 -1
  342. package/validation/tests/targets/focAndOp/bad.html +29 -0
  343. package/validation/tests/targets/{focOp → focAndOp}/good.html +3 -1
  344. package/validation/tests/targets/focInd/bad.html +2 -1
  345. package/validation/tests/targets/headEl/index.html +10 -1
  346. package/validation/tests/targets/{targetSmall → targetsNear}/index.html +15 -1
  347. package/validation/tests/targets/userPath/index.html +42 -0
  348. package/validation/validateTest.js +62 -10
  349. package/.claude/settings.local.json +0 -11
  350. package/.eslintrc.json +0 -41
  351. package/htmlcs/.eslintrc.json +0 -67
  352. package/memory/MEMORY.md +0 -3
  353. package/memory/project_validation_pause.md +0 -10
  354. package/validation/tests/jobProperties/linkTitle.json +0 -127
  355. package/validation/tests/jobProperties/opFoc.json +0 -164
  356. package/validation/tests/jobProperties/targetSmall.json +0 -152
  357. package/validation/tests/jobProperties/targetTiny.json +0 -142
  358. package/validation/tests/targets/focOp/bad.html +0 -25
  359. package/validation/tests/targets/linkTitle/index.html +0 -24
  360. package/validation/tests/targets/opFoc/bad.html +0 -26
  361. package/validation/tests/targets/opFoc/good.html +0 -23
@@ -1,6 +1,7 @@
1
1
  /*
2
2
  © 2022–2025 CVS Health and/or one of its affiliates. All rights reserved.
3
- © 2025 Jonathan Robert Pool.
3
+ © 2026 Jeff Witt.
4
+ © 2025–2026 Jonathan Robert Pool.
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.
@@ -15,13 +16,13 @@
15
16
 
16
17
  // IMPORTS
17
18
 
18
- // Module to process files.
19
- const fs = require('fs').promises;
20
19
  // Module to run Testaro jobs.
21
20
  const {doJob} = require('../run');
21
+ // Function to evaluate an expectation against an object.
22
+ const {isTrue} = require('../procs/doActs');
22
23
 
23
24
  // CONSTANTS
24
- const job = {
25
+ const jobTemplate = {
25
26
  id: '250101T0000-aaa-00',
26
27
  what: '',
27
28
  strict: true,
@@ -52,18 +53,45 @@ const job = {
52
53
 
53
54
  // FUNCTIONS
54
55
 
55
- // Validates a Testaro test.
56
+ // Validates a Testaro test and returns a result summary.
56
57
  exports.validateTest = async testID => {
57
58
  // Get data for a job for the test.
58
59
  const jobProperties = require(`./tests/jobProperties/${testID}.json`);
59
- // Use the data to complete the job.
60
+ // Use the data to complete a copy of the job template, so jobs cannot contaminate each other.
61
+ const job = structuredClone(jobTemplate);
62
+ // Give the job an ID unique to this process, so concurrent validations do not share a
63
+ // temporary directory (run.js keeps and deletes tmp/<jobID>).
64
+ job.id = `${jobTemplate.id}-${process.pid}-${Date.now().toString(36)}`;
60
65
  if (jobProperties.standard) {
61
66
  job.standard = jobProperties.standard;
62
67
  }
68
+ // Test-act isolation (process, browser, or page), if the validator specifies it.
69
+ if (jobProperties.isolation) {
70
+ job.isolation = jobProperties.isolation;
71
+ }
72
+ // Rules that compare a page with its catalog image (motion) need one to be made.
73
+ if (jobProperties.imageColor !== undefined) {
74
+ job.imageColor = jobProperties.imageColor;
75
+ }
63
76
  job.what = `validate Testaro test ${jobProperties.rule}`;
64
77
  job.acts = jobProperties.acts;
65
- // Perform it.
66
- report = await doJob(job);
78
+ /*
79
+ Make the job target the page that the job launches. The catalog, and the page
80
+ image that the motion rule compares its own screenshot with, are made on the
81
+ job target before the first act, so leaving the target at its default made
82
+ every validation catalog a catalog of an unrelated page.
83
+ */
84
+ const launchAct = jobProperties.acts.find(act => act.type === 'launch');
85
+ if (launchAct && launchAct.target && launchAct.target.url) {
86
+ job.target = {
87
+ what: launchAct.target.what || 'page for test validation',
88
+ url: launchAct.target.url
89
+ };
90
+ }
91
+ // Initialize the failure descriptions.
92
+ const failures = [];
93
+ // Perform the job.
94
+ const report = await doJob(job);
67
95
  // Report whether the end time was reported.
68
96
  const {acts, jobData} = report;
69
97
  if (jobData.endTime && /^(?:\d{2}-){2}\d{2}T\d{2}:\d{2}$/.test(jobData.endTime)) {
@@ -71,6 +99,22 @@ exports.validateTest = async testID => {
71
99
  }
72
100
  else {
73
101
  console.log('Failure: End time empty or invalid');
102
+ failures.push('End time empty or invalid');
103
+ }
104
+ // If the validator has report-level expectations, evaluate them against the report.
105
+ const reportExpectations = jobProperties.expectReport;
106
+ if (Array.isArray(reportExpectations)) {
107
+ reportExpectations.forEach(spec => {
108
+ const truth = isTrue(report, spec, report.catalog);
109
+ if (! truth[1]) {
110
+ const message = `Report expectation ${JSON.stringify(spec)} not met (actual ${JSON.stringify(truth[0])})`;
111
+ console.log(`Failure: ${message}`);
112
+ failures.push(message);
113
+ }
114
+ });
115
+ if (! failures.length) {
116
+ console.log('Success: Report expectations met');
117
+ }
74
118
  }
75
119
  // If the test acts were correctly reported:
76
120
  const testActs = acts.filter(act => act.type && act.type === 'test');
@@ -82,8 +126,8 @@ exports.validateTest = async testID => {
82
126
  ) {
83
127
  // Report this.
84
128
  console.log('Success: Reports have been correctly populated');
85
- // If all expectations were satisfied:
86
- if (testActs.every(testAct => testAct.expectationFailures === 0)) {
129
+ // If all expectations, including any report-level ones, were satisfied:
130
+ if (testActs.every(testAct => testAct.expectationFailures === 0) && ! failures.length) {
87
131
  // Report this.
88
132
  console.log('######## Success: No failures\n');
89
133
  }
@@ -93,6 +137,7 @@ exports.validateTest = async testID => {
93
137
  console.log(
94
138
  '######## Failure: The test has at least one failure (see “"passed": false” below)\n'
95
139
  );
140
+ failures.push('At least one expectation was not satisfied');
96
141
  // Output the acts that had failures.
97
142
  console.log(
98
143
  JSON.stringify(
@@ -103,6 +148,13 @@ exports.validateTest = async testID => {
103
148
  }
104
149
  else {
105
150
  console.log('Failure: Act results empty or invalid');
151
+ failures.push('Act results empty or invalid');
106
152
  console.log(JSON.stringify(acts, null, 2));
107
153
  }
154
+ // Return the result summary.
155
+ return {
156
+ testID,
157
+ success: ! failures.length,
158
+ failures
159
+ };
108
160
  };
@@ -1,11 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(git branch *)",
5
- "Bash(git add *)",
6
- "Bash(git commit -m ' *)",
7
- "Bash(git push *)"
8
- ]
9
- },
10
- "outputStyle": "Explanatory"
11
- }
package/.eslintrc.json DELETED
@@ -1,41 +0,0 @@
1
- {
2
- "env": {
3
- "browser": true,
4
- "commonjs": true,
5
- "es2021": true,
6
- "node": true
7
- },
8
- "extends": "eslint:recommended",
9
- "parserOptions": {
10
- "ecmaVersion": 2021
11
- },
12
- "rules": {
13
- "indent": [
14
- "error",
15
- 2,
16
- {
17
- "MemberExpression": 0,
18
- "ObjectExpression": "first"
19
- }
20
- ],
21
- "linebreak-style": [
22
- "error",
23
- "unix"
24
- ],
25
- "quotes": [
26
- "error",
27
- "single"
28
- ],
29
- "semi": [
30
- "error",
31
- "always"
32
- ],
33
- "no-use-before-define": [
34
- "error"
35
- ],
36
- "brace-style": [
37
- "error",
38
- "stroustrup"
39
- ]
40
- }
41
- }
@@ -1,67 +0,0 @@
1
- {
2
- "root": true,
3
- "env": {
4
- "browser": true,
5
- "commonjs": true,
6
- "es2021": true,
7
- "node": true
8
- },
9
- "extends": "eslint:recommended",
10
- "parserOptions": {
11
- "ecmaVersion": 5
12
- },
13
- "rules": {
14
- "indent": [
15
- "error",
16
- 2,
17
- {
18
- "MemberExpression": 0,
19
- "ObjectExpression": "first"
20
- }
21
- ],
22
- "linebreak-style": [
23
- "error",
24
- "unix"
25
- ],
26
- "quotes": [
27
- "error",
28
- "single"
29
- ],
30
- "semi": [
31
- "error",
32
- "always"
33
- ],
34
- "brace-style": [
35
- "error",
36
- "stroustrup"
37
- ],
38
- "no-undef": "off",
39
- "no-redeclare": "off",
40
- "no-unused-vars": "off",
41
- "no-empty": "off",
42
- "no-prototype-builtins": "off",
43
- "no-cond-assign": "off",
44
- "no-fallthrough": "off",
45
- "no-constant-condition": "off",
46
- "block-spacing": [
47
- "error",
48
- "never"
49
- ],
50
- "array-bracket-spacing": [
51
- "error",
52
- "never"
53
- ],
54
- "space-before-function-paren": [
55
- "error",
56
- "always"
57
- ],
58
- "space-in-parens": [
59
- "error",
60
- "never"
61
- ],
62
- "object-curly-spacing": [
63
- "error",
64
- "never"
65
- ]
66
- }
67
- }
package/memory/MEMORY.md DELETED
@@ -1,3 +0,0 @@
1
- # Memory Index
2
-
3
- - [Validation system paused](project_validation_pause.md) — new validation tests on hold pending redesign of broken validation architecture
@@ -1,10 +0,0 @@
1
- ---
2
- name: Validation system paused
3
- description: All new validation test work is on hold pending a redesign of the currently broken validation architecture
4
- type: project
5
- ---
6
-
7
- New validation tests and updates to existing validation tests are paused. The validation system is currently broken and a redesign is anticipated. Do not create or modify files in validation/tests/ until the user indicates the redesign is underway.
8
-
9
- **Why:** The validation architecture is broken and being reconsidered.
10
- **How to apply:** Skip validation file creation/updates when adding or modifying Testaro rules until further notice.
@@ -1,127 +0,0 @@
1
- {
2
- "rule": "linkTitle",
3
- "timeLimit": 20,
4
- "acts": [
5
- {
6
- "type": "launch",
7
- "target": {
8
- "url": "file://validation/tests/targets/linkTitle/index.html",
9
- "what": "page with normal and rodundantly titled links"
10
- }
11
- },
12
- {
13
- "type": "test",
14
- "which": "testaro",
15
- "withItems": true,
16
- "stopOnFail": true,
17
- "expect": [
18
- [
19
- "standardResult.totals.0",
20
- "=",
21
- 1
22
- ],
23
- [
24
- "standardResult.totals.3",
25
- "=",
26
- 0
27
- ],
28
- [
29
- "standardResult.instances.length",
30
- "=",
31
- 1
32
- ],
33
- [
34
- "standardResult.instances.0.ruleID",
35
- "=",
36
- "linkTitle"
37
- ],
38
- [
39
- "standardResult.instances.0.what",
40
- "i",
41
- "Link has"
42
- ],
43
- [
44
- "standardResult.instances.0.ordinalSeverity",
45
- "=",
46
- 0
47
- ],
48
- [
49
- "standardResult.instances.0.tagName",
50
- "=",
51
- "A"
52
- ],
53
- [
54
- "standardResult.instances.0.id",
55
- "=",
56
- "basqueInfo"
57
- ],
58
- [
59
- "standardResult.instances.0.location.type",
60
- "=",
61
- "selector"
62
- ],
63
- [
64
- "standardResult.instances.0.location.spec",
65
- "=",
66
- "#basqueInfo"
67
- ],
68
- [
69
- "standardResult.instances.0.excerpt",
70
- "i",
71
- "Basque information"
72
- ]
73
- ],
74
- "rules": [
75
- "y",
76
- "linkTitle"
77
- ]
78
- },
79
- {
80
- "type": "test",
81
- "which": "testaro",
82
- "withItems": false,
83
- "stopOnFail": true,
84
- "expect": [
85
- [
86
- "standardResult.totals.0",
87
- "=",
88
- 1
89
- ],
90
- [
91
- "standardResult.totals.2",
92
- "=",
93
- 0
94
- ],
95
- [
96
- "standardResult.instances.length",
97
- "=",
98
- 1
99
- ],
100
- [
101
- "standardResult.instances.0.ruleID",
102
- "=",
103
- "linkTitle"
104
- ],
105
- [
106
- "standardResult.instances.0.count",
107
- "=",
108
- 1
109
- ],
110
- [
111
- "standardResult.instances.0.what",
112
- "i",
113
- "Links have"
114
- ],
115
- [
116
- "standardResult.instances.0.tagName",
117
- "=",
118
- "A"
119
- ]
120
- ],
121
- "rules": [
122
- "y",
123
- "linkTitle"
124
- ]
125
- }
126
- ]
127
- }
@@ -1,164 +0,0 @@
1
- {
2
- "rule": "opFoc",
3
- "timeLimit": 20,
4
- "acts": [
5
- {
6
- "type": "launch",
7
- "target": {
8
- "url": "file://validation/tests/targets/opFoc/good.html",
9
- "what": "page with standard focusability and operability"
10
- }
11
- },
12
- {
13
- "type": "test",
14
- "which": "testaro",
15
- "withItems": true,
16
- "stopOnFail": true,
17
- "expect": [
18
- [
19
- "standardResult.totals.2",
20
- "=",
21
- 0
22
- ],
23
- [
24
- "standardResult.totals.3",
25
- "=",
26
- 0
27
- ],
28
- [
29
- "standardResult.instances.length",
30
- "=",
31
- 0
32
- ]
33
- ],
34
- "rules": [
35
- "y",
36
- "opFoc"
37
- ]
38
- },
39
- {
40
- "type": "url",
41
- "which": "file://validation/tests/targets/opFoc/bad.html",
42
- "what": "page with deviant focusability and operability"
43
- },
44
- {
45
- "type": "test",
46
- "which": "testaro",
47
- "withItems": true,
48
- "stopOnFail": true,
49
- "expect": [
50
- [
51
- "standardResult.totals.2",
52
- "=",
53
- 0
54
- ],
55
- [
56
- "standardResult.totals.3",
57
- "=",
58
- 3
59
- ],
60
- [
61
- "standardResult.instances.0.ruleID",
62
- "=",
63
- "opFoc"
64
- ],
65
- [
66
- "standardResult.instances.0.what",
67
- "i",
68
- "Element is operable (tag name BUTTON)"
69
- ],
70
- [
71
- "standardResult.instances.0.ordinalSeverity",
72
- "=",
73
- 3
74
- ],
75
- [
76
- "standardResult.instances.0.tagName",
77
- "=",
78
- "BUTTON"
79
- ],
80
- [
81
- "standardResult.instances.0.location.doc",
82
- "=",
83
- "dom"
84
- ],
85
- [
86
- "standardResult.instances.0.location.type",
87
- "=",
88
- "box"
89
- ],
90
- [
91
- "standardResult.instances.0.location.spec.width",
92
- ">",
93
- 0
94
- ],
95
- [
96
- "standardResult.instances.0.excerpt",
97
- "=",
98
- "button"
99
- ],
100
- [
101
- "standardResult.instances.1.tagName",
102
- "=",
103
- "SPAN"
104
- ],
105
- [
106
- "standardResult.instances.2.what",
107
- "i",
108
- "Element is operable (pointer cursor)"
109
- ]
110
- ],
111
- "rules": [
112
- "y",
113
- "opFoc"
114
- ]
115
- },
116
- {
117
- "type": "test",
118
- "which": "testaro",
119
- "withItems": false,
120
- "stopOnFail": true,
121
- "expect": [
122
- [
123
- "standardResult.totals.2",
124
- "=",
125
- 0
126
- ],
127
- [
128
- "standardResult.totals.3",
129
- "=",
130
- 3
131
- ],
132
- [
133
- "standardResult.totals.1",
134
- "=",
135
- 0
136
- ],
137
- [
138
- "standardResult.instances.0.ruleID",
139
- "=",
140
- "opFoc"
141
- ],
142
- [
143
- "standardResult.instances.0.what",
144
- "i",
145
- "Elements are operable but"
146
- ],
147
- [
148
- "standardResult.instances.0.ordinalSeverity",
149
- "=",
150
- 3
151
- ],
152
- [
153
- "standardResult.instances.0.count",
154
- "=",
155
- 3
156
- ]
157
- ],
158
- "rules": [
159
- "y",
160
- "opFoc"
161
- ]
162
- }
163
- ]
164
- }
@@ -1,152 +0,0 @@
1
- {
2
- "rule": "targetsNear",
3
- "timeLimit": 20,
4
- "acts": [
5
- {
6
- "type": "launch",
7
- "target": {
8
- "url": "file://validation/tests/targetsNear/index.html",
9
- "what": "page with variously sized interaction targets"
10
- }
11
- },
12
- {
13
- "type": "test",
14
- "which": "testaro",
15
- "withItems": true,
16
- "stopOnFail": true,
17
- "expect": [
18
- [
19
- "standardResult.totals.0",
20
- "=",
21
- 6
22
- ],
23
- [
24
- "standardResult.totals.1",
25
- "=",
26
- 0
27
- ],
28
- [
29
- "standardResult.instances.0.ruleID",
30
- "=",
31
- "targetsNear"
32
- ],
33
- [
34
- "standardResult.instances.0.what",
35
- "i",
36
- "is less than 44"
37
- ],
38
- [
39
- "standardResult.instances.0.ordinalSeverity",
40
- "=",
41
- 0
42
- ],
43
- [
44
- "standardResult.instances.0.tagName",
45
- "=",
46
- "BUTTON"
47
- ],
48
- [
49
- "standardResult.instances.0.id",
50
- "=",
51
- "defaultbutton"
52
- ],
53
- [
54
- "standardResult.instances.0.location.doc",
55
- "=",
56
- "dom"
57
- ],
58
- [
59
- "standardResult.instances.0.location.type",
60
- "=",
61
- "selector"
62
- ],
63
- [
64
- "standardResult.instances.0.location.spec",
65
- "=",
66
- "#defaultbutton"
67
- ],
68
- [
69
- "standardResult.instances.0.excerpt",
70
- "i",
71
- "Default (small)"
72
- ],
73
- [
74
- "standardResult.instances.2.what",
75
- "i",
76
- "is less than"
77
- ],
78
- [
79
- "standardResult.instances.2.tagName",
80
- "=",
81
- "INPUT"
82
- ],
83
- [
84
- "standardResult.instances.2.excerpt",
85
- "i",
86
- "Small box:"
87
- ],
88
- [
89
- "standardResult.instances.2.location.spec.y",
90
- ">",
91
- 0
92
- ],
93
- [
94
- "standardResult.instances.4.tagName",
95
- "=",
96
- "A"
97
- ],
98
- [
99
- "standardResult.instances.4.excerpt",
100
- "=",
101
- "Wikimedia Foundation (small)"
102
- ]
103
- ],
104
- "rules": [
105
- "y",
106
- "targetsNear"
107
- ]
108
- },
109
- {
110
- "type": "test",
111
- "which": "testaro",
112
- "withItems": false,
113
- "stopOnFail": true,
114
- "expect": [
115
- [
116
- "standardResult.totals.0",
117
- "=",
118
- 6
119
- ],
120
- [
121
- "standardResult.totals.3",
122
- "=",
123
- 0
124
- ],
125
- [
126
- "standardResult.instances.0.ruleID",
127
- "=",
128
- "targetsNear"
129
- ],
130
- [
131
- "standardResult.instances.0.what",
132
- "i",
133
- "are smaller"
134
- ],
135
- [
136
- "standardResult.instances.0.ordinalSeverity",
137
- "=",
138
- 0
139
- ],
140
- [
141
- "standardResult.instances.0.count",
142
- "=",
143
- 6
144
- ]
145
- ],
146
- "rules": [
147
- "y",
148
- "targetsNear"
149
- ]
150
- }
151
- ]
152
- }