packages feed

stable-tree-0.0.1: tests/TestAll.hs

module Main
( main
) where

import qualified Data.StableTree as ST
import Data.StableTree.IO ( store, load )
import Data.StableTree.IO.Ram ( storage )

import qualified Data.Map as Map
import Control.Arrow ( first )
import Data.ByteString.Arbitrary ( ArbByteString(..) )
import Test.Tasty
import Test.Tasty.QuickCheck ( testProperty )
import Test.QuickCheck
import Test.QuickCheck.Monadic

main :: IO ()
main = defaultMain $
  testGroup "StableTree"
  [ testGroup "Pure"
    [ testProperty "Int/Int" int_int
    , testProperty "Float/Int" float_int
    , testProperty "ByteString/Int" bytestring_int
    ]
  , testGroup "Stored"
    [ testProperty "Int/Int" store_int_int
    , testProperty "Float/Int" store_float_int
    , testProperty "ByteString/Int" store_bytestring_int
    ]
  ]
  where

  int_int :: [(Int,Int)] -> Bool
  int_int pairs =
    let m = Map.fromList pairs
        st = ST.fromMap m
    in m == ST.toMap st

  float_int :: [(Float,Int)] -> Bool
  float_int pairs =
    let m = Map.fromList pairs
        st = ST.fromMap m
    in m == ST.toMap st

  bytestring_int :: [(ArbByteString,Int)] -> Bool
  bytestring_int pairs =
    let m = Map.fromList $ map (first fromABS) pairs
        st = ST.fromMap m
    in m == ST.toMap st

  store_int_int :: [(Int,Int)] -> Property
  store_int_int pairs = monadicIO $ do
    (s,_,_) <- run storage
    let m = Map.fromList pairs
        st = ST.fromMap m
    Right tid <- run $ store s st
    Right st' <- run $ load s tid
    assert $ m == ST.toMap st'

  store_float_int :: [(Float,Int)] -> Property
  store_float_int pairs = monadicIO $ do
    (s,_,_) <- run storage
    let m  = Map.fromList pairs
        st = ST.fromMap m
    Right tid <- run $ store s st
    Right st' <- run $ load s tid
    assert $ m == ST.toMap st'

  store_bytestring_int :: [(ArbByteString,Int)] -> Property
  store_bytestring_int pairs = monadicIO $ do
    (s,_,_) <- run storage
    let m  = Map.fromList $ map (first fromABS) pairs
        st = ST.fromMap m
    Right tid <- run $ store s st
    Right st' <- run $ load s tid
    assert $ m == ST.toMap st'