module Main where import Prelude hiding (toList, choose) import GHC.Exts import Test.QuickCheck.Instances import Test.Tasty import Test.Tasty.Runners import Test.Tasty.HUnit import Test.Tasty.QuickCheck import qualified Test.QuickCheck as QuickCheck import qualified Test.QuickCheck.Property as QuickCheck import qualified DenseIntSet import qualified Data.HashSet as HashSet main = defaultMain $ testGroup "All" $ let setGen = listOf (choose (0, 99)) <&> HashSet.fromList listSetGen = setGen <&> HashSet.toList nonEmptyListOf gen = do length <- choose (1, 99) replicateM length gen in [ testProperty "List roundtrip" $ forAll listSetGen $ \ list -> sort list === sort (toList (fromList @DenseIntSet.DenseIntSet list)) , testProperty "Inversion" $ forAll listSetGen $ \ list -> let invertedList = enumFromTo 0 (foldl' max 0 list) \\ list in sort invertedList === sort (toList (DenseIntSet.invert (fromList list))) , testProperty "Union" $ forAll (listOf listSetGen) $ \ lists -> sort (foldr union [] lists) === sort (toList (DenseIntSet.unions (fmap fromList lists))) , testProperty "Intersection" $ forAll (nonEmptyListOf listSetGen) $ \ lists -> sort (foldl1' intersect lists) === sort (toList (DenseIntSet.intersections (fmap fromList lists))) ]