(use test) (use base64) (test-group "encoding" (test "encode string of length 0" "" (base64-encode "")) (test "encode string of length 1" "YQ==" (base64-encode "a")) (test "encode string of length 2" "YWI=" (base64-encode "ab")) (test "encode string of length 3" "YWJj" (base64-encode "abc")) (test "encode string of length 5*3" "YWJjZGVmZ2hpamtsbW5v" (base64-encode "abcdefghijklmno")) (test "encode string of length 5*3+1" "YWJjZGVmZ2hpamtsbW5vcA==" (base64-encode "abcdefghijklmnop")) (test "encode string of length 5*3+2" "YWJjZGVmZ2hpamtsbW5vcHE=" (base64-encode "abcdefghijklmnopq")) (test "encode string of length 6*3" "YWJjZGVmZ2hpamtsbW5vcHFy" (base64-encode "abcdefghijklmnopqr")) (test "encode binary string" "3q2+78r+sAs=" (base64-encode "\xde\xad\xbe\xef\xca\xfe\xb0\x0b"))) ;; to avoid measuring time in test (doesn't really matter) (define large-string (make-string 10000001 #\a)) (define large-encoded-string (base64-encode large-string)) (define large-invalid-string (make-string 10000001 #\%)) (test-group "decoding" (test "decode empty string -> empty" "" (base64-decode "")) (test "decode string Y -> empty" "" (base64-decode "Y")) (test "decode string YW -> a" "a" (base64-decode "YW")) (test "decode string YW= -> a" "a" (base64-decode "YW=")) (test "decode string YW== -> a" "a" (base64-decode "YW==")) (test "decode string YWJ => ab" "ab" (base64-decode "YWJ")) (test "decode string YWJ= -> ab" "ab" (base64-decode "YWJ=")) (test "decode string YWJj -> abc" "abc" (base64-decode "YWJj")) (test "decode string YW%J^jZ -> abc" "abc" (base64-decode "YW%J^jZ")) (test "decode skips invalid chars" "abcdefghijklmnop" (base64-decode "YWJjZG(VmZ#2hp@amtsb%&W5v**cA======")) (test "decode binary string" "\xde\xad\xbe\xef\xca\xfe\xb0\x0b" (base64-decode "3q2+78r+sAs=")) (test "decode large string" large-string (base64-decode large-encoded-string)) (test "decode large string of invalid chars" "" (base64-decode large-invalid-string)) ) ;; Not on a 64-bit machine! :) ;; (test-error "encode string of length 16,000,000 signals an error" ;; (base64-encode (make-string 16000000)))