284 lines
6.3 KiB
Clojure
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))))
|