packages feed

egison-3.0.1: test/UnitTest.hs

module Main where

import Control.Applicative
import Control.Monad
import Data.IORef

import Test.Framework (defaultMain)
import Test.Framework.Providers.HUnit (hUnitTestToTests)
import Test.HUnit
import System.FilePath.Glob (glob)

import Language.Egison.Types
import Language.Egison.Core
import Language.Egison.Primitives
import Language.Egison

main = do
  testCases <- glob "test/**/*.egi"
  defaultMain $ hUnitTestToTests $ test $ map runTestCase testCases

runTestCase :: FilePath -> Test
runTestCase file = TestLabel file . TestCase $ do 
  env <- primitiveEnv >>= loadLibraries
  seed <- readIORef counter
  (result, seed') <- runFreshT seed $ runEgisonM $ loadFile file >>= evalTopExprs' env
  writeIORef counter seed'
  assertString $ either show (const "") result

evalTopExprs' :: Env -> [EgisonTopExpr] -> EgisonM ()
evalTopExprs' env exprs = do
  let (bindings, tests) = foldr collectDefsAndTests ([], []) exprs
  env <- recursiveBind env bindings
  forM_ tests $ evalExpr' env
 where
  collectDefsAndTests (Define name expr) (bindings, tests) =
    ((name, expr) : bindings, tests)
  collectDefsAndTests (Test expr) (bindings, tests) =
    (bindings, expr : tests)
  collectDefsAndTests _ r = r