packages feed

project-m36-1.2.6: test/TutorialD/Interpreter/TemplateTest.hs

{-# LANGUAGE QuasiQuotes #-}
import System.Exit
import Test.HUnit
import TutorialD.Interpreter.Template
import ProjectM36.Base
import ProjectM36.TransactionGraph

main :: IO ()
main = do
  tcounts <- runTestTT (TestList [testRelationalExpr,
                                 testDatabaseContextExpr,
                                 testTransGraphRelationalExpr,
                                 testRelationalExprReplacement])
  if errors tcounts + failures tcounts > 0 then exitFailure else exitSuccess

testRelationalExpr :: Test
testRelationalExpr = TestCase $ do
  let actual = [relationalExpr|x union x|]
      expected = RelationVariable "x" () `Union` RelationVariable "x" ()
  assertEqual "relational expr" expected actual

testDatabaseContextExpr :: Test
testDatabaseContextExpr = TestCase $ do
  let actual :: DatabaseContextExpr -- resolved ACL type variable
      actual = [databaseContextExpr|x:=true|]
      expected = Assign "x" (RelationVariable "true" ())
  assertEqual "database context expr" expected actual

testTransGraphRelationalExpr :: Test
testTransGraphRelationalExpr = TestCase $ do
  let actual = [transGraphRelationalExpr|t@master^|]
      expected = RelationVariable "t" (TransactionIdHeadNameLookup "master" [TransactionIdHeadBranchBacktrack 1])
  assertEqual "trans graph relational expr" expected actual

testRelationalExprReplacement :: Test
testRelationalExprReplacement = TestCase $ do
  let actual = [relationalExpr|s where city="$1"|]
      expected = Restrict (AttributeEqualityPredicate "city" (NakedAtomExpr (TextAtom "London"))) (RelationVariable "s" ())
      actual' = replaceTextAtom "$1" "London" actual
  assertEqual "replace relational expr" expected actual'