arith-encode-1.0.1: test/Tests/Data/ArithEncode/Binary.hs
-- Copyright (c) 2014 Eric McCorkle. All rights reserved.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions
-- are met:
--
-- 1. Redistributions of source code must retain the above copyright
-- notice, this list of conditions and the following disclaimer.
--
-- 2. Redistributions in binary form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- 3. Neither the name of the author nor the names of any contributors
-- may be used to endorse or promote products derived from this software
-- without specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS''
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS
-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-- USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-- OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-- SUCH DAMAGE.
module Tests.Data.ArithEncode.Binary(tests) where
import Data.ArithEncode
import Data.ArithEncode.Binary
import Data.Binary.Get
import Data.Binary.Put
import Data.Bits
import Test.HUnitPlus.Base
import Tests.Data.ArithEncode.TestUtils(integralInteger, intervalInteger)
testPutGet :: (Eq ty, Show ty) => Encoding ty -> ty -> Assertion
testPutGet enc val =
let
bs = runPut (putWithEncoding enc val)
val' = runGet (getWithEncoding enc) bs
in do
val @=? val'
testFiniteEncoding :: (Eq ty, Show ty) => String -> Encoding ty -> [ty] -> Test
testFiniteEncoding name enc vals =
name ~: mapM_ (testPutGet enc) vals
infiniteVals = [0..20000] ++
[((1 `shiftL` 64) - 0x100)..((1 `shiftL` 64) + 0x100)] ++
(map (\n -> product (map (\m -> m * 2 + 1) [1..n])) [1..6000])
testlist :: [Test]
testlist = [
testFiniteEncoding "singleton" (singleton 1) [1],
testFiniteEncoding "finite_2" (intervalInteger 1 2) [1, 2],
testFiniteEncoding "finite_10" (intervalInteger 1 10) [1..10],
testFiniteEncoding "finite_100" (intervalInteger 1 100) [1..100],
testFiniteEncoding "finite_10000" (intervalInteger 1 10000) [1..10000],
testFiniteEncoding "finite_64bit" (intervalInteger 0 0x100000000000000000000)
[1..10000],
testFiniteEncoding "infinite" integralInteger infiniteVals
]
tests :: Test
tests = "Binary" ~: testlist