babashka/test-resources/lib_tests/helins/binf/test/leb128.cljc

284 lines
6.3 KiB
Clojure

;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at https://mozilla.org/MPL/2.0/.
(ns helins.binf.test.leb128
{:author "Adam Helins"}
(:require [clojure.test :as t]
[clojure.test.check.clojure-test :as tc.ct]
[clojure.test.check.properties :as tc.prop]
[helins.binf :as binf]
[helins.binf.buffer :as binf.buffer]
[helins.binf.gen :as binf.gen]
[helins.binf.int64 :as binf.int64]
[helins.binf.leb128 :as binf.leb128]))
;;;;;;;;;; int32
(t/deftest u32
(let [v (binf/view (binf.buffer/alloc 32))]
(-> v
(binf/seek 0)
(binf.leb128/wr-u32 0))
(t/is (= 1
(binf/position v)
(binf.leb128/n-byte-u32 0)))
(t/is (= 0
(-> v
(binf/seek 0)
(binf.leb128/rr-u32))))
(-> v
(binf/seek 0)
(binf.leb128/wr-u32 4294967295))
(t/is (= (binf.leb128/n-byte-max 32)
(binf/position v)
(binf.leb128/n-byte-u32 4294967295)))
(t/is (= 4294967295
(-> v
(binf/seek 0)
(binf.leb128/rr-u32))))))
(t/deftest i32
(let [v (binf/view (binf.buffer/alloc 32))]
(-> v
(binf/seek 0)
(binf.leb128/wr-i32 0))
(t/is (= 1
(binf/position v)
(binf.leb128/n-byte-i32 0)))
(t/is (= 0
(-> v
(binf/seek 0)
(binf.leb128/rr-i32))))
(-> v
(binf/seek 0)
(binf.leb128/wr-i32 2147483647))
(t/is (= (binf.leb128/n-byte-max 32)
(binf/position v)
(binf.leb128/n-byte-i32 2147483647)))
(t/is (= 2147483647
(-> v
(binf/seek 0)
(binf.leb128/rr-i32))))
(-> v
(binf/seek 0)
(binf.leb128/wr-i32 -2147483648))
(t/is (= (binf.leb128/n-byte-max 32)
(binf/position v)
(binf.leb128/n-byte-i32 -2147483648)))
(t/is (= -2147483648
(-> v
(binf/seek 0)
(binf.leb128/rr-i32))))
(-> v
(binf/seek 0)
(binf.leb128/wr-i32 -42))
(t/is (= 1
(binf/position v)
(binf.leb128/n-byte-i32 0)))
(t/is (= -42
(-> v
(binf/seek 0)
(binf.leb128/rr-i32))))
(-> v
(binf/seek 0)
(binf/wr-b8 0x7F))
(t/is (= 1
(binf/position v)
(binf.leb128/n-byte-i32 0)))
(t/is (= -1
(-> v
(binf/seek 0)
(binf.leb128/rr-i32))))))
;;;;;;;;;; int64
(t/deftest u64
(let [v (binf/view (binf.buffer/alloc 32))]
(-> v
(binf/seek 0)
(binf.leb128/wr-u64 (binf.int64/u* 0)))
(t/is (= 1
(binf/position v)
(binf.leb128/n-byte-u64 (binf.int64/u* 0))))
(t/is (= (binf.int64/u* 0)
(-> v
(binf/seek 0)
(binf.leb128/rr-u64))))
(-> v
(binf/seek 0)
(binf.leb128/wr-u64 (binf.int64/u* 18446744073709551615)))
(t/is (= (binf.leb128/n-byte-max 64)
(binf/position v)
(binf.leb128/n-byte-u64 (binf.int64/u* 18446744073709551615))))
(t/is (= (binf.int64/u* 18446744073709551615)
(-> v
(binf/seek 0)
(binf.leb128/rr-u64))))))
(t/deftest i64
(let [v (binf/view (binf.buffer/alloc 32))]
(-> v
(binf/seek 0)
(binf.leb128/wr-i64 (binf.int64/i* 0)))
(t/is (= 1
(binf/position v)
(binf.leb128/n-byte-i64 (binf.int64/i* 0))))
(t/is (= (binf.int64/i* 0)
(-> v
(binf/seek 0)
(binf.leb128/rr-i64))))
(-> v
(binf/seek 0)
(binf.leb128/wr-i64 (binf.int64/i* 9223372036854775807)))
(t/is (= (binf.leb128/n-byte-max 64)
(binf/position v)
(binf.leb128/n-byte-i64 (binf.int64/i* 9223372036854775807))))
(t/is (= (binf.int64/i* 9223372036854775807)
(-> v
(binf/seek 0)
(binf.leb128/rr-i64))))
(-> v
(binf/seek 0)
(binf.leb128/wr-i64 (binf.int64/i* -9223372036854775808)))
(t/is (= (binf.leb128/n-byte-max 64)
(binf/position v)
(binf.leb128/n-byte-i64 (binf.int64/i* -9223372036854775808))))
(t/is (= (binf.int64/i* -9223372036854775808)
(-> v
(binf/seek 0)
(binf.leb128/rr-i64))))
(-> v
(binf/seek 0)
(binf.leb128/wr-i64 (binf.int64/i* -42)))
(t/is (= 1
(binf/position v)
(binf.leb128/n-byte-i64 (binf.int64/i* -42))))
(t/is (= (binf.int64/i* -42)
(-> v
(binf/seek 0)
(binf.leb128/rr-i64))))
(-> v
(binf/seek 0)
(binf/wr-b8 0x7F))
(t/is (= 1
(binf/position v)
(binf.leb128/n-byte-i64 (binf.int64/i* -1))))
(t/is (= (binf.int64/i* -1)
(-> v
(binf/seek 0)
(binf.leb128/rr-i64))))))
;;;;;;;;;; Generative testing
(def view-gen
(-> (binf.leb128/n-byte-max 64)
binf.buffer/alloc
binf/view))
(tc.ct/defspec gen-i32
(tc.prop/for-all [i32 binf.gen/i32]
(= i32
(-> view-gen
(binf/seek 0)
(binf.leb128/wr-i32 i32)
(binf/seek 0)
binf.leb128/rr-i32))))
(tc.ct/defspec gen-u32
(tc.prop/for-all [u32 binf.gen/u32]
(= u32
(-> view-gen
(binf/seek 0)
(binf.leb128/wr-u32 u32)
(binf/seek 0)
binf.leb128/rr-u32))))
(tc.ct/defspec gen-i64
(tc.prop/for-all [i64 binf.gen/i64]
(= i64
(-> view-gen
(binf/seek 0)
(binf.leb128/wr-i64 i64)
(binf/seek 0)
binf.leb128/rr-i64))))
(tc.ct/defspec gen-u64
(tc.prop/for-all [u64 binf.gen/u64]
(= u64
(-> view-gen
(binf/seek 0)
(binf.leb128/wr-u64 u64)
(binf/seek 0)
binf.leb128/rr-u64))))