diff --git a/cw/cw.cabal b/cw/cw.cabal
index 73459c692f4e41da4e5f3da8de9dd6242f710961..9258ab4b6cc236784b2d2a561a8d232774bfa2c5 100644
--- a/cw/cw.cabal
+++ b/cw/cw.cabal
@@ -4,7 +4,7 @@ cabal-version: 1.12
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: fd3572af2df5b17566ae6c18bb0f88fc92d2e2f57139c9406ef8b0287c0d1985
+-- hash: 0503613ad94bca2a43f614208e4d22e039e61deecda53cfdc17a87e2bd476c90
 
 name:           cw
 version:        0.1.0.0
@@ -56,7 +56,7 @@ executable cw-exe
 
 test-suite cw-test
   type: exitcode-stdio-1.0
-  main-is: Spec.hs
+  main-is: Tests.hs
   other-modules:
       Paths_cw
   hs-source-dirs:
diff --git a/cw/package.yaml b/cw/package.yaml
index 0654f8eab1f94c4eef00768efbc7e90908bb58d7..8bdf04d285ff0ffd5e444d3be061a6b73a60dd38 100644
--- a/cw/package.yaml
+++ b/cw/package.yaml
@@ -40,7 +40,7 @@ executables:
 
 tests:
   cw-test:
-    main:                Spec.hs
+    main:                Tests.hs
     source-dirs:         test
     ghc-options:
     - -threaded
diff --git a/cw/test/Spec.hs b/cw/test/Spec.hs
deleted file mode 100644
index e0dc388d36b266b213d41e4de9e5ac298494408a..0000000000000000000000000000000000000000
--- a/cw/test/Spec.hs
+++ /dev/null
@@ -1,257 +0,0 @@
-import Challenges
-import Data.List
-
-
--------------------------------------Examples-----------------------------------
-
-
-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      ))]
-
-
-ex3'1 = LamDef [] (LamApp (LamAbs 1 (LamVar 1)) (LamAbs 1 (LamVar 1)))
-ex3'2 = LamDef [] (LamAbs 1 (LamApp (LamVar 1) (LamAbs 1 (LamVar 1))))
-ex3'3 = LamDef [ ("F",LamAbs 1 (LamVar 1) ) ] (LamAbs 2 (LamApp (LamVar 2) (LamMacro "F")))
-ex3'4 = LamDef [ ("F",LamAbs 1 (LamVar 1) ) ] (LamAbs 2 (LamApp (LamAbs 1 (LamVar 1)) (LamVar 2)))
-ex3'5 = LamDef [ ( "F",LamAbs 1 (LamApp (LamVar 1) (LamVar 1)) ), ( "G",LamAbs 2 (LamVar 2) ) ] 
-               (LamApp (LamAbs 1 (LamApp (LamVar 1) (LamVar 1))) (LamAbs 2 (LamVar 2)))
-
-ex3'1Ans = "(\\x1 -> x1) \\x1 -> x1"
-ex3'2Ans = "\\x1 -> x1 \\x1 -> x1"
-ex3'3Ans = "def F = \\x1 -> x1 in \\x2 -> x2 F"
-ex3'4Ans = "def F = \\x1 -> x1 in \\x2 -> F x2"
-ex3'5Ans = "def F = \\x1 -> x1 x1 in def G = \\x2 -> x2 in F G"
-
-
-ex4'1 = "x1 (x2 x3)"
-ex4'2 = "x1 x2 F"
-ex4'3 = "def F = \\x1-> x1 in \\x2 -> x2 F"
-ex4'4 = "def F = \\x1 -> x1 (def G= \\x1 -> x1 in x1) in \\x2 -> x2"
-ex4'5 = "def F = \\x1 -> x1 in def F = \\x2 -> x2 x1 in x1"
-ex4'6 = "def F = x1 in F"
-ex4'7 = "def F = \\x1 -> x1 x1 in def G = \\x2 -> x2 in F G"
-
-ex4'1Ans = Just (LamDef [] (LamApp (LamVar 1) (LamApp (LamVar 2) (LamVar 3))))
-ex4'2Ans = Just (LamDef [] (LamApp (LamApp (LamVar 1) (LamVar 2)) (LamMacro"F")))
-ex4'3Ans = Just (LamDef  [  ("F",  LamAbs  1  (LamVar  1)  )  ] (LamAbs  2  (LamApp  (LamVar  2)  (LamMacro "F"))))
-ex4'4Ans = Nothing
-ex4'5Ans = Nothing
-ex4'6Ans = Nothing
-ex4'7Ans = Just (LamDef [ ( "F",LamAbs 1 (LamApp (LamVar 1) (LamVar 1)) ), ( "G",LamAbs 2 (LamVar 2) ) ] (LamApp (LamMacro "F") (LamMacro "G")))
-
-
-exId =  (LamAbs 1 (LamVar 1))
-ex5'1 = LamDef [] (LamApp (LamVar 1) (LamVar 2))
-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 = LJust (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", exId) ] (LamVar 2) )
-ex5'3Ans = (LamDef [ ("F", exId) ] (LamMacro "F") )
-ex5'4Ans = (LamDef [ ("F", exId) ] (LamApp (LamMacro "F") (LamMacro "F")))
-
-
-------------------------------Printing Functions--------------------------------
-
-
-printGrid :: WordSearchGrid -> IO ()
-printGrid [] = return ()
-printGrid (w:ws) = do putStrLn $ intersperse ' ' w
-                      printGrid ws
-
-splitEvery :: Int -> [a] -> [[a]]
-splitEvery _ [] = []
-splitEvery n list = first : (splitEvery n rest)
-  where
-    (first,rest) = splitAt n list
-
-pPrintList :: Show a => Int -> [a] -> IO ()
-pPrintList val xs = do putStr "["
-                       let (first:rest) = splitEvery val xs
-                       putStr $ (init . tail) $ show first
-                       printRest rest
-    where
-        printRest :: Show a => [[a]] -> IO ()
-        printRest []     = putStr $ "]\n"
-        printRest (x:xs) = do putStr $ (++) "\n " $ (init . tail) $ show x
-                              printRest xs
-
-zipF :: (a -> b) -> [a] -> [(a,b)]
-zipF f xs = zip xs $ map f xs
-
-
--------------------------------------Main---------------------------------------
-
-
-main :: IO ()
-main = do challenge1Test
-          challenge2Test
-          challenge3Test
-          challenge4Test
-
-
------------------------------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- - - - - - - - - - - - - - - - - -\n"
-                    assert1 exGrid1'2 (solveWordSearch exWords1'2 exGrid1'2) exAns1'2
-                    putStrLn "========================================="
-                    putStrLn "Challenge 1 End Test"
-                    putStrLn "=========================================\n"
-
-
------------------------------Challenge 2 Testing--------------------------------
-
-
-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
-
-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 "========================================="
-                    putStrLn "Challenge 2 End Test"
-                    putStrLn "=========================================\n"
-
-
------------------------------Challenge 3 Testing--------------------------------
-
-
-assert3 :: LamMacroExpr -> String -> String -> IO ()
-assert3 macro expected result = do putStrLn "Pretty Printing:"
-                                   putStrLn $ show macro ++ "\n"
-                                   putStrLn "Expected Result:"
-                                   putStrLn $ expected ++ "\n"
-                                   if expected == result then
-                                     putStrLn "Passed! Result:"
-                                   else
-                                     putStrLn "Failed! Result:"
-                                   putStrLn result
-
-challenge3Test :: IO ()
-challenge3Test = do putStrLn "========================================="
-                    putStrLn "Challenge 3 Start Test"
-                    putStrLn "========================================="
-                    assert3 ex3'1 ex3'1Ans (prettyPrint ex3'1)
-                    putStrLn "\n- - - - - - - - - - - - - - - - - -\n"
-                    assert3 ex3'2 ex3'2Ans (prettyPrint ex3'2)
-                    putStrLn "\n- - - - - - - - - - - - - - - - - -\n"
-                    assert3 ex3'3 ex3'3Ans (prettyPrint ex3'3)
-                    putStrLn "\n- - - - - - - - - - - - - - - - - -\n"
-                    assert3 ex3'4 ex3'4Ans (prettyPrint ex3'4)
-                    putStrLn "\n- - - - - - - - - - - - - - - - - -\n"
-                    assert3 ex3'5 ex3'5Ans (prettyPrint ex3'5)
-                    putStrLn "========================================="
-                    putStrLn "Challenge 3 End Test"
-                    putStrLn "=========================================\n"
-
-
------------------------------Challenge 4 Testing--------------------------------
-
-
-assert4 :: String -> Maybe LamMacroExpr -> Maybe LamMacroExpr -> IO ()
-assert4 macro expected result = do putStrLn "Parsing:"
-                                   putStrLn $ macro ++ "\n"
-                                   putStrLn "Expected Result:"
-                                   putStrLn $ show expected ++ "\n"
-                                   if expected == result then
-                                     putStrLn "Passed! Result:"
-                                   else
-                                     putStrLn "Failed! Result:"
-                                   putStrLn $ show result
-
-challenge4Test :: IO ()
-challenge4Test = do putStrLn "========================================="
-                    putStrLn "Challenge 4 Start Test"
-                    putStrLn "========================================="
-                    assert4 ex4'1 ex4'1Ans (parseLamMacro ex4'1)
-                    putStrLn "\n- - - - - - - - - - - - - - - - - -\n"
-                    assert4 ex4'2 ex4'2Ans (parseLamMacro ex4'2)
-                    putStrLn "\n- - - - - - - - - - - - - - - - - -\n"
-                    assert4 ex4'3 ex4'3Ans (parseLamMacro ex4'3)
-                    putStrLn "\n- - - - - - - - - - - - - - - - - -\n"
-                    assert4 ex4'4 ex4'4Ans (parseLamMacro ex4'4)
-                    putStrLn "\n- - - - - - - - - - - - - - - - - -\n"
-                    assert4 ex4'5 ex4'5Ans (parseLamMacro ex4'5)
-                    putStrLn "\n- - - - - - - - - - - - - - - - - -\n"
-                    assert4 ex4'6 ex4'6Ans (parseLamMacro ex4'6)
-                    putStrLn "\n- - - - - - - - - - - - - - - - - -\n"
-                    assert4 ex4'7 ex4'7Ans (parseLamMacro ex4'7)
-                    putStrLn "========================================="
-                    putStrLn "Challenge 4 End Test"
-                    putStrLn "=========================================\n"
-
-
------------------------------Challenge 5 Testing--------------------------------
-
-
-assert5 :: LamMacroExpr -> LamMacroExpr -> LamMacroExpr -> IO ()
-assert5 macro expected result = do putStrLn "CPS Translating:"
-                                   putStrLn $ prettyPrint macro ++ "\n"
-                                   putStrLn "(Actual Internal Value):"
-                                   putStrLn $ show macro ++ "\n"
-                                   putStrLn "Expected Result:"
-                                   putStrLn $ show expected ++ "\n"
-                                   if expected == result then
-                                     putStrLn "Passed! Result:"
-                                   else
-                                     putStrLn "Failed! Result:"
-                                   putStrLn $ show result
-
-challenge5Test :: IO ()
-challenge5Test = do putStrLn "========================================="
-                    putStrLn "Challenge 5 Start Test"
-                    putStrLn "========================================="
-                    assert5 ex5'1 ex5'1Ans (parseLamMacro ex4'1)
-                    putStrLn "\n- - - - - - - - - - - - - - - - - -\n"
-                    
-                    putStrLn "========================================="
-                    putStrLn "Challenge 5 End Test"
-                    putStrLn "=========================================\n"
\ No newline at end of file