code wiki / _hdl_build / test_b64enc.nx
test_b64enc.nx source
↩ module page · 56 lines · 2133 B
1// standalone unit test for the base64 encoder (verbatim copy of gp_b64_encode) against RFC 4648 vectors.
2import "nx_syscalls.nx"
3
4func gp_b64_encode(inp: *u8, n: i64, out: *u8) -> i64 {
5 let tbl: *u8 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" as *u8
6 var i: i64 = 0
7 var o: i64 = 0
8 while i + 3 <= n {
9 let b0: i64 = inp[i]&0xff; let b1: i64 = inp[i+1]&0xff; let b2: i64 = inp[i+2]&0xff
10 out[o] = tbl[b0>>2]; o=o+1
11 out[o] = tbl[((b0&3)<<4)|(b1>>4)]; o=o+1
12 out[o] = tbl[((b1&15)<<2)|(b2>>6)]; o=o+1
13 out[o] = tbl[b2&63]; o=o+1
14 i=i+3
15 }
16 let rem: i64 = n - i
17 if rem == 1 {
18 let b0: i64 = inp[i]&0xff
19 out[o] = tbl[b0>>2]; o=o+1
20 out[o] = tbl[(b0&3)<<4]; o=o+1
21 out[o] = 61 as u8; o=o+1
22 out[o] = 61 as u8; o=o+1
23 }
24 if rem == 2 {
25 let b0: i64 = inp[i]&0xff; let b1: i64 = inp[i+1]&0xff
26 out[o] = tbl[b0>>2]; o=o+1
27 out[o] = tbl[((b0&3)<<4)|(b1>>4)]; o=o+1
28 out[o] = tbl[(b1&15)<<2]; o=o+1
29 out[o] = 61 as u8; o=o+1
30 }
31 return o
32}
33
34func check(inp: *u8, n: i64, want: *u8) -> i64 {
35 let out: *u8 = sys_mmap(256)
36 let got: i64 = gp_b64_encode(inp, n, out); out[got]=0 as u8
37 var wl: i64 = 0; while want[wl]!=(0 as u8) { wl=wl+1 }
38 var ok: i64 = 1
39 if got != wl { ok = 0 }
40 var i: i64 = 0
41 while i < got { if (out[i]&0xff)!=(want[i]&0xff) { ok = 0 } i=i+1 }
42 if ok==1 { sys_write(1, "PASS " as *u8, 5) } else { sys_write(1, "FAIL " as *u8, 5) }
43 sys_write(1, out, got); sys_write(1, " (want " as *u8, 7); sys_write(1, want, wl); sys_write(1, ")\n" as *u8, 2)
44 return ok
45}
46
47func main() -> i64 {
48 var all: i64 = 1
49 if check("Man" as *u8, 3, "TWFu" as *u8)==0 { all=0 }
50 if check("Ma" as *u8, 2, "TWE=" as *u8)==0 { all=0 }
51 if check("M" as *u8, 1, "TQ==" as *u8)==0 { all=0 }
52 if check("Hello" as *u8, 5, "SGVsbG8=" as *u8)==0 { all=0 }
53 if check("foobar" as *u8, 6, "Zm9vYmFy" as *u8)==0 { all=0 }
54 if all==1 { sys_write(1, "ALL-PASS\n" as *u8, 9) } else { sys_write(1, "SOME-FAIL\n" as *u8, 10) }
55 return 0
56}