diff --git a/cw/test/Spec.hs b/cw/test/Spec.hs
index 6308a11a9f3d0ea85d44957bdb765358b4b25c71..e6c0ba8c352928f09cafc34bb0802d47af97d912 100644
--- a/cw/test/Spec.hs
+++ b/cw/test/Spec.hs
@@ -1,7 +1,9 @@
 import Challenges
+import Data.List
 
 main :: IO ()
-main = challenge1Test
+main = challenge2Test
+
 
 
 exGrid1'1  = [ "HAGNIRTSH" , "SACAGETAK", "GCSTACKEL","MGHKMILKI","EKNLETGCN","TNIRTLETE","IRAAHCLSR","MAMROSAGD","GIZKDDNRG" ]
@@ -19,23 +21,69 @@ exGrid1'3  = ["TEST","ASBD","GDFI","FDGS"]
 exWords1'3 = ["TEST"]
 exAns1'3   = [("TEST",Just((0,0),Forward))]
 
-assert1 :: [(String,Maybe Placement)] -> [(String,Maybe Placement)] -> IO ()
-assert1 result correct | result == correct = do putStrLn ("Testing:")
-                                                putStrLn (show correct)
-                                                putStrLn "Passed! Result:"
-                                                putStrLn (show result)
-                                                putStrLn ""
-                       | otherwise         = do putStrLn ("Testing:")
-                                                putStrLn (show correct)
-                                                putStrLn "Failed! Result:"
-                                                putStrLn (show result)
-                                                putStrLn ""
+
+
+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 (solveWordSearch exWords1'3 exGrid1'3) exAns1'3
-                    assert1 (solveWordSearch exWords1'1 exGrid1'1) exAns1'1
-                    assert1 (solveWordSearch exWords1'2 exGrid1'2) exAns1'2
+                    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 1 End Test"
\ No newline at end of file
+                    putStrLn "Challenge 2 End Test"
\ No newline at end of file