diff --git a/exercises/linked-list/package.yaml b/exercises/linked-list/package.yaml index 4214531f8..0f0d85be7 100644 --- a/exercises/linked-list/package.yaml +++ b/exercises/linked-list/package.yaml @@ -17,4 +17,4 @@ tests: source-dirs: test dependencies: - linked-list - - HUnit + - hspec diff --git a/exercises/linked-list/test/Tests.hs b/exercises/linked-list/test/Tests.hs index d0494d14f..e9246845f 100644 --- a/exercises/linked-list/test/Tests.hs +++ b/exercises/linked-list/test/Tests.hs @@ -1,57 +1,54 @@ -import Test.HUnit (Assertion, (@=?), runTestTT, Test(..), Counts(..)) -import System.Exit (ExitCode(..), exitWith) --- Consider using Control.Concurrent.STM.TMVar or Control.Concurrent.MVar --- to deal with the mutability -import Deque (mkDeque, push, pop, shift, unshift) +import Test.Hspec (Spec, describe, it, shouldReturn) +import Test.Hspec.Runner (configFastFail, defaultConfig, hspecWith) -exitProperly :: IO Counts -> IO () -exitProperly m = do - counts <- m - exitWith $ if failures counts /= 0 || errors counts /= 0 then ExitFailure 1 else ExitSuccess - -testCase :: String -> Assertion -> Test -testCase label assertion = TestLabel label (TestCase assertion) +import Deque (mkDeque, pop, push, shift, unshift) main :: IO () -main = exitProperly $ runTestTT $ TestList - [ TestList dequeTests ] - -dequeTests :: [Test] -dequeTests = - [ testCase "push pop" $ do - deque <- mkDeque - push deque 'a' - push deque 'b' - pop deque >>= (Just 'b' @=?) - pop deque >>= (Just 'a' @=?) - , testCase "push shift" $ do - deque <- mkDeque - push deque 'a' - push deque 'b' - shift deque >>= (Just 'a' @=?) - shift deque >>= (Just 'b' @=?) - , testCase "unshift shift" $ do - deque <- mkDeque - unshift deque 'a' - unshift deque 'b' - shift deque >>= (Just 'b' @=?) - shift deque >>= (Just 'a' @=?) - , testCase "unshift pop" $ do - deque <- mkDeque - unshift deque 'a' - unshift deque 'b' - pop deque >>= (Just 'a' @=?) - pop deque >>= (Just 'b' @=?) - , testCase "example" $ do - deque <- mkDeque - push deque 'a' - push deque 'b' - pop deque >>= (Just 'b' @=?) - push deque 'c' - shift deque >>= (Just 'a' @=?) - unshift deque 'd' - push deque 'e' - shift deque >>= (Just 'd' @=?) - pop deque >>= (Just 'e' @=?) - pop deque >>= (Just 'c' @=?) - ] +main = hspecWith defaultConfig {configFastFail = True} specs + +specs :: Spec +specs = describe "linked-list" $ do + + -- As of 2016-08-10, there was no reference file + -- for the test cases in `exercism/x-common`. + + it "push pop" $ do + deque <- mkDeque + push deque 'a' + push deque 'b' + pop deque `shouldReturn` Just 'b' + pop deque `shouldReturn` Just 'a' + + it "push shift" $ do + deque <- mkDeque + push deque 'a' + push deque 'b' + shift deque `shouldReturn` Just 'a' + shift deque `shouldReturn` Just 'b' + + it "unshift shift" $ do + deque <- mkDeque + unshift deque 'a' + unshift deque 'b' + shift deque `shouldReturn` Just 'b' + shift deque `shouldReturn` Just 'a' + + it "unshift pop" $ do + deque <- mkDeque + unshift deque 'a' + unshift deque 'b' + pop deque `shouldReturn` Just 'a' + pop deque `shouldReturn` Just 'b' + + it "example" $ do + deque <- mkDeque + push deque 'a' + push deque 'b' + pop deque `shouldReturn` Just 'b' + push deque 'c' + shift deque `shouldReturn` Just 'a' + unshift deque 'd' + push deque 'e' + shift deque `shouldReturn` Just 'd' + pop deque `shouldReturn` Just 'e' + pop deque `shouldReturn` Just 'c'