{-# LANGUAGE OverloadedStrings #-} module Range.Test ( testTree ) where import Control.Monad (join) import Hedgehog hiding (Range) import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range import Source.Range import qualified Test.Tasty as Tasty import Test.Tasty.Hedgehog (testPropertyNamed) testTree :: Tasty.TestTree testTree = Tasty.testGroup "Source.Range" [ Tasty.testGroup "Semigroup" [ testPropertyNamed "associativity" "Range_associativity" . property $ do (a, b, c) <- forAll ((,,) <$> range <*> range <*> range) a <> (b <> c) === (a <> b) <> c ] ] range :: MonadGen m => m Range range = Gen.choice [ empty, nonEmpty ] where point = Gen.int (Range.linear 0 100) empty = join Range <$> point nonEmpty = do start <- point length <- point pure $! Range start (start + length + 1)