code wiki / (root) / nx_a11y_check_test.nx

nx_a11y_check_test.nx source

↩ module page · 89 lines · 4274 B

1// nx_a11y_check_test.nx -- smoke for the WCAG 2.2 AA grader. 2// 3// Builds synthetic HTML strings exercising each criterion: 4// - clean HTML (3 WIN) 5// - <img> without alt= (1.1.1 LOSE) 6// - font-size: 14px (1.4.4 LOSE) 7// - "click here" / "here" / "read more" (2.4.4 LOSE) 8// 9// expect_exit: 0 10// 11// license_tier: ORIGINAL 12 13import "nx_syscalls.nx" 14import "nx_runtime.nx" 15import "nx_types.nx" 16import "nx_tier.nx" 17import "nx_a11y_check.nx" 18 19func _strlen(s: *u8) -> nx_int { 20 var n: nx_int = 0 21 while 1 == 1 { 22 let p: *u8 = (s as nx_int + n) as *u8 23 let c: nx_int = p[0] as nx_int 24 if (c & 255) == 0 { return n } 25 n = n + 1 26 } 27 return n 28} 29 30func main() -> nx_int { 31 // ---- Test 1: validity predicate --------------------------------- 32 if nx_wcag_criterion_is_valid(NX_WCAG_1_1_1_TEXT_ALT) != 1 { return 1 } 33 if nx_wcag_criterion_is_valid(NX_WCAG_1_4_4_RESIZE) != 1 { return 2 } 34 if nx_wcag_criterion_is_valid(NX_WCAG_2_4_4_LINK_PURPOSE) != 1 { return 3 } 35 if nx_wcag_criterion_is_valid(NX_WCAG_CRIT_N) != 0 { return 4 } 36 if nx_wcag_criterion_is_valid(-1) != 0 { return 5 } 37 38 // ---- Test 2: clean HTML grades 3 WIN --------------------------- 39 let html_clean: *u8 = "<html><body><img src=\"hero.png\" alt=\"sunrise\"><p style=\"font-size: 1.2rem\">welcome</p><a href=\"/about\">learn about us</a></body></html>" as *u8 40 let card_clean: *A11yCard = nx_a11y_card_alloc() 41 nx_a11y_scan(html_clean, _strlen(html_clean), card_clean) 42 if card_clean.crit_text_alt.verdict != NX_A11Y_VERDICT_WIN { return 10 } 43 if card_clean.crit_resize.verdict != NX_A11Y_VERDICT_WIN { return 11 } 44 if card_clean.crit_link_purpose.verdict != NX_A11Y_VERDICT_WIN { return 12 } 45 if card_clean.n_violations_total != 0 { return 13 } 46 if card_clean.overall_verdict != NX_A11Y_VERDICT_WIN { return 14 } 47 48 // ---- Test 3: img without alt --------------------------------- 49 let html_noalt: *u8 = "<html><body><img src=\"x.png\"></body></html>" as *u8 50 let card_noalt: *A11yCard = nx_a11y_card_alloc() 51 nx_a11y_scan(html_noalt, _strlen(html_noalt), card_noalt) 52 if card_noalt.crit_text_alt.verdict != NX_A11Y_VERDICT_LOSE { return 20 } 53 if card_noalt.crit_text_alt.violation_count != 1 { return 21 } 54 if card_noalt.overall_verdict != NX_A11Y_VERDICT_LOSE { return 22 } 55 56 // ---- Test 4: px font-size ---------------------------------- 57 let html_px: *u8 = "<html><style>body { font-size: 14px }</style></html>" as *u8 58 let card_px: *A11yCard = nx_a11y_card_alloc() 59 nx_a11y_scan(html_px, _strlen(html_px), card_px) 60 if card_px.crit_resize.verdict != NX_A11Y_VERDICT_LOSE { return 30 } 61 if card_px.crit_resize.violation_count != 1 { return 31 } 62 if card_px.overall_verdict != NX_A11Y_VERDICT_LOSE { return 32 } 63 64 // ---- Test 5: vague link text ------------------------------- 65 let html_vague: *u8 = "<html><body><a href=\"/help\">click here</a></body></html>" as *u8 66 let card_vague: *A11yCard = nx_a11y_card_alloc() 67 nx_a11y_scan(html_vague, _strlen(html_vague), card_vague) 68 if card_vague.crit_link_purpose.verdict != NX_A11Y_VERDICT_LOSE { return 40 } 69 if card_vague.crit_link_purpose.violation_count != 1 { return 41 } 70 if card_vague.overall_verdict != NX_A11Y_VERDICT_LOSE { return 42 } 71 72 // ---- Test 6: all three at once -------------------------------- 73 let html_all: *u8 = "<html><body><img src=\"x.png\"><p style=\"font-size: 12px\"><a href=\"/help\">click here</a></p></body></html>" as *u8 74 let card_all: *A11yCard = nx_a11y_card_alloc() 75 nx_a11y_scan(html_all, _strlen(html_all), card_all) 76 if card_all.n_lose != 3 { return 50 } 77 if card_all.n_violations_total != 3 { return 51 } 78 if card_all.overall_verdict != NX_A11Y_VERDICT_LOSE { return 52 } 79 80 // ---- Test 7: named-improvement strings non-empty ----------- 81 let imp1: *u8 = nx_a11y_named_improvement(NX_WCAG_1_1_1_TEXT_ALT) 82 if _strlen(imp1) < 10 { return 60 } 83 let imp2: *u8 = nx_a11y_named_improvement(NX_WCAG_1_4_4_RESIZE) 84 if _strlen(imp2) < 10 { return 61 } 85 let imp3: *u8 = nx_a11y_named_improvement(NX_WCAG_2_4_4_LINK_PURPOSE) 86 if _strlen(imp3) < 10 { return 62 } 87 88 return 0 89}