{-# LANGUAGE OverloadedStrings #-} {-# OPTIONS -Wall #-} module Units ( tests ) where import Control.Arrow import Control.Monad import Control.Monad.IO.Class import Control.Monad.State.Strict import Data.Aeson import Data.ByteString.Char8 as Strict import Data.ByteString.Lazy.Char8 as Lazy import Data.ByteString.Short import Data.HashMap.Strict import Data.List as List import Data.Maybe import Test.Tasty import Test.Tasty.HUnit import DFINITY.RadixTree import Types tests :: IO TestTree tests = do contents <- Lazy.readFile "test/tests.json" vectors <- either fail return $ eitherDecode contents pure $ testGroup "units" [ testCase name $ run ops | (name, ops) <- toList vectors ] run :: [Op] -> IO () run ops = void $ flip (runStateT . unMapDB) mempty $ do tree <- createRadixTree 2048 Nothing () foldM_ step tree ops step :: RadixTree () -> Op -> IOMapDB (RadixTree ()) step tree op = do liftIO $ print op case op of Insert key value -> do tree' <- insertRadixTree key value tree printRadixTree tree' pure tree' Delete key -> do tree' <- deleteRadixTree key tree printRadixTree tree' pure tree' Lookup key value -> do result <- lookupRadixTree key tree case result of Nothing | isNothing value -> pure tree Nothing -> throw ["Expecting value ", ", but received no value for key "] [fromJust value, key] Just (value', tree') | value == Just value' -> pure tree' Just (value', _) -> throw ["Expecting value ", ", but received value ", " for key "] [fromMaybe "null" value, value', key] Merkleize Nothing -> do (_, tree') <- first fromShort <$> merkleizeRadixTree tree pure tree' Merkleize (Just value) -> do (value', tree') <- first fromShort <$> merkleizeRadixTree tree if value == value' then pure tree' else throw ["Expecting state root ", ", but received state root "] [value, value'] throw :: MonadIO m => [String] -> [Strict.ByteString] -> m a throw err = liftIO . assertFailure . List.concat . List.zipWith mappend err . List.map show