Added a test for genReplicator

This commit is contained in:
Neil Brown 2007-10-03 23:48:57 +00:00
parent 25e7e0ef2b
commit 8b95ae00f0
2 changed files with 28 additions and 11 deletions

View File

@ -122,7 +122,9 @@ data GenOps = GenOps {
genPar :: GenOps -> A.ParMode -> A.Structured -> CGen (),
genProcCall :: GenOps -> A.Name -> [A.Actual] -> CGen (),
genProcess :: GenOps -> A.Process -> CGen (),
-- | Generates a replicator loop, given the replicator and body
genReplicator :: GenOps -> A.Replicator -> CGen () -> CGen (),
-- | Generates the three bits of a for loop (e.g. "int i=0;i<10;i++" for the given replicator
genReplicatorLoop :: GenOps -> A.Replicator -> CGen (),
genRetypeSizes :: GenOps -> Meta -> A.AbbrevMode -> A.Type -> A.Name -> A.Type -> A.Variable -> CGen (),
genSeq :: GenOps -> A.Structured -> CGen (),
@ -983,11 +985,11 @@ cgenOutputItem ops c (A.OutExpression m e)
--{{{ replicators
cgenReplicator :: GenOps -> A.Replicator -> CGen () -> CGen ()
cgenReplicator ops rep body
= do tell ["for ("]
= do tell ["for("]
call genReplicatorLoop ops rep
tell [") {\n"]
tell ["){"]
body
tell ["}\n"]
tell ["}"]
isZero :: A.Expression -> Bool
isZero (A.Literal _ A.Int (A.IntLiteral _ "0")) = True
@ -1003,24 +1005,24 @@ cgenReplicatorLoop ops (A.For m index base count)
simple
= do tell ["int "]
genName index
tell [" = 0; "]
tell ["=0;"]
genName index
tell [" < "]
tell ["<"]
call genExpression ops count
tell ["; "]
tell [";"]
genName index
tell ["++"]
general :: CGen ()
general
= do counter <- makeNonce "replicator_count"
tell ["int ", counter, " = "]
tell ["int ", counter, "="]
call genExpression ops count
tell [", "]
tell [","]
genName index
tell [" = "]
tell ["="]
call genExpression ops base
tell ["; ", counter, " > 0; ", counter, "--, "]
tell [";", counter, ">0;", counter, "--,"]
genName index
tell ["++"]

View File

@ -65,7 +65,7 @@ assertGenR n exp act
Right ss ->
case matchRegex (mkRegex exp) (subRegex (mkRegex "/\\*\\*/") (concat ss) "") of
Just matches -> return matches
Nothing -> (assertFailure $ n ++ " regex match failed, regex: \"" ++ show exp ++ "\" text: " ++ (concat ss)) >> return []
Nothing -> (assertFailure $ n ++ " regex match failed, regex: \"" ++ exp ++ "\" text: " ++ (concat ss)) >> return []
-- | Asserts that the given output of a CGen pass is a failure
@ -129,6 +129,13 @@ testBothSameS ::
-> Test
testBothSameS n e a s = testBothS n e e a s
testBothSameR ::
String -- ^ Test Name
-> String -- ^ C and C++ expected
-> (GenOps -> CGen ()) -- ^ Actual
-> Test
testBothSameR n e a = TestCase $ (testRS n e (a cgenOps) (return ())) >> (testRS n e (a cppgenOps) (return ())) >> (return ())
testBothFail :: String -> (GenOps -> CGen ()) -> Test
testBothFail a b = testBothFailS a b (return ())
@ -291,6 +298,13 @@ testOverArray = TestList $ map testOverArray'
state1 = defineName (simpleName "foo") $ simpleDefDecl "foo" (A.Array [A.Dimension 7] A.Int)
state3 = defineName (simpleName "foo") $ simpleDefDecl "foo" (A.Array [A.Dimension 7, A.Dimension 8, A.Dimension 9] A.Int)
testReplicator :: Test
testReplicator = TestList
[
testBothSame "testReplicator 0" "for(int foo=0;foo<10;foo++){@}" (tcall2 genReplicator (A.For emptyMeta foo (intLiteral 0) (intLiteral 10)) at)
,testBothSameR "testReplicator 1" "for\\(int ([[:alnum:]_]+)=10,foo=1;\\1>0;\\1--,foo\\+\\+\\)\\{@\\}" (tcall2 genReplicator (A.For emptyMeta foo (intLiteral 1) (intLiteral 10)) at)
]
testDeclaration :: Test
testDeclaration = TestList
[
@ -343,5 +357,6 @@ tests = TestList
,testDeclaration
,testGenType
,testOverArray
,testReplicator
,testStop
]