@@ -1,6 +1,7 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2import TutorialD.Interpreter.DatabaseExpr
2import TutorialD.Interpreter.DatabaseExpr
3import TutorialD.Interpreter
3import TutorialD.Interpreter
4+import TutorialD.Interpreter.Base
4import Test.HUnit
5import Test.HUnit
5import ProjectM36.RelationalExpression
6import ProjectM36.RelationalExpression
6import ProjectM36.Relation
7import ProjectM36.Relation
@@ -8,16 +9,14 @@ import ProjectM36.Tuple
8import ProjectM36.TupleSet
9import ProjectM36.TupleSet
9import ProjectM36.Error
10import ProjectM36.Error
10import ProjectM36.Base
11import ProjectM36.Base
11−import ProjectM36.Transaction
12import ProjectM36.TransactionGraph
12import ProjectM36.TransactionGraph
13+import ProjectM36.Client
13import qualified ProjectM36.Attribute as A
14import qualified ProjectM36.Attribute as A
14import qualified Data.HashSet as HS
15import qualified Data.HashSet as HS
15import qualified Data.Map as M
16import qualified Data.Map as M
16−import qualified Data.Set as S
17import System.Exit
17import System.Exit
18−import Data.UUID.V4 (nextRandom)
18+import Data.Maybe (isJust)
19−import Data.UUID (nil)
19+import System.IO
20−import Data.Either (isRight)
21import qualified Data.Vector as V
20import qualified Data.Vector as V
23--urgent: add group and ungroup tests- I missed the group relation type bug
22--urgent: add group and ungroup tests- I missed the group relation type bug
@@ -105,91 +104,78 @@ assertTutdEqual databaseContext expected tutd = assertEqual tutd expected interp
106transactionGraphBasicTest :: Test
105transactionGraphBasicTest :: Test
107transactionGraphBasicTest = TestCase $ do
106transactionGraphBasicTest = TestCase $ do
108− (_, graph) <- dateExamplesGraph
107+ dbconn <- dateExamplesConnection
108+ graph <- transactionGraph dbconn
109− assertEqual "validate bootstrapped graph" (validateGraph graph) Nothing
109+ assertEqual "validate bootstrapped graph" (validateGraph graph) Nothing
111--add a new transaction to the graph, validate it is in the graph
111--add a new transaction to the graph, validate it is in the graph
112transactionGraphAddCommitTest :: Test
112transactionGraphAddCommitTest :: Test
113transactionGraphAddCommitTest = TestCase $ do
113transactionGraphAddCommitTest = TestCase $ do
114− ((DisconnectedTransaction firstUUID context), origGraph) <- dateExamplesGraph
114+ dbconn <- dateExamplesConnection
115− freshUUID <- nextRandom
115+ case parseTutorialD dbconn "x:=S" of
116− case interpretDatabaseExpr context "x:=S" of
117− Left err -> assertFailure (show err)
116+ Left err -> assertFailure (show err)
118− Right newContext -> do
117+ Right parsed -> do
119− let discon = newDisconnectedTransaction firstUUID newContext
118+ result <- evalTutorialD dbconn parsed
120− let addTrans = addDisconnectedTransaction freshUUID "master" discon origGraph
119+ case result of
121− case addTrans of
120+ QuitResult -> assertFailure "quit?"
121+ DisplayResult _ -> assertFailure "display?"
122+ DisplayIOResult _ -> assertFailure "displayIO?"
122− Left err -> assertFailure (show err)
123+ DisplayErrorResult err -> assertFailure (show err)
123− Right (newTrans, graph) -> do
124+ QuietSuccessResult -> do
124− assertBool "transaction in graph" (isRight $ transactionForUUID freshUUID graph)
125+ commit dbconn >>= maybeFail
125− assertEqual "validate fresh commit with deleted S" (validateGraph graph) Nothing
126+ (DisconnectedTransaction _ context) <- disconnectedTransaction dbconn
126− assertEqual "ensure S was deleted in newContext" (M.lookup "x" (relationVariables (transactionContext newTrans))) (Just suppliersRel)
127+ assertEqual "ensure x was added" (M.lookup "x" (relationVariables context)) (Just suppliersRel)
128transactionRollbackTest :: Test
129transactionRollbackTest :: Test
129transactionRollbackTest = TestCase $ do
130transactionRollbackTest = TestCase $ do
130− ((DisconnectedTransaction firstUUID origContext), graph) <- dateExamplesGraph
131+ dbconn <- dateExamplesConnection
131− freshUUID <- nextRandom
132+ graph <- transactionGraph dbconn
132− case transactionForUUID firstUUID graph of
133+ maybeErr <- executeDatabaseContextExpr dbconn (Assign "x" (RelationVariable "S"))
133− Left err -> assertFailure (show err)
134+ case maybeErr of
135− case interpretDatabaseExpr origContext "x:=S" of
136− Left err -> assertFailure (show err)
135+ Just err -> assertFailure (show err)
137− Right newContext -> do
136+ Nothing -> do
138− let discon = newDisconnectedTransaction firstUUID newContext
137+ rollback dbconn >>= maybeFail
139− let (_, (DisconnectedTransaction _ newContext2), newGraph, _) = interpret freshUUID discon graph ":rollback"
138+ (DisconnectedTransaction _ context') <- disconnectedTransaction dbconn
139+ graph' <- transactionGraph dbconn
140− assertEqual "validate context" (M.lookup "x" (relationVariables newContext2)) Nothing
140+ assertEqual "validate context" Nothing (M.lookup "x" (relationVariables context'))
141− assertEqual "validate graph" graph newGraph
141+ assertEqual "validate graph" graph graph'
143--commit a new transaction with "x" relation, jump to first transaction, verify that "x" is not present
143--commit a new transaction with "x" relation, jump to first transaction, verify that "x" is not present
144transactionJumpTest :: Test
144transactionJumpTest :: Test
145transactionJumpTest = TestCase $ do
145transactionJumpTest = TestCase $ do
146+ dbconn <- dateExamplesConnection
146− ((DisconnectedTransaction firstUUID origContext), origGraph) <- dateExamplesGraph
147+ (DisconnectedTransaction firstUUID _) <- disconnectedTransaction dbconn
147− freshUUID <- nextRandom
148+ maybeErr <- executeDatabaseContextExpr dbconn (Assign "x" (RelationVariable "S"))
148− case transactionForUUID firstUUID origGraph of
149+ case maybeErr of
149− Left err -> assertFailure (show err)
151− case interpretDatabaseExpr origContext "x:=S" of
152− Left err -> assertFailure (show err)
153− Right newContext -> do
154− --modify the second transaction
155− case interpretDatabaseExpr newContext "x:=S" of
156− Left err-> assertFailure (show err)
150+ Just err -> assertFailure (show err)
157− Right newContext2 -> do
151+ Nothing -> do
158− --add the transaction
152+ commit dbconn >>= maybeFail
159− let discon = newDisconnectedTransaction firstUUID newContext2
153+ --perform the jump
160− let addTrans = addDisconnectedTransaction freshUUID "master" discon origGraph
154+ maybeErr2 <- executeGraphExpr dbconn (JumpToTransaction firstUUID)
161− case addTrans of
155+ case maybeErr2 of
162− Left err -> assertFailure (show err)
156+ Just err -> assertFailure (show err)
163− Right (_, graph) -> do
157+ Nothing -> do
164− --jump to the first transaction
158+ --check that the disconnected transaction does not include "x"
165− let (_, (DisconnectedTransaction parentUUID newContext3), newGraph, _) = interpret freshUUID discon graph (":jump " ++ show firstUUID)
159+ (DisconnectedTransaction _ context') <- disconnectedTransaction dbconn
166− assertEqual "validate discon" parentUUID firstUUID
167− assertEqual "validate discon2" Nothing (M.lookup "x" (relationVariables newContext3))
160+ assertEqual "ensure x is not present" Nothing (M.lookup "x" (relationVariables context'))
168− assertEqual "validate graph" transactionUUIDs (S.map transactionUUID (transactionsForGraph newGraph))
161+
169− where
162+maybeFail :: (Show a) => Maybe a -> IO ()
170− transactionUUIDs = S.fromList [firstUUID, freshUUID]
163+maybeFail (Just err) = assertFailure (show err)
164+maybeFail Nothing = return ()
172--branch from the first transaction and verify that there are two heads
166--branch from the first transaction and verify that there are two heads
173transactionBranchTest :: Test
167transactionBranchTest :: Test
174transactionBranchTest = TestCase $ do
168transactionBranchTest = TestCase $ do
175− (origDiscon@(DisconnectedTransaction firstUUID origContext), origGraph) <- dateExamplesGraph
169+ dbconn <- dateExamplesConnection
176− freshUUID1 <- nextRandom
170+ mapM_ (\x -> x >>= maybeFail) [executeGraphExpr dbconn (Branch "test"),
177− freshUUID2 <- nextRandom
171+ executeDatabaseContextExpr dbconn (Assign "x" (RelationVariable "S")),
178− case transactionForUUID firstUUID origGraph of
172+ commit dbconn,
179− Left err -> assertFailure (show err)
173+ executeGraphExpr dbconn (JumpToHead "master"),
180− Right _ -> do
174+ executeDatabaseContextExpr dbconn (Assign "y" (RelationVariable "S"))
181− let disconMaster = newDisconnectedTransaction firstUUID origContext
175+ ]
182− let addTransMaster = addDisconnectedTransaction freshUUID1 "master" disconMaster origGraph
176+ graph <- transactionGraph dbconn
183− --add a second transaction to the "master" branch
177+ assertBool "master branch exists" $ isJust (transactionForHead "master" graph)
184− case addTransMaster of
178+ assertBool "test branch exists" $ isJust (transactionForHead "test" graph)
185− Left err -> assertFailure (show err)
186− Right (_, graph) -> do
187− --add a third transaction to the "test" branch
188− let (_, _, newGraph, _) = interpret freshUUID2 origDiscon graph ":branch test"
189− assertEqual "verify test head" freshUUID2 $ maybeTransUUID (transactionForHead "test" newGraph)
190− assertEqual "verify master head" freshUUID1 $ maybeTransUUID (transactionForHead "master" newGraph)
192− maybeTransUUID t = maybe nil transactionUUID t
194simpleJoinTest :: Test
180simpleJoinTest :: Test
195simpleJoinTest = TestCase $ assertTutdEqual dateExamples joinedRel "x:=S join SP"
181simpleJoinTest = TestCase $ assertTutdEqual dateExamples joinedRel "x:=S join SP"
@@ -214,10 +200,18 @@ simpleJoinTest = TestCase $ assertTutdEqual dateExamples joinedRel "x:=S join SP
214 [StringAtom "London", IntAtom 200, StringAtom "P2", StringAtom "S4", StringAtom "Clark", IntAtom 20]
200 [StringAtom "London", IntAtom 200, StringAtom "P2", StringAtom "S4", StringAtom "Clark", IntAtom 20]
217−dateExamplesGraph :: IO (DisconnectedTransaction, TransactionGraph)
203+dateExamplesConnection :: IO (Connection)
218−dateExamplesGraph = do
204+dateExamplesConnection = do
219− firstTransactionUUID <- nextRandom
205+ dbconn <- connectProjectM36 (InProcessConnectionInfo NoPersistence)
220− let graph = bootstrapTransactionGraph firstTransactionUUID dateExamples
206+ case dbconn of
221− let discon = newDisconnectedTransaction firstTransactionUUID dateExamples
207+ Left err -> do
208+ hPutStrLn stderr (show err)
211+ mapM_ (\(rvName,rvRel) -> executeDatabaseContextExpr conn (Assign rvName (ExistingRelation rvRel))) (M.toList (relationVariables dateExamples))
212+ mapM_ (\(idName,incDep) -> executeDatabaseContextExpr conn (AddInclusionDependency idName incDep)) (M.toList (inclusionDependencies dateExamples))
213+ --skipping atom functions for now- there are no atom function manipulation operators yet
214+ commit conn >>= maybeFail
222− return (discon, graph)
215+ return conn