From cd38cc6fba64bdcd926393eeb82851d09a310cab Mon Sep 17 00:00:00 2001 From: ik1g19 <ik1g19@soton.ac.uk> Date: Thu, 14 Jan 2021 15:59:33 +0000 Subject: [PATCH] added many more tests --- cw/test/Tests.hs | 222 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 169 insertions(+), 53 deletions(-) diff --git a/cw/test/Tests.hs b/cw/test/Tests.hs index 05cb32f..54667cd 100644 --- a/cw/test/Tests.hs +++ b/cw/test/Tests.hs @@ -17,62 +17,115 @@ main = do challenge1Test -----------------------------Challenge 1 Testing-------------------------------- -assert1 :: WordSearchGrid -> [ (String,Maybe Placement) ] -> [ (String,Maybe Placement) ] -> IO () -assert1 grid result correct = do putStrLn "Testing Grid:\n" - printGrid grid - putStrLn "\nExpected Result:" - pPrintList 3 correct - putStrLn "" - if result == correct then - do putStrLn "Passed! Result:" - pPrintList 3 result - else - do putStrLn "Failed! Result:" - pPrintList 3 result - challenge1Test :: IO () challenge1Test = do putStrLn "=========================================" putStrLn "Challenge 1 Start Test" - putStrLn "=========================================" - assert1 exGrid1'1 (solveWordSearch exWords1'1 exGrid1'1) exAns1'1 + putStrLn "=========================================\n" + assert1 (exGrid1'1,exWords1'1) (solveWordSearch exWords1'1 exGrid1'1) exAns1'1 putStrLn "\n- - - - - - - - - - - - - - - - - -\n" - assert1 exGrid1'2 (solveWordSearch exWords1'2 exGrid1'2) exAns1'2 - putStrLn "=========================================" + assert1 (exGrid1'2,exWords1'2) (solveWordSearch exWords1'2 exGrid1'2) exAns1'2 + putStrLn "\n- - - - - - - - - - - - - - - - - -\n" + assert1 (exGrid1'3,exWords1'3) (solveWordSearch exWords1'3 exGrid1'3) exAns1'3 + putStrLn "\n=========================================" putStrLn "Challenge 1 End Test" putStrLn "=========================================\n" ------------------------------Challenge 2 Testing-------------------------------- +assert1 :: (WordSearchGrid,[String]) -> [ (String,Maybe Placement) ] -> [ (String,Maybe Placement) ] -> IO () +assert1 (grid,words) result correct = do putStrLn "Testing Grid:\n" + printGrid grid + putStrLn "\nWords Hidden are:" + pPrintList 5 words + putStrLn "\nExpected Result:" + pPrintList 3 correct + lineBreak + if result == correct then + putStrLn "Passed! Result:" + else + putStrLn "Failed! Result:" + pPrintList 3 result -assert2 :: WordSearchGrid -> [ (String,Maybe Placement) ] -> IO () -assert2 grid answers = do putStrLn "Checking Grid Contains all Given Words:\n" - printGrid grid - putStrLn "\nWords in Grid:" - pPrintList 3 answers - if foldl1 (||) $ map ((Nothing/=) . snd) answers then - putStrLn "Passed Test! All words are present!" - else - do putStrLn "Failed Test! Not all words are present" - putStrLn "List of found words:" - pPrintList 3 answers +-----------------------------Challenge 2 Testing-------------------------------- -createAndSolve :: [ String ] -> Double -> IO (WordSearchGrid,[ (String,Maybe Placement) ]) -createAndSolve words maxDensity = do g <- createWordSearch words maxDensity - let soln = solveWordSearch words g - return (g,soln) challenge2Test :: IO () challenge2Test = do putStrLn "=========================================" putStrLn "Challenge 2 Start Test" - putStrLn "=========================================" - (g1,sol1) <- createAndSolve ["WORD","EXAMPLE","SEARCH"] 0.3 - assert2 g1 sol1 + putStrLn "=========================================\n" + (g1,sol1) <- createAndSolve ["HIDE","THIS","WORD"] 0.3 + assert2 1 g1 0.3 sol1 + (g2,sol2) <- createAndSolve ["LONGER","WORD","SEARCH","TO","SOVLE"] 0.4 + assert2 2 g2 0.4 sol2 + (g3,sol3) <- createAndSolve ["THIS","ONE","$HAS$","+SYMBOLS+","AS","WELL"] 0.6 + assert2 3 g3 0.6 sol3 putStrLn "=========================================" putStrLn "Challenge 2 End Test" putStrLn "=========================================\n" +assert2 :: Int -> WordSearchGrid -> Double -> [ (String,Maybe Placement) ] -> IO () +assert2 gridNumber grid density answers = do putStrLn "- - - - - - - - - - - - - - - - - -" + putStrLn $ "Checking Grid Number: " ++ show gridNumber + putStrLn "- - - - - - - - - - - - - - - - - -\n" + printGrid grid + putStrLn "\nShould Contain these Words:" + pPrintList 3 answers + lineBreak + wordsPresent grid answers + lineBreak + densityCheck grid density answers + lineBreak + +wordsPresent :: WordSearchGrid -> [ (String,Maybe Placement) ] -> IO () +wordsPresent grid answers = do putStrLn "- - - - - - - - - - - - - - - - - -" + putStrLn "Testing Words are Present" + putStrLn "- - - - - - - - - - - - - - - - - -\n" + if foldl1 (||) $ map ((Nothing/=) . snd) answers then + putStrLn "Passed Test! All words are present!" + else + do putStrLn "Failed Test! Not all words are present" + putStrLn "List of words that weren't found:" + pPrintList 3 $ map fst $ filter ((Nothing/=) . snd) answers + +densityCheck :: WordSearchGrid -> Double -> [ (String,Maybe Placement) ] -> IO () +densityCheck grid density answers = do putStrLn "- - - - - - - - - - - - - - - - - -" + putStrLn "Testing Desnity is Correct" + putStrLn "- - - - - - - - - - - - - - - - - -\n" + let charPositions = map ( \(word,Just ( posn,dir )) -> take (length word) -- | words can overlap so finds position of each + $ iterate (nextPos dir) posn ) answers -- | char of each word + let hiddenPositions = foldl1 (++) charPositions -- | and only uses unique positions to find density + let uniquePositions = rmdups hiddenPositions + let d = (fromIntegral $ length uniquePositions) / + (fromIntegral $ sum $ map length grid) + if d < density then + putStrLn "Passed Test!" + else + putStrLn "Failed Test!" + putStrLn $ foldl1 (++) ["Desired density was ",show density, + " and the density of the generated grid was ",show d] + +createAndSolve :: [ String ] -> Double -> IO (WordSearchGrid,[ (String,Maybe Placement) ]) +createAndSolve words maxDensity = do g <- createWordSearch words maxDensity + let soln = solveWordSearch words g + return (g,soln) + +{--| returns position of movement in a given direction |--} +nextPos :: Orientation -> Posn -> Posn +nextPos Forward (x,y) = (x+1,y) +nextPos Back (x,y) = (x-1,y) +nextPos Up (x,y) = (x,y-1) +nextPos Down (x,y) = (x,y+1) +nextPos UpForward (x,y) = (x+1,y-1) +nextPos UpBack (x,y) = (x-1,y-1) +nextPos DownForward (x,y) = (x+1,y+1) +nextPos DownBack (x,y) = (x-1,y+1) + +{--| removes duplicates from a list |-- + --| code from https://stackoverflow.com/a/16109302/10218833 |--} +rmdups :: (Ord a) => [a] -> [a] +rmdups = map head . group . sort + -----------------------------Challenge 3 Testing-------------------------------- @@ -90,7 +143,7 @@ assert3 macro expected result = do putStrLn "Pretty Printing:" challenge3Test :: IO () challenge3Test = do putStrLn "=========================================" putStrLn "Challenge 3 Start Test" - putStrLn "=========================================" + putStrLn "=========================================\n" assert3 ex3'1 ex3'1Ans (prettyPrint ex3'1) putStrLn "\n- - - - - - - - - - - - - - - - - -\n" assert3 ex3'2 ex3'2Ans (prettyPrint ex3'2) @@ -100,7 +153,7 @@ challenge3Test = do putStrLn "=========================================" assert3 ex3'4 ex3'4Ans (prettyPrint ex3'4) putStrLn "\n- - - - - - - - - - - - - - - - - -\n" assert3 ex3'5 ex3'5Ans (prettyPrint ex3'5) - putStrLn "=========================================" + putStrLn "\n=========================================" putStrLn "Challenge 3 End Test" putStrLn "=========================================\n" @@ -122,7 +175,7 @@ assert4 macro expected result = do putStrLn "Parsing:" challenge4Test :: IO () challenge4Test = do putStrLn "=========================================" putStrLn "Challenge 4 Start Test" - putStrLn "=========================================" + putStrLn "=========================================\n" assert4 ex4'1 ex4'1Ans (parseLamMacro ex4'1) putStrLn "\n- - - - - - - - - - - - - - - - - -\n" assert4 ex4'2 ex4'2Ans (parseLamMacro ex4'2) @@ -136,7 +189,7 @@ challenge4Test = do putStrLn "=========================================" assert4 ex4'6 ex4'6Ans (parseLamMacro ex4'6) putStrLn "\n- - - - - - - - - - - - - - - - - -\n" assert4 ex4'7 ex4'7Ans (parseLamMacro ex4'7) - putStrLn "=========================================" + putStrLn "\n=========================================" putStrLn "Challenge 4 End Test" putStrLn "=========================================\n" @@ -160,7 +213,7 @@ assert5 toTest expected result = do putStrLn "CPS Translating:" challenge5Test :: IO () challenge5Test = do putStrLn "=========================================" putStrLn "Challenge 5 Start Test" - putStrLn "=========================================" + putStrLn "=========================================\n" assert5 ex5'1 ex5'1Ans (cpsTransform ex5'1) putStrLn "\n- - - - - - - - - - - - - - - - - -\n" assert5 ex5'2 ex5'2Ans (cpsTransform ex5'2) @@ -168,8 +221,7 @@ challenge5Test = do putStrLn "=========================================" assert5 ex5'3 ex5'3Ans (cpsTransform ex5'3) putStrLn "\n- - - - - - - - - - - - - - - - - -\n" assert5 ex5'4 ex5'4Ans (cpsTransform ex5'4) - putStrLn "\n- - - - - - - - - - - - - - - - - -\n" - putStrLn "=========================================" + putStrLn "\n=========================================" putStrLn "Challenge 5 End Test" putStrLn "=========================================\n" @@ -206,7 +258,7 @@ assert6Outer toTest expected result = do putStrLn "Testing Outer one step Reduct assert6Compare :: LamMacroExpr -> Int -> (Maybe Int,Maybe Int,Maybe Int,Maybe Int) -> (Maybe Int,Maybe Int,Maybe Int,Maybe Int) -> IO () assert6Compare toTest bound expected result = do putStrLn "Testing Comparisons of Reductions of:" putStrLn $ prettyPrint toTest ++ "\n" - putStrLn $ "For a Bound of:" ++ show bound ++ "\n" + putStrLn $ "For a Bound of: " ++ show bound ++ "\n" putStrLn "(Actual Internal Value):" putStrLn $ show toTest ++ "\n" putStrLn "Expected Result:" @@ -229,11 +281,22 @@ challenge6Test = do putStrLn "=========================================" -- putStrLn "\n- - - - - - - - - - - - - - - - - -" -- putStrLn "Testing Outer Reduction" -- putStrLn "- - - - - - - - - - - - - - - - - -\n" - putStrLn "\n- - - - - - - - - - - - - - - - - -" + putStrLn "- - - - - - - - - - - - - - - - - -" putStrLn "Testing Comparisons of Reductions" putStrLn "- - - - - - - - - - - - - - - - - -\n" assert6Compare ex6'1 10 ex6'1Ans (compareInnerOuter ex6'1 10) - putStrLn "\n- - - - - - - - - - - - - - - - - -\n" + putStrLn "- - - - - - - - - - - - - - - - - -\n" + assert6Compare ex6'2 10 ex6'2Ans (compareInnerOuter ex6'2 10) + putStrLn "- - - - - - - - - - - - - - - - - -\n" + assert6Compare ex6'3 10 ex6'3Ans (compareInnerOuter ex6'3 10) + putStrLn "- - - - - - - - - - - - - - - - - -\n" + assert6Compare ex6'4 100 ex6'4Ans (compareInnerOuter ex6'4 10) + -- putStrLn "- - - - - - - - - - - - - - - - - -\n" + -- assert6Compare ex6'5 30 ex6'5Ans (compareInnerOuter ex6'5 10) + -- putStrLn "- - - - - - - - - - - - - - - - - -\n" + -- assert6Compare ex6'6 30 ex6'6Ans (compareInnerOuter ex6'6 10) + -- putStrLn "- - - - - - - - - - - - - - - - - -\n" + -- assert6Compare ex6'7 1000 ex6'7Ans (compareInnerOuter ex6'7 10) putStrLn "=========================================" putStrLn "Challenge 6 End Test" putStrLn "=========================================\n" @@ -267,24 +330,58 @@ pPrintList val xs = do putStr "[" zipF :: (a -> b) -> [a] -> [(a,b)] zipF f xs = zip xs $ map f xs +lineBreak :: IO () +lineBreak = putStrLn "" + -------------------------------------Examples----------------------------------- -exGrid1'1 = [ "HAGNIRTSH" , "SACAGETAK", "GCSTACKEL","MGHKMILKI","EKNLETGCN","TNIRTLETE","IRAAHCLSR","MAMROSAGD","GIZKDDNRG" ] +exGrid1'1 = [ "HAGNIRTSH", + "SACAGETAK", + "GCSTACKEL", + "MGHKMILKI", + "EKNLETGCN", + "TNIRTLETE", + "IRAAHCLSR", + "MAMROSAGD", + "GIZKDDNRG" ] exWords1'1 = [ "HASKELL","STRING","STACK","MAIN","METHOD"] exAns1'1 = [("HASKELL",Just((0,0),DownForward)),("STRING",Just((7,0),Back)),("STACK",Just((2,2),Forward)), ("MAIN", Just((2,7),Up )),("METHOD",Just((4,3),Down))] - -exGrid1'2 = ["ROBREUMBR","AURPEPSAN","UNLALMSEE","YGAUNPYYP","NLMNBGENA","NBLEALEOR","ALRYPBBLG","NREPBEBEP","YGAYAROMR"] +exGrid1'2 = ["ROBREUMBR", + "AURPEPSAN", + "UNLALMSEE", + "YGAUNPYYP", + "NLMNBGENA", + "NBLEALEOR", + "ALRYPBBLG", + "NREPBEBEP", + "YGAYAROMR"] exWords1'2 = [ "BANANA", "ORANGE", "MELON", "RASPBERRY","APPLE","PLUM","GRAPE" ] exAns1'2 = [("BANANA", Just((5,6),UpBack )),("ORANGE",Just((1,0),DownForward)),("MELON",Just((7,8),Up )), ("RASPBERRY",Just((8,0),DownBack)),("APPLE", Just((2,8),UpForward )),("PLUM", Just((5,1),DownBack)), ("GRAPE", Just((8,6),Up ))] +exGrid1'3 = ["CNOGLNCMGNT", + "EIATR+ECATJ", + "RCVNCVJCCAM", + "JLNSAINRVH+", + "HMPENINAVMY", + "UAIPICLJVJH", + "+RNYSCLUMIT", + "NGNTCLSRJPU", + "NOYHPIP+GLH", + "RRVOHRT+GOT", + "JPUNVGSCIEA"] +exWords1'3 = ["C++","JAVA","PYTHON","PROGRAM","JULIAN","SCIENCE"] + +exAns1'3 = [("C++", Just ((7,10),Up)),("JAVA", Just ((10,1),DownBack)),("PYTHON", Just ((3,5),Down )), + ("PROGRAM",Just ((1,10),Up)),("JULIAN",Just ((8,7), UpBack )),("SCIENCE",Just ((6,7),UpBack))] + ex3'1 = LamDef [] (LamApp (LamAbs 1 (LamVar 1)) (LamAbs 1 (LamVar 1))) ex3'2 = LamDef [] (LamAbs 1 (LamApp (LamVar 1) (LamAbs 1 (LamVar 1)))) @@ -323,10 +420,29 @@ ex5'2 = LamDef [ ("F", exId) ] (LamVar 2) ex5'3 = LamDef [ ("F", exId) ] (LamMacro "F") ex5'4 = LamDef [ ("F", exId) ] (LamApp (LamMacro "F") (LamMacro "F")) -ex5'1Ans = LamDef [] (LamAbs 3 (LamApp (LamAbs 6 (LamApp (LamVar 6) (LamVar 1))) (LamAbs 4 (LamApp (LamAbs 7 (LamApp (LamVar 7) (LamVar 2))) (LamAbs 5 (LamApp (LamApp (LamVar 4) (LamVar 5)) (LamVar 3))))))) -ex5'2Ans = LamDef [("F",LamAbs 3 (LamApp (LamVar 3) (LamAbs 1 (LamAbs 4 (LamApp (LamVar 4) (LamVar 1))))))] (LamAbs 5 (LamApp (LamVar 5) (LamVar 2))) -ex5'3Ans = LamDef [("F",LamAbs 2 (LamApp (LamVar 2) (LamAbs 1 (LamAbs 3 (LamApp (LamVar 3) (LamVar 1))))))] (LamMacro "F") -ex5'4Ans = LamDef [("F",LamAbs 2 (LamApp (LamVar 2) (LamAbs 1 (LamAbs 3 (LamApp (LamVar 3) (LamVar 1))))))] (LamAbs 4 (LamApp (LamMacro "F") (LamAbs 5 (LamApp (LamMacro "F") (LamAbs 6 (LamApp (LamApp (LamVar 5) (LamVar 6)) (LamVar 4))))))) +ex5'1Ans = LamDef [] (LamAbs 3 (LamApp (LamAbs 6 (LamApp (LamVar 6) (LamVar 1))) + (LamAbs 4 (LamApp (LamAbs 7 (LamApp (LamVar 7) (LamVar 2))) + (LamAbs 5 (LamApp (LamApp (LamVar 4) (LamVar 5)) + (LamVar 3))))))) + +ex5'2Ans = LamDef [("F",LamAbs 3 (LamApp (LamVar 3) + (LamAbs 1 (LamAbs 4 (LamApp (LamVar 4) + (LamVar 1))))))] + (LamAbs 5 (LamApp (LamVar 5) (LamVar 2))) + +ex5'3Ans = LamDef [("F",LamAbs 2 (LamApp (LamVar 2) + (LamAbs 1 (LamAbs 3 (LamApp (LamVar 3) + (LamVar 1))))))] + (LamMacro "F") + +ex5'4Ans = LamDef [("F",LamAbs 2 (LamApp (LamVar 2) + (LamAbs 1 (LamAbs 3 (LamApp (LamVar 3) + (LamVar 1))))))] + (LamAbs 4 (LamApp (LamMacro "F") + (LamAbs 5 (LamApp (LamMacro "F") + (LamAbs 6 (LamApp (LamApp (LamVar 5) + (LamVar 6)) + (LamVar 4))))))) ex6'1 = LamDef [] (LamAbs 1 (LamApp (LamVar 1) (LamVar 2))) -- | (\x1 -> x1 x2) -- GitLab