add program tests

This commit is contained in:

View File

@ -5,6 +5,8 @@ import Typecheck
import Control.Exception (catch, evaluate, SomeException, displayException) import Control.Exception (catch, evaluate, SomeException, displayException)
import Control.Exception.Base import Control.Exception.Base
import System.IO (stderr, hPutStrLn) import System.IO (stderr, hPutStrLn)
import Data.Maybe
import Data.List
green, red, yellow, blue, magenta, cyan, white :: String -> String green, red, yellow, blue, magenta, cyan, white :: String -> String
green str = "\x1b[32m" ++ str ++ "\x1b[0m" green str = "\x1b[32m" ++ str ++ "\x1b[0m"
@ -90,6 +92,33 @@ exampleMethodCallAndAssignmentFail = Block [
StatementExpressionStatement (Assignment "a" (Reference "age")) StatementExpressionStatement (Assignment "a" (Reference "age"))
] ]
testClasses :: [Class]
testClasses = [
Class "Person" [
MethodDeclaration "Person" "Person" [ParameterDeclaration "int" "initialAge"]
(Block [
Return (Just (Reference "this"))
]),
MethodDeclaration "void" "setAge" [ParameterDeclaration "int" "newAge"]
(Block [
LocalVariableDeclaration (VariableDeclaration "int" "age" (Just (Reference "newAge")))
]),
MethodDeclaration "int" "getAge" []
(Return (Just (Reference "age")))
] [
VariableDeclaration "int" "age" Nothing -- initially unassigned
],
Class "Main" [
MethodDeclaration "int" "main" []
(Block [
LocalVariableDeclaration (VariableDeclaration "Person" "bob" (Just (StatementExpressionExpression (ConstructorCall "Person" [IntegerLiteral 25])))),
StatementExpressionStatement (MethodCall (Reference "bob") "setAge" [IntegerLiteral 30]),
LocalVariableDeclaration (VariableDeclaration "int" "bobAge" (Just (StatementExpressionExpression (MethodCall (Reference "bob") "getAge" [])))),
Return (Just (Reference "bobAge"))
])
] []
]
runTypeCheck :: IO () runTypeCheck :: IO ()
runTypeCheck = do runTypeCheck = do
catch (do catch (do
@ -155,3 +184,20 @@ runTypeCheck = do
printResult "Result Method Call and Assignment:" evaluatedMethodCallAndAssignmentFail printResult "Result Method Call and Assignment:" evaluatedMethodCallAndAssignmentFail
) handleError ) handleError
catch (do
print "====================================================================================="
let mainClass = fromJust $ find (\(Class className _ _) -> className == "Main") testClasses
case mainClass of
Class _ [mainMethod] _ -> do
let result = typeCheckMethodDeclaration mainMethod [] testClasses
printSuccess "Full program type checking completed successfully."
printResult "Main method result:" result
) handleError
catch (do
print "====================================================================================="
let typedProgram = typeCheckCompilationUnit testClasses
printSuccess "Type checking of Program completed successfully"
printResult "Typed Program:" typedProgram
) handleError