module Main where import MiniWindows.Normalize ( Window (Window) , coversMinute , isNormalized , normalizeWindows ) import System.Exit (die) import Test.QuickCheck ( Gen , Property , chooseInt , forAll , isSuccess , listOf , quickCheckResult ) newtype WindowList = WindowList [Window] deriving (Show) genWindow :: Gen Window genWindow = do startMinute <- chooseInt (0, 59) endMinute <- chooseInt (startMinute + 1, 60) pure (Window startMinute endMinute) genWindowList :: Gen WindowList genWindowList = WindowList <$> listOf genWindow prop_exampleMerge :: Bool prop_exampleMerge = normalizeWindows [Window 0 10, Window 8 14, Window 20 24, Window 24 30] == [Window 0 14, Window 20 30] prop_idempotent :: Property prop_idempotent = forAll genWindowList $ \(WindowList windows) -> normalizeWindows (normalizeWindows windows) == normalizeWindows windows prop_resultIsNormalized :: Property prop_resultIsNormalized = forAll genWindowList $ \(WindowList windows) -> isNormalized (normalizeWindows windows) prop_preservesCoverage :: Property prop_preservesCoverage = forAll genWindowList $ \(WindowList windows) -> all (\minute -> coversMinute minute windows == coversMinute minute (normalizeWindows windows)) [0 .. 60] main :: IO () main = do exampleResult <- quickCheckResult prop_exampleMerge idempotentResult <- quickCheckResult prop_idempotent normalizedResult <- quickCheckResult prop_resultIsNormalized coverageResult <- quickCheckResult prop_preservesCoverage if all isSuccess [exampleResult, idempotentResult, normalizedResult, coverageResult] then putStrLn "test passed" else die "unexpected QuickCheck result"