{-# OPTIONS_GHC -fno-warn-orphans #-}
module CyclicList (tests) where
import Data.Foldable (toList)
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.QuickCheck (Arbitrary (arbitrary, shrink), (===),
testProperty)
import Numeric.QuadraticIrrational.CyclicList
instance Arbitrary a => Arbitrary (CycList a) where
arbitrary = CycList <$> arbitrary <*> arbitrary
shrink (CycList as bs) = (CycList <$> pure as <*> shrink bs)
++ (CycList <$> shrink as <*> pure bs)
tests :: TestTree
tests =
testGroup "CyclicList"
[ testProperty "toList" . withListEquiv $ \asC asL ->
take 1000 (toList asC) === take 1000 asL
]
withListEquiv :: (CycList Integer -> [Integer] -> b) -> CycList Integer -> b
withListEquiv f cl@(CycList as bs) = f cl (as ++ if null bs then [] else cycle bs)