packages feed

holeyexp-0.3.0.1: test/Data/HoleyExp/HExpInternalSpec.hs

{-|
Module      : HExpInternalSpec
Description : Testing spec for the holey expressions API
Copyright   : (c) Harley Eades, 2026
              (c) W⋊B, 2026
Maintainer  : harley.eades@gmail.com

Various properties of the holey-expressions API.
-}
module  Data.HoleyExp.HExpInternalSpec (spec) where

import Data.HoleyExp.HExpInternal
import Data.HoleyExp.Text
import Test.QuickCheck.HExp                ()

import Test.Hspec            
import Test.Helpers                        (parseTest)
import Test.QuickCheck                     (Property
                                           ,Testable (property))
import Test.Hspec.QuickCheck               (prop)
import Test.Helpers                        (UnitTest(..)
                                           ,test_case)

spec :: Spec 
spec = do
    describe "QuickCheck properties:" $ do        
        describe "composition" $ do
            prop "associativity" $
                prop_associativeCompose
            prop "identity" $
                prop_identityCompose
    describe "Unit Tests:" $ do
        describe "Parsing:" $ do
            describe "Holes:" $ do
                test_case "no index"                 test_parseFail1
                test_case "negative index"           test_parseFail2
                test_case "no opening paren"         test_parseFail3
                test_case "no closing paren"         test_parseFail4
                test_case "non-escaped paren"        test_parseFail5
                test_case "non-escaped backslash"    test_parseFail6
                test_case "filling in unit hole"     test_parseFail7

prop_associativeCompose 
    :: HExp Text Text
    -> HExp Text Text
    -> HExp Text Text
    -> Property
prop_associativeCompose t1 t2 t3 = property $ 
    t1 +> (t2 +> t3) == (t1 +> t2) +> t3

prop_identityCompose 
    :: HExp Text Text
    -> Property
prop_identityCompose t = property $ 
    (emptyExp +> t) == t && (t +> emptyExp) == t

testParseHExp :: Parser (HExp Text Text)
testParseHExp = hExpParser

testParseUnitHExp :: Parser (HExp Text ())
testParseUnitHExp = hExpParser

test_parseFail1 :: UnitTest (Maybe (HExp Text Text))
test_parseFail1 = UnitTest {
         test_result=parseTest testParseHExp "foo$(a)"
        ,test_output=Nothing
    }

test_parseFail2 :: UnitTest (Maybe (HExp Text Text))
test_parseFail2 = UnitTest {
         test_result=parseTest testParseHExp "foo$-1(a)"
        ,test_output=Nothing
    }

test_parseFail3 :: UnitTest (Maybe (HExp Text Text))
test_parseFail3 = UnitTest {
         test_result=parseTest testParseHExp "foo$1a)bar"
        ,test_output=Nothing
    }

test_parseFail4 :: UnitTest (Maybe (HExp Text Text))
test_parseFail4 = UnitTest {
         test_result=parseTest testParseHExp "foo$1(abar"
        ,test_output=Nothing
    }

test_parseFail5 :: UnitTest (Maybe (HExp Text Text))
test_parseFail5 = UnitTest {
         test_result=parseTest testParseHExp "foo$1((a)bar"
        ,test_output=Nothing
    }

test_parseFail6 :: UnitTest (Maybe (HExp Text Text))
test_parseFail6 = UnitTest {
         test_result=parseTest testParseHExp "foo$1(\\a)bar"
        ,test_output=Nothing
    }

test_parseFail7 :: UnitTest (Maybe (HExp Text ()))
test_parseFail7 = UnitTest {
         test_result=parseTest testParseUnitHExp "foo$1(aa)bar"
        ,test_output=Nothing
    }