65 lines
1.7 KiB
Haskell

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"