module Main where import Test.Hspec import Data.Queue main :: IO () main = hspec $ do describe "empty" $ do it "returns an empty queue" $ do (empty :: Queue Int) `shouldBe` (Queue [] []) describe "push" $ do it "puts an element into an empty queue" $ do (push 5 empty) `shouldBe` (Queue [5] []) describe "pop" $ do it "takes the only element from the queue" $ do (pop (Queue [5] [])) `shouldBe` (Just (5, Queue [] [])) it "returns nothing if the queue is empty" $ do (pop ((Queue [] [])::Queue Int)) `shouldBe` Nothing it "takes elements in the FIFO order" $ do let queue = push 3 (push 5 empty) in pop queue `shouldBe` Just (5, Queue [] [3]) describe "isEmpty" $ do it "tells when the queue is empty" $ do (isEmpty (empty :: Queue Int)) `shouldBe` True it "tells when the enqueue part isn't empty" $ do let queue = push 3 empty in isEmpty queue `shouldBe` False it "tells when the dequeue part isn't empty" $ do let queue = fmap snd (pop $ push 3 (push 5 empty)) in fmap isEmpty queue `shouldBe` Just False