packages feed

hix-0.7.0: test/Hix/Test/BoundsTest.hs

module Hix.Test.BoundsTest where

import Distribution.Version (orEarlierVersion, orLaterVersion)
import Hedgehog (Gen, Property, forAll, property, (===))
import qualified Hedgehog.Gen as Gen
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.Hedgehog (testProperty)

import Hix.Class.Map (nAmend1, nForKeys, nFromKeys, nMap1, nPadKeep1)
import Hix.Data.Bounds (Ranges)
import qualified Hix.Data.Dep
import Hix.Data.Dep (Dep, mkDep, withVersion)
import Hix.Data.PackageName (LocalPackage, PackageName)
import Hix.Managed.Data.Packages (Deps, Packages)

packages :: [PackageName]
packages = ["dep1", "dep2", "dep3"]

targets :: [LocalPackage]
targets = ["target1", "target2", "target3"]

genBounds :: Gen Ranges
genBounds = do
  keys <- Gen.subsequence packages
  pure (nFromKeys keys (const dep))
  where
    dep = orEarlierVersion [2, 5]

genTargetBounds :: Gen (Packages Ranges)
genTargetBounds = do
  keys <- Gen.subsequence targets
  nForKeys keys (const genBounds)

genDeps :: Deps Dep
genDeps =
  nFromKeys packages \ k -> mkDep k (orLaterVersion [1, 5])

deps :: Packages (Deps Dep)
deps =
  nFromKeys targets (const genDeps)

prop_amendBounds :: Property
prop_amendBounds =
  property do
    bounds <- forAll genTargetBounds
    nPadKeep1 (.version) deps bounds === nMap1 (.version) (nAmend1 withVersion bounds deps)

test_bounds :: TestTree
test_bounds =
  testGroup "bounds" [
    testProperty "pad a b === amend b a (for padded a)" prop_amendBounds
  ]