65 lines
1.7 KiB
Haskell
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"
|