74 lines
1.8 KiB
Haskell
74 lines
1.8 KiB
Haskell
module Gyehoek.Test.CPS.Eval where
|
|
|
|
import Test.Tasty (TestTree, testGroup)
|
|
import Test.Tasty.HUnit
|
|
import Gyehoek.CPS.Syntax (cps, Obj(..), Hob(..), Imm(..))
|
|
import Gyehoek.CPS.Eval qualified as Sut
|
|
import Data.List (List)
|
|
import Test.Tasty.ExpectedFailure (ignoreTestBecause, expectFail)
|
|
import System.Directory (listDirectory)
|
|
import Test.Tasty.Silver
|
|
import System.FilePath
|
|
import Control.Exception
|
|
import qualified Gyehoek.Driver as Driver
|
|
import Control.DeepSeq (($!!))
|
|
import System.Exit (ExitCode(..))
|
|
import qualified Data.Text as T
|
|
import Data.Function (applyWhen)
|
|
|
|
|
|
brokenEvalTests :: List String
|
|
brokenEvalTests =
|
|
[ "adder"
|
|
, "apply2"
|
|
, "apply-twice"
|
|
, "arith"
|
|
, "begin-1"
|
|
, "callcc-constant"
|
|
, "callcc-discard"
|
|
, "callcc-early-exit-1"
|
|
, "callcc-early-exit-2"
|
|
, "callcc-early-exit-3"
|
|
, "callcc-early-exit-4"
|
|
, "callcc-early-exit-5"
|
|
, "callcc-early-exit-6"
|
|
, "callcc-nested-1"
|
|
, "callcc-nested-2"
|
|
, "complicated-1"
|
|
, "cons-1"
|
|
, "factorial"
|
|
, "false"
|
|
, "fn-of-fn"
|
|
, "if-false"
|
|
, "if-number"
|
|
, "if-true"
|
|
, "lambda"
|
|
, "letrec-fn"
|
|
, "let-fn"
|
|
, "lit-int"
|
|
, "square"
|
|
, "true"
|
|
]
|
|
|
|
test_eval :: IO TestTree
|
|
test_eval = do
|
|
cs <- listDirectory "golden/exec"
|
|
pure $ testGroup "cps interpreter" $ cpsCase <$> cs
|
|
|
|
maybeBroken name broken = applyWhen (name `elem` broken) expectFail
|
|
|
|
cpsCase :: FilePath -> TestTree
|
|
cpsCase test =
|
|
maybeBroken testName brokenEvalTests $
|
|
goldenVsAction testName resultFile action printProcResult
|
|
where
|
|
testName = takeFileName test
|
|
resultFile = test </> "exec"
|
|
sourceFile = test </> "source.scm"
|
|
action = catch @SomeException
|
|
(do r <- Driver.eval_cps_e2e sourceFile
|
|
pure $!! ( ExitSuccess
|
|
, r
|
|
, "" ))
|
|
\e -> pure (ExitFailure 1, "", T.pack $ displayException e)
|