import Test.Tasty import Test.Tasty.QuickCheck as QuickCheck import Data.Fixed import Data.List -- import Test.Tasty.HUnit as HUnit import System.Clock instance Arbitrary TimeSpec where arbitrary = do sec <- arbitrarySizedIntegral nan <- arbitrarySizedIntegral return $ TimeSpec sec nan main = defaultMain (adjustOption (QuickCheckTests 100000 +) $ tests) tests :: TestTree tests = testGroup "All tests" [numInstanceTests, eqOrdInstancesTests] numInstanceTests = testGroup "Num class tests" [ -- let's make at least 100,000 tests qcNumInstance ] eqOrdInstancesTests = testGroup "Eq and Ord instance tests" [ -- let's make at least 100,000 tests qcEqOrdInstance ] qcNumInstance = testGroup "QuickCheck" [ QuickCheck.testProperty "x = abs(x) * signum(x)" $ \ x -> (x :: TimeSpec) == (abs x) * (signum x) , QuickCheck.testProperty "integer addition equals TimeSpec addition" $ \ x y -> x + y == timeSpecAsNanoSecs (fromInteger x + fromInteger y) , QuickCheck.testProperty "integer substraction equals TimeSpec addition" $ \ x y -> x - y == timeSpecAsNanoSecs (fromInteger x - fromInteger y) , QuickCheck.testProperty "rational multiplication equals TimeSpec multiplication" $ \ x y -> let rationalMul = truncate ((x :: Nano) * (y :: Nano) * (10^9)) timespecMul = timeSpecAsNanoSecs ( fromInteger (truncate (x * 10^9)) * fromInteger (truncate (y * 10^9))) in rationalMul == timespecMul , QuickCheck.testProperty "neg(neg(x)) = x" $ \ x -> negate (negate x :: TimeSpec) == x ] qcEqOrdInstance = testGroup "QuickCheck" [ QuickCheck.testProperty "random list of TimeSpecs is sorted like equivalent list of integers" $ \ x -> sort (x :: [TimeSpec]) == map (fromInteger) (sort (map timeSpecAsNanoSecs x)) ]