packages feed

lr-acts-0.0: test/Spec.hs

{-# LANGUAGE TypeOperators  #-}
{-# LANGUAGE DataKinds      #-}
{-# LANGUAGE DataKinds      #-}
{-# LANGUAGE OverloadedLabels #-}

import Test.Hspec
import Test.QuickCheck

import Data.Monoid
import Data.Act

import qualified Data.Semidirect.Lazy as Lazy
import qualified Data.Semidirect.Strict as Strict

main :: IO ()
main = hspec $ do
  describe "Semidirect" $ do
    describe "LSemidirect" $ do
      describe "Lazy" $ do
        it "Product on Sum Semigroup" $ property $
          \x s y t ->
            Lazy.LSemidirect (Sum (x :: Int)) (Product (s :: Int))
            <> Lazy.LSemidirect (Sum y) (Product t)
            `shouldBe`
            Lazy.LSemidirect (Sum (x + s*y)) (Product (s*t))
        it "Product on Sum Monoid" $
          mempty `shouldBe`
            Lazy.LSemidirect (mempty :: Sum Int) (mempty :: Product Int)
      describe "Strict" $ do
        it "Product on Sum Semigroup" $ property $
          \x s y t ->
            Strict.LSemidirect (Sum (x :: Int)) (Product (s :: Int))
            <> Strict.LSemidirect (Sum y) (Product t)
            `shouldBe`
            Strict.LSemidirect (Sum (x + s*y)) (Product (s*t))
        it "Product on Sum Monoid" $
          mempty `shouldBe`
            Strict.LSemidirect (mempty :: Sum Int) (mempty :: Product Int)
    describe "RSemidirect" $ do
      describe "Lazy" $ do
        it "Product on Sum Semigroup" $ property $
          \x s y t ->
            Lazy.RSemidirect (Sum (x :: Int)) (Product (s :: Int))
            <> Lazy.RSemidirect (Sum y) (Product t)
            `shouldBe`
            Lazy.RSemidirect (Sum (x + s*y)) (Product (s*t))
        it "Product on Sum Monoid" $
          mempty `shouldBe`
            Lazy.RSemidirect (mempty :: Sum Int) (mempty :: Product Int)
      describe "Strict" $ do
        it "Product on Sum Semigroup" $ property $
          \x s y t ->
            Strict.RSemidirect (Sum (x :: Int)) (Product (s :: Int))
            <> Strict.RSemidirect (Sum y) (Product t)
            `shouldBe`
            Strict.RSemidirect (Sum (x + s*y)) (Product (s*t))
        it "Product on Sum Monoid" $
          mempty `shouldBe`
            Strict.RSemidirect (mempty :: Sum Int) (mempty :: Product Int)

  describe "Action" $ do
    describe "ActSelf" $ do
      it "Int acts on unit" $ property $
        \x -> (x :: Int) <>$ () `shouldBe` ()
      it "Unit acts on char" $ property $
        \x -> () <>$ (x :: Char) `shouldBe` x