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}