packages feed

mockcat-0.3.0.0: test/Test/MockCat/ParamSpec.hs

{-# LANGUAGE BlockArguments #-}
{-# OPTIONS_GHC -Wno-type-defaults #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE QuasiQuotes #-}
module Test.MockCat.ParamSpec (spec) where

import Prelude hiding (and, or)
import Test.Hspec
import Test.MockCat.Cons
import Test.MockCat.Param as P
import Test.MockCat.TH (expectByExpr)

spec :: Spec
spec = do
  describe "Param" do
    describe "|>" do
      it "a |> b" do
        True |> False `shouldBe` param True :> param False
      it "Param a |> b" do
        param True |> False `shouldBe` param True :> param False
      it "a |> Param b" do
        True |> param False `shouldBe` param True :> param False
      it "Param a |> Param b" do
        param True |> param False `shouldBe` param True :> param False
      it "a |> b |> c" do
        True |> False |> True `shouldBe` param True :> (param False :> param True)
      it "Param a |> b |> c" do
        param True |> False |> True `shouldBe` param True :> (param False :> param True)

    describe "Show" do
      it "String" do
        show (param "X") `shouldBe` "X"
      it "Integer" do
        show (param 100) `shouldBe` "100"
      it "Bool" do
        show (param False) `shouldBe` "False"

    describe "Eq" do
      it "param (eq)" do
        param 10 == param 10 `shouldBe` True
      it "param (not eq)" do
        param 10 == param 11 `shouldBe` False

    describe "Returns True if the expected value condition is met." do
      it "any" do
        (P.any :: Param Int) == param 10 `shouldBe` True

    describe "show expectation" do
      it "any" do
        show (P.any :: Param Int) `shouldBe` "any"

      it "expect" do
        show (expect (> 4) "> 4") `shouldBe` "> 4"

      it "expect_" do
        show (expect_ (> 4)) `shouldBe` "[some condition]"
    
    describe "show expectation by Exp" do
      it "(> 3)" do
        show $(expectByExpr [|(> 3)|]) `shouldBe` "(> 3)"

      it "lambda" do
        show $(expectByExpr [|\x -> x == 3 || x == 5|]) `shouldBe` "(\\x -> ((x == 3) || (x == 5)))"
      
      it "use data" do
        show $(expectByExpr [|\x -> x == Foo "foo"|]) `shouldBe` "(\\x -> (x == (Foo \"foo\")))"

data TestData = Foo String | Bar deriving (Eq, Show)