module Main where import Control.Monad ((>=>)) import Data.Semigroup ((<>)) import System.Directory.Layout import Test.Hspec main :: IO () main = hspec $ do describe "basic equalities" $ do it "is sane" $ do layout_0 == layout_1 `shouldBe` False layout_1 == layout_1' `shouldBe` True describe "indentity monad laws" $ do it "holds for layout 0" $ do (layout_0 >>= return) `shouldBe` layout_0 (return () >>= \() -> layout_0) `shouldBe` layout_0 it "holds for layout 1" $ do (layout_1 >>= return) `shouldBe` layout_1 (return () >>= \() -> layout_1) `shouldBe` layout_1 describe "associativity monad law" $ do it "holds for layouts 2 and 3" $ do layout_2 (>>) `shouldBe` layout_3 (>>) it "holds for layouts 4 and 5" $ do layout_4 () `shouldBe` layout_5 () describe "associativity semigroup law" $ do it "holds for layouts 2 and 3" $ do layout_2 (<>) `shouldBe` layout_3 (<>) layout_0, layout_1, layout_1' :: Layout layout_0 = do file_ "foo" file_ "bar" file_ "baz" layout_1 = do file_ "foo" file_ "bar" directory "quux" $ do file_ "zem" file_ "zek" file_ "baz" layout_1' = do file_ "foo" file_ "bar" directory "quux" $ do file_ "zek" file_ "zem" file_ "baz" layout_2, layout_3 :: (Layout -> Layout -> Layout) -> Layout layout_2 (#) = (file_ "foo" # file_ "bar") # file_ "baz" layout_3 (#) = file_ "foo" # (file_ "bar" # file_ "baz") layout_4, layout_5 :: () -> Layout layout_4 = (const (file_ "foo") >=> const (file_ "bar")) >=> const (file_ "baz") layout_5 = const (file_ "foo") >=> (const (file_ "bar") >=> const (file_ "baz"))