diff --git a/tests/wire-tests.lisp b/tests/wire-tests.lisp index cc1e4b6e9a0f90a075e17fb5a1325409117f4a54..eb9ba09610d79e2c22ce280e6ef9f83166f6feb4 100644 --- a/tests/wire-tests.lisp +++ b/tests/wire-tests.lisp @@ -55,12 +55,190 @@ (dolist (n '(0 1 -1 14927 -3612 856912304801416 -75123905439571256)) (round-trip64 n)))) +(define-test encode-length-tests () + (flet ((verify (encoder pairs) + (loop for (input output) in pairs + do (assert-true (= (funcall encoder input) output))))) + (verify #'length32 + '((#x0 1) (#x7f 1) ; 0-7 bits + (#x80 2) (#x3fff 2) ; 8-14 bits + (#x4000 3) (#x1fffff 3) ; 15-21 bits + (#x200000 4) (#xfffffff 4) ; 22-28 bits + (#x10000000 5) (#xffffffff 5))) ; 29-35 bits, though we'll actually stop at 32 bits. + (verify #'length64 + '((#x0 1) (#x7f 1) ; 0-7 bits + (#x80 2) (#x3fff 2) ; 8-14 bits + (#x4000 3) (#x1fffff 3) ; 15-21 bits + (#x200000 4) (#xfffffff 4) ; 22-28 bits + (#x10000000 5) (#x7ffffffff 5) ; 29-35 bits + (#x800000000 6) (#x3ffffffffff 6) ; 36-42 bits + (#x40000000000 7) (#x1ffffffffffff 7) ; 29-49 bits + (#x2000000000000 8) (#xffffffffffffff 8) ; 29-54 bits + (#x100000000000000 9) (#x7fffffffffffffff 9) ; 29-63 bits + (#x8000000000000000 10) (#xffffffffffffffff 10))))) ; 64-72 bits, though we'll actually stop at 64 bits. + +(define-test encode/decode-ints-tests () + (flet ((verify (encoder decoder pairs) + (loop for (input expected) in pairs + for expected-buf = (coerce expected '(vector (unsigned-byte 8))) + for filler = (random #xff) + when encoder + do (let* ((buf (make-array '(16) :element-type '(unsigned-byte 8) :initial-element filler)) + (index (funcall encoder input buf 0))) + ;; Are the bytes as expected? + (assert-true (equalp (subseq buf 0 index) expected-buf)) + ;; Is the rest of the buffer untouched? + (assert-true (every #'(lambda (x) (= x filler)) (subseq buf index)))) + when decoder + do (multiple-value-bind (decoded-value index) + (funcall decoder expected-buf 0) + ;; Did we get the right value? + (assert-true (= decoded-value input)) + ;; Did we get the right index increment? + (assert-true (= (length expected) index)))))) + (verify #'encode-uint32 + #'decode-uint32 + '((#x0 (#x00)) + (#x1 (#x01)) + (#x7f (#x7f)) + (#x80 (#x80 #x01)) + (#x3fff (#xff #x7f)) + (#x4000 (#x80 #x80 #x01)) + (#x1fffff (#xff #xff #x7f)) + (#x200000 (#x80 #x80 #x80 #x01)) + (#xfffffff (#xff #xff #xff #x7f)) + (#x10000000 (#x80 #x80 #x80 #x80 #x01)) + (#xffffffff (#xff #xff #xff #xff #x0f)))) + (verify nil + #'decode-int32 + '((#x0 (#x00)) + (#x1 (#x01)) + (#x7fffffff (#xff #xff #xff #xff #x07)) + (#x-80000000 (#x80 #x80 #x80 #x80 #x08)) + (#x-1 (#xff #xff #xff #xff #x0f)))) + (verify #'encode-fixed32 + #'decode-fixed32 + '((#x0 (#x00 #x00 #x00 #x00)) + (#x1 (#x01 #x00 #x00 #x00)) + (#xff (#xff #x00 #x00 #x00)) + (#x100 (#x00 #x01 #x00 #x00)) + (#xffff (#xff #xff #x00 #x00)) + (#x10000 (#x00 #x00 #x01 #x00)) + (#xffffff (#xff #xff #xff #x00)) + (#x1000000 (#x00 #x00 #x00 #x01)) + (#xffffffff (#xff #xff #xff #xff)))) + (verify #'encode-sfixed32 + #'decode-sfixed32 + '((#x0 (#x00 #x00 #x00 #x00)) + (#x1 (#x01 #x00 #x00 #x00)) + (#x-1 (#xff #xff #xff #xff)) + (#xff (#xff #x00 #x00 #x00)) + (#x-ff (#x01 #xff #xff #xff)) + (#x100 (#x00 #x01 #x00 #x00)) + (#x-100 (#x00 #xff #xff #xff)) + (#xffff (#xff #xff #x00 #x00)) + (#x-ffff (#x01 #x00 #xff #xff)) + (#x10000 (#x00 #x00 #x01 #x00)) + (#x-10000 (#x00 #x00 #xff #xff)) + (#xffffff (#xff #xff #xff #x00)) + (#x-ffffff (#x01 #x00 #x00 #xff)) + (#x1000000 (#x00 #x00 #x00 #x01)) + (#x-1000000 (#x00 #x00 #x00 #xff)) + (#x7fffffff (#xff #xff #xff #x7f)) + (#x-80000000 (#x00 #x00 #x00 #x80)))) + (verify #'encode-uint64 + #'decode-uint64 + '((#x0 (#x00)) + (#x1 (#x01)) + (#x7f (#x7f)) + (#x80 (#x80 #x01)) + (#x3fff (#xff #x7f)) + (#x4000 (#x80 #x80 #x01)) + (#x1fffff (#xff #xff #x7f)) + (#x200000 (#x80 #x80 #x80 #x01)) + (#xfffffff (#xff #xff #xff #x7f)) + (#x10000000 (#x80 #x80 #x80 #x80 #x01)) + (#x7ffffffff (#xff #xff #xff #xff #x7f)) + (#x800000000 (#x80 #x80 #x80 #x80 #x80 #x01)) + (#x3ffffffffff (#xff #xff #xff #xff #xff #x7f)) + (#x40000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x01)) + (#x1ffffffffffff (#xff #xff #xff #xff #xff #xff #x7f)) + (#x2000000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x01)) + (#xffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #x7f)) + (#x100000000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x01)) + (#x7fffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #xff #x7f)) + (#x8000000000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x01)) + (#xffffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #xff #xff #x01)))) + (verify nil + #'decode-int64 + '((#x0 (#x00)) + (#x1 (#x01)) + (#x7fffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #xff #xff #x00)) + (#x-8000000000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x01)) + (#x-1 (#xff #xff #xff #xff #xff #xff #xff #xff #xff #x01)))) + (verify #'encode-fixed64 + #'decode-fixed64 + '((#x0 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00)) + (#x1 (#x01 #x00 #x00 #x00 #x00 #x00 #x00 #x00)) + (#xff (#xff #x00 #x00 #x00 #x00 #x00 #x00 #x00)) + (#x100 (#x00 #x01 #x00 #x00 #x00 #x00 #x00 #x00)) + (#xffff (#xff #xff #x00 #x00 #x00 #x00 #x00 #x00)) + (#x10000 (#x00 #x00 #x01 #x00 #x00 #x00 #x00 #x00)) + (#xffffff (#xff #xff #xff #x00 #x00 #x00 #x00 #x00)) + (#x1000000 (#x00 #x00 #x00 #x01 #x00 #x00 #x00 #x00)) + (#xffffffff (#xff #xff #xff #xff #x00 #x00 #x00 #x00)) + (#x100000000 (#x00 #x00 #x00 #x00 #x01 #x00 #x00 #x00)) + (#xffffffffff (#xff #xff #xff #xff #xff #x00 #x00 #x00)) + (#x10000000000 (#x00 #x00 #x00 #x00 #x00 #x01 #x00 #x00)) + (#xffffffffffff (#xff #xff #xff #xff #xff #xff #x00 #x00)) + (#x1000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x01 #x00)) + (#xffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #x00)) + (#x100000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x01)) + (#xffffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #xff)))) + (verify #'encode-sfixed64 + #'decode-sfixed64 + '((#x0 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00)) + (#x1 (#x01 #x00 #x00 #x00 #x00 #x00 #x00 #x00)) + (#x-1 (#xff #xff #xff #xff #xff #xff #xff #xff)) + (#xff (#xff #x00 #x00 #x00 #x00 #x00 #x00 #x00)) + (#x-ff (#x01 #xff #xff #xff #xff #xff #xff #xff)) + (#x100 (#x00 #x01 #x00 #x00 #x00 #x00 #x00 #x00)) + (#x-100 (#x00 #xff #xff #xff #xff #xff #xff #xff)) + (#xffff (#xff #xff #x00 #x00 #x00 #x00 #x00 #x00)) + (#x-ffff (#x01 #x00 #xff #xff #xff #xff #xff #xff)) + (#x10000 (#x00 #x00 #x01 #x00 #x00 #x00 #x00 #x00)) + (#x-10000 (#x00 #x00 #xff #xff #xff #xff #xff #xff)) + (#xffffff (#xff #xff #xff #x00 #x00 #x00 #x00 #x00)) + (#x-ffffff (#x01 #x00 #x00 #xff #xff #xff #xff #xff)) + (#x1000000 (#x00 #x00 #x00 #x01 #x00 #x00 #x00 #x00)) + (#x-1000000 (#x00 #x00 #x00 #xff #xff #xff #xff #xff)) + (#x7fffffff (#xff #xff #xff #x7f #x00 #x00 #x00 #x00)) + (#x-ffffffff (#x01 #x00 #x00 #x00 #xff #xff #xff #xff)) + (#x100000000 (#x00 #x00 #x00 #x00 #x01 #x00 #x00 #x00)) + (#x-100000000 (#x00 #x00 #x00 #x00 #xff #xff #xff #xff)) + (#x7fffffffff (#xff #xff #xff #xff #x7f #x00 #x00 #x00)) + (#x-ffffffffff (#x01 #x00 #x00 #x00 #x00 #xff #xff #xff)) + (#x10000000000 (#x00 #x00 #x00 #x00 #x00 #x01 #x00 #x00)) + (#x-10000000000 (#x00 #x00 #x00 #x00 #x00 #xff #xff #xff)) + (#x7fffffffffff (#xff #xff #xff #xff #xff #x7f #x00 #x00)) + (#x-ffffffffffff (#x01 #x00 #x00 #x00 #x00 #x00 #xff #xff)) + (#x1000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x01 #x00)) + (#x-1000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #xff #xff)) + (#x7fffffffffffff (#xff #xff #xff #xff #xff #xff #x7f #x00)) + (#x-ffffffffffffff (#x01 #x00 #x00 #x00 #x00 #x00 #x00 #xff)) + (#x100000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x01)) + (#x-100000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #xff)) + (#x7fffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #x7f)) + (#x-8000000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x80)))))) ;;--- We need more tests: ;;--- (de)serialize-prim, (de)serialize-packed, (de)serialize-enum ;;--- prim-size, packed-size, enum-size -;;--- encode/decode-fixed32/64, encode/decode-sfixed32/64, encode/decode-single/double +;;--- encode/decode-single/double + (define-test-suite wire-tests () - (zig-zag-test)) + (zig-zag-test) + (encode-length-tests) + (encode/decode-ints-tests)) (register-test 'wire-tests)