Skip to content
Snippets Groups Projects
Select Git revision
  • 0a67b288c463ee320cd1be8b128e9ee20b716c66
  • master default protected
2 results

Spec.hs

Blame
  • Spec.hs 4.25 KiB
    import Challenges
    import Data.List
    
    main :: IO ()
    main = challenge2Test
    
    
    
    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"]
    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  = ["TEST","ASBD","GDFI","FDGS"]
    exWords1'3 = ["TEST"]
    exAns1'3   = [("TEST",Just((0,0),Forward))]
    
    
    
    printGrid :: WordSearchGrid -> IO ()
    printGrid [] = return ()
    printGrid (w:ws) = do putStrLn $ intersperse ' ' w
                          printGrid ws
    
    pPrintList :: Show a => [a] -> IO ()
    pPrintList cs = do putStr "["
                       ppl cs
        where
          ppl (x:[])     =    putStrLn $ " " ++ show x ++ "]\n"
          ppl (x:y:[])   =    putStrLn $ " " ++ show x ++ "," ++ show y ++ "]\n"
          ppl (x:y:z:[]) =    putStrLn $ " " ++ show x ++ "," ++ show y ++ "," ++ show z ++ "]\n"
          ppl (x:y:z:xs) = do putStrLn $ " " ++ show x ++ "," ++ show y ++ "," ++ show z ++ ","
                              ppl $ xs
    
    
    
    assert1 :: WordSearchGrid -> [ (String,Maybe Placement) ] -> [ (String,Maybe Placement) ] -> IO ()
    assert1 grid result correct | result == correct = do putStrLn "Testing Grid:\n"
                                                         printGrid grid
                                                         putStrLn "\nExpected Result:"
                                                         pPrintList correct
                                                         putStrLn "Passed! Result:"
                                                         pPrintList result
                                | otherwise         = do putStrLn "Testing Grid:\n"
                                                         printGrid grid
                                                         putStrLn "\nExpected Result:"
                                                         pPrintList correct
                                                         putStrLn "Failed! Result:"
                                                         pPrintList result
    
    challenge1Test :: IO ()
    challenge1Test = do putStrLn "Challenge 1 Start Test"
                        putStrLn "========================================="
                        assert1 exGrid1'1 (solveWordSearch exWords1'1 exGrid1'1) exAns1'1
                        assert1 exGrid1'2 (solveWordSearch exWords1'2 exGrid1'2) exAns1'2
                        putStrLn "========================================="
                        putStrLn "Challenge 1 End Test"
    
    
    
    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 answers
                              putStrLn areWordsPresent
        where
          areWordsPresent = if foldl1 (||) $ map (\(_,x) -> x == Nothing) answers
                              then "Not all words present!"
                              else "All words are present!"
    
    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 "Challenge 2 Start Test"
                        putStrLn "========================================="
                        (g1,sol1) <- createAndSolve ["WORD","EXAMPLE","SEARCH"] 0.3
                        assert2 g1 sol1
                        putStrLn "========================================="
                        putStrLn "Challenge 2 End Test"