source: project/release/5/base64/tags/1.0/tests/run.scm @ 35640

Last change on this file since 35640 was 35640, checked in by felix winkelmann, 2 years ago

base64 egg for C5

File size: 6.5 KB
Line 
1(import test)
2(import base64
3        (chicken string))
4
5(define lorem-ipsum "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
6(define lorem-ipsum-base64
7  '("TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2ljaW5nIGVsaXQs"
8    "IHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFn"
9    "bmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRh"
10    "dGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2Vx"
11    "dWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUg"
12    "dmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0"
13    "ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBx"
14    "dWkgb2ZmaWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bS4="
15    ""))   ; trailing empty for intersperse
16
17(test-group
18 "encoding"
19 (test "encode string of length 0"
20       ""
21       (base64-encode ""))
22 (test "encode string of length 1"
23       "YQ=="
24       (base64-encode "a"))
25 (test "encode string of length 2"
26       "YWI="
27       (base64-encode "ab"))
28 (test "encode string of length 3"
29       "YWJj"
30       (base64-encode "abc"))
31 (test "encode string of length 5*3"
32       "YWJjZGVmZ2hpamtsbW5v"
33       (base64-encode "abcdefghijklmno"))
34 (test "encode string of length 5*3+1"
35       "YWJjZGVmZ2hpamtsbW5vcA=="
36       (base64-encode "abcdefghijklmnop"))
37 (test "encode string of length 5*3+2"
38       "YWJjZGVmZ2hpamtsbW5vcHE="
39       (base64-encode "abcdefghijklmnopq"))
40 (test "encode string of length 6*3"
41       "YWJjZGVmZ2hpamtsbW5vcHFy"
42       (base64-encode "abcdefghijklmnopqr"))
43 (test "encode binary string"
44       "3q2+78r+sAs="
45       (base64-encode "\xde\xad\xbe\xef\xca\xfe\xb0\x0b"))
46 (test "lorem ipsum"
47       (apply string-append lorem-ipsum-base64)
48       (base64-encode lorem-ipsum))
49 (let ((s (make-string (+ 10 (* 57 60)) #\Q)))  ; past one input buffer
50   (test "port > 1 buffer length -> port"
51         (base64-encode s)
52         (get-output-string (base64-encode (open-input-string s)
53                                           (open-output-string))))
54   (test "port > 1 buffer length -> string"
55         (base64-encode s)
56         (base64-encode (open-input-string s)))))
57
58(test-group
59 "encoding linebreaks"
60 (parameterize ((base64-line-breaks #t))
61   (test "encode empty string"
62         ""
63         (base64-encode ""))
64   (test "encode 9 chars"
65         "YWFhYWFhYWFh\r\n"
66         (base64-encode (make-string 9 #\a)))
67   (test "encode 55 chars"
68         "YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQ==\r\n"
69         (base64-encode (make-string 55 #\a))) 
70   (test "encode 56 chars"
71         "YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWE=\r\n"
72         (base64-encode (make-string 56 #\a)))
73   (test "encode 57 chars"
74         "YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh\r\n"
75         (base64-encode (make-string 57 #\a)))
76   (test "encode 58 chars"
77         "YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh\r\nYQ==\r\n"
78         (base64-encode (make-string 58 #\a)))
79   (test "encode 57*2 chars"
80         (string-append "YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh"
81                        "\r\n"
82                        "YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh"
83                        "\r\n")
84         (base64-encode (make-string (* 57 2) #\a)))
85   (test "encode 57*2+1 chars"
86         (string-append "YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh"
87                        "\r\n"
88                        "YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh"
89                        "\r\n"
90                        "YQ=="
91                        "\r\n")
92         (base64-encode (make-string (+ 1 (* 57 2)) #\a)))
93   (let ((lorem-ipsum-encoded (string-intersperse lorem-ipsum-base64 "\r\n")))
94     (test "lorem ipsum"
95           lorem-ipsum-encoded
96           (base64-encode lorem-ipsum))
97     (test "lorem ipsum string -> port"
98           lorem-ipsum-encoded
99           (get-output-string (base64-encode lorem-ipsum (open-output-string))))
100     (test "lorem ipsum port -> string"
101           lorem-ipsum-encoded
102           (base64-encode (open-input-string lorem-ipsum)))
103     (test "lorem ipsum port -> port"
104           lorem-ipsum-encoded
105           (get-output-string (base64-encode (open-input-string lorem-ipsum)
106                                             (open-output-string)))))
107   ))
108
109;; to avoid measuring time in test (doesn't really matter)
110(define large-string (make-string 10000001 #\a))
111(define large-encoded-string (base64-encode large-string))
112(define large-invalid-string (make-string 10000001 #\%))
113
114(test-group
115 "decoding"
116 (test "decode empty string -> empty"
117       ""
118       (base64-decode ""))
119 (test "decode string Y -> empty"
120       ""
121       (base64-decode "Y"))
122 (test "decode string YW -> a"
123       "a"
124       (base64-decode "YW"))
125 (test "decode string YW= -> a"
126       "a"
127       (base64-decode "YW="))
128 (test "decode string YW== -> a"
129       "a"
130       (base64-decode "YW==")) 
131 (test "decode string YWJ => ab"
132       "ab"
133       (base64-decode "YWJ"))
134 (test "decode string YWJ= -> ab"
135       "ab"
136       (base64-decode "YWJ="))
137 (test "decode string YWJj -> abc"
138       "abc"
139       (base64-decode "YWJj"))
140 (test "decode string YW%J^jZ -> abc"
141       "abc"
142       (base64-decode "YW%J^jZ"))
143 (test "decode skips invalid chars"
144       "abcdefghijklmnop"
145       (base64-decode "YWJjZG(VmZ#2hp@amtsb%&W5v**cA======"))
146 (test "decode binary string"
147       "\xde\xad\xbe\xef\xca\xfe\xb0\x0b"
148       (base64-decode "3q2+78r+sAs="))
149 (test "decode large string"
150       large-string
151       (base64-decode large-encoded-string))
152 (test "decode large string of invalid chars"
153       ""
154       (base64-decode large-invalid-string))
155 (test "decode lorem ipsum with linebreaks"
156       lorem-ipsum
157       (base64-decode (string-intersperse lorem-ipsum-base64 "\r\n"))))
158
159;; Not on a 64-bit machine! :)
160;; (test-error "encode string of length 16,000,000 signals an error"
161;;             (base64-encode (make-string 16000000)))
162
163(test-exit)
Note: See TracBrowser for help on using the repository browser.