packages feed

cabal-cache-1.0.0.2: test/HaskellWorks/CabalCache/Data/RelationSpec.hs

{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE OverloadedStrings #-}
module HaskellWorks.CabalCache.Data.RelationSpec
  ( spec
  ) where

import HaskellWorks.CabalCache.Data.Relation (Relation (Relation))
import HaskellWorks.Hspec.Hedgehog
import Hedgehog
import Test.Hspec

import qualified Data.List                             as L
import qualified Data.Map                              as M
import qualified Data.Set                              as S
import qualified HaskellWorks.CabalCache.Data.Relation as R
import qualified Hedgehog.Gen                          as G
import qualified Hedgehog.Range                        as R

{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}
{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}
{-# ANN module ("HLint: ignore Redundant bracket"   :: String) #-}

spec :: Spec
spec = describe "HaskellWorks.Assist.Data.RelationSpec" $ do
  it "List roundtrip" $ require $ property $ do
    as <- forAll $ G.list (R.linear 0 10) $ (,)
      <$> G.int R.constantBounded
      <*> G.alpha
    L.sort (R.toList (R.fromList as)) === L.sort as
  it "Full domain restriction" $ require $ property $ do
    as <- forAll $ G.list (R.linear 0 10) $ (,)
      <$> G.int R.constantBounded
      <*> G.alpha

    R.restrictDomain S.empty (R.fromList as) === R.empty
  it "Full range restriction" $ require $ property $ do
    as <- forAll $ G.list (R.linear 0 10) $ (,)
      <$> G.int R.constantBounded
      <*> G.alpha

    R.restrictRange S.empty (R.fromList as) === R.empty
  it "No domain restriction" $ require $ property $ do
    as <- forAll $ G.list (R.linear 0 10) $ (,)
      <$> G.int R.constantBounded
      <*> G.alpha
    let r = R.fromList as

    R.restrictDomain (R.domain r) r === r
  it "No range restriction" $ require $ property $ do
    as <- forAll $ G.list (R.linear 0 10) $ (,)
      <$> G.int R.constantBounded
      <*> G.alpha
    let r = R.fromList as
    R.restrictRange (R.range r) r === r
  it "Full domain without" $ require $ property $ do
    as <- forAll $ G.list (R.linear 0 10) $ (,)
      <$> G.int R.constantBounded
      <*> G.alpha
    let r = R.fromList as
    R.withoutDomain S.empty r === r
  it "Full range without" $ require $ property $ do
    as <- forAll $ G.list (R.linear 0 10) $ (,)
      <$> G.int R.constantBounded
      <*> G.alpha
    let r = R.fromList as
    R.withoutRange S.empty r === r
  it "No domain without" $ require $ property $ do
    as <- forAll $ G.list (R.linear 0 10) $ (,)
      <$> G.int R.constantBounded
      <*> G.alpha
    let r = R.fromList as

    R.withoutDomain (R.domain r) r === R.empty
  it "No range without" $ require $ property $ do
    as <- forAll $ G.list (R.linear 0 10) $ (,)
      <$> G.int R.constantBounded
      <*> G.alpha
    let r = R.fromList as
    R.withoutRange (R.range r) r === R.empty