packages feed

directory-layout-0.4.0.0: tests/Hspec.hs

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"))