packages feed

ivory-eval-0.1.0.3: test/Test.hs

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Main where

import Prelude ()
import Prelude.Compat

import Ivory.Language
import Ivory.Language.Monad

import Ivory.Eval

import qualified Data.Map as Map
import Test.Tasty
import Test.Tasty.HUnit

main :: IO ()
main = defaultMain tests

tests :: TestTree
tests = testGroup "Tests" [ sumTest, assertTest ]


--------------------------------------------------------------------------------
-- test modules

sumTest :: TestTree
sumTest = testCase "sum" $ do
  let Right (_, EvalState st _ _)
        = runEvalStartingFrom (initState mempty)
        $ evalBlock $ blockStmts $ snd $ runIvory $ do
            r <- local (izero :: Init ('Stored Sint32))
            11 `times` \(i :: Ix 12) -> do -- sum [ 10 .. 0 ]
              v <- deref r
              store r (v + safeCast i)
  assertEqual "wrong state!"
    (Map.fromList [ ("local0", Sint32 55), ("deref3", Sint32 54)
                  , ("ix2", Sint32 0), ("ref1", Ref "local0")]) 
    st

assertTest :: TestTree
assertTest = testCase "assert" $ do
  let r = runEvalStartingFrom (initState mempty)
        $ evalBlock $ blockStmts $ snd $ runIvory $
            Ivory.Language.assert ((0 :: Sint32) <? 1)
  assertBool (show r) (case r of
                        Left _ -> False
                        Right _ -> True)