module Main (main) where

import Data.Enum.Circular
import Data.Function
import Test.Hspec

data Direction = N | E | S | W deriving (Show, Eq, Enum, Bounded)

circularDirections :: Spec
circularDirections = describe "Circular directions" $ do

  describe "Boundaries" $ do
    it "North after West"   $ csucc W `shouldBe` N
    it "West before North"  $ cpred N `shouldBe` W

  describe "Compatible with Enum instance" $ do
    it "Successors" $
      iterate csucc minBound `startShouldBe` cycle allDirs
    it "Predecessors" $
      iterate cpred maxBound `startShouldBe` cycle (reverse allDirs)

  where allDirs         = enumFrom minBound :: [Direction]
        startShouldBe   = shouldBe `on` take (length allDirs * 2)

main :: IO ()
main = hspec circularDirections