+(defun test-valid-input (exp input)
+ (test exp (base64-string-to-usb8-array input) :test #'equalp))
+
+(defun test-broken-input (arg)
+ (let ((.hole. (make-broadcast-stream)))
+ (test-error (base64-string-to-usb8-array arg)
+ :condition-type 'base64-error
+ :include-subtypes t)
+ (test-error (base64-string-to-string arg)
+ :condition-type 'base64-error
+ :include-subtypes t)
+ (test-error (base64-string-to-integer arg)
+ :condition-type 'base64-error
+ :include-subtypes t)
+ (test-error (base64-string-to-stream arg :stream .hole.)
+ :condition-type 'base64-error
+ :include-subtypes t)
+ (test-error (with-input-from-string (in arg)
+ (base64-stream-to-usb8-array in))
+ :condition-type 'base64-error
+ :include-subtypes t)
+ (test-error (with-input-from-string (in arg)
+ (base64-stream-to-string in))
+ :condition-type 'base64-error
+ :include-subtypes t)
+ (test-error (with-input-from-string (in arg)
+ (base64-stream-to-stream in :stream .hole.))
+ :condition-type 'base64-error
+ :include-subtypes t)
+ (test-error (with-input-from-string (in arg)
+ (base64-stream-to-integer in))
+ :condition-type 'base64-error
+ :include-subtypes t)))
+
+(defun test-valid ()
+ (test-valid-input #(0) "AA==")
+ (test-valid-input #(0 0) "AAA=")
+ (test-valid-input #(0 0 0) "AAAA")
+ (test-valid-input #(0) " A A = = ")
+ (test-valid-input #(0 0) " A A A = ")
+ (test-valid-input #(0 0 0) " A A A A "))
+
+(defun test-broken-1 ()
+ (test-broken-input "A")
+ (test-broken-input "AA")
+ (test-broken-input "AAA")
+ (test-broken-input "AA=")
+ (test-broken-input "A==")
+ (test-broken-input "A===")
+ (test-broken-input "AA===")
+ (test-broken-input "AAA===")
+ (test-broken-input "AAA==")
+ (test-broken-input "A=A")
+ (test-broken-input "AA=A")
+ (test-broken-input "AAA=A")
+ (test-broken-input "A==A"))
+
+(defun test-broken-2 ()
+ (flet ((test-invalid-char (char)
+ (test-broken-input (format nil "~C" char))
+ (test-broken-input (format nil "A~C" char))
+ (test-broken-input (format nil "AA~C" char))
+ (test-broken-input (format nil "AAA~C" char))
+ (test-broken-input (format nil "AAAA~C" char))
+ (test-broken-input (format nil "AAA=~C" char))
+ (test-broken-input (format nil "AA==~C" char))))
+ (test-invalid-char #\$)
+ (test-invalid-char (code-char 0))
+ (test-invalid-char (code-char 256))))
+
+(defun do-tests (&key ((:break-on-failures *break-on-test-failures*) nil))