packages feed

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

{-# LANGUAGE BlockArguments #-}
{-# OPTIONS_GHC -Wno-type-defaults #-}
{-# LANGUAGE TemplateHaskell #-}
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
      it "any (non-Eq type)" do
        (P.any :: Param NoEq) == (P.any :: Param NoEq) `shouldBe` True
      it "ValueWrapper (non-Eq type) - same pointer matches" do
        P.wrapResult NoEq == P.wrapResult NoEq `shouldBe` True

    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"

      -- Type inference works for numeric literals and operators without explicit annotations.
      it "expect" do
        show (expect (> 4) "> 4") `shouldBe` "> 4"

      it "expect_" do
        show (expect_ (> 4)) `shouldBe` "[some condition]"

      it "param 10" do
        show (param 10) `shouldBe` "10"

    describe "show expectation by Exp" do
      it "(> 3)" do
        show $(expectByExpr [|(> (3 :: Int))|]) `shouldBe` "(> 3)"

      it "lambda" do
        show $(expectByExpr [|\x -> x == (3 :: Int) || x == 5|]) `shouldBe` "(\\x -> ((x == 3) || (x == 5)))"

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

    describe "ProjectionArgs" do
      it "Param a :> Param r" do
        projArgs (param 10 :> param "foo") `shouldBe` param 10
      it "Param a :> rest" do
        projArgs (param 10 :> param "foo" :> param True) `shouldBe` (param 10 :> param "foo")

    describe "ProjectionReturn" do
      it "Param a :> Param r" do
        projReturn (param 10 :> param "foo") `shouldBe` param "foo"
      it "Param a :> rest" do
        projReturn (param 10 :> param "foo" :> param True) `shouldBe` param True

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

data NoEq = NoEq deriving (Show)