hegel-0.1.0: conformance/TestLists.hs
{-# LANGUAGE OverloadedStrings #-}
-- | Conformance binary: generates lists of integers and writes metrics.
--
-- Uses filtered elements (CompositeList path) so that new_collection and
-- collection_more commands are sent -- required for error-mode conformance
-- tests (stop_test_on_collection_more, stop_test_on_new_collection).
module Main (main) where
import qualified Data.Aeson as Aeson
import Data.Aeson (Value (..))
import qualified Data.ByteString.Lazy.Char8 as LBS
import Data.Maybe (fromMaybe, listToMaybe)
import qualified Data.Map.Strict as Map
import Hegel
import System.Environment (getArgs)
parseParams :: IO (Map.Map String Value)
parseParams = do
args <- getArgs
pure $
fromMaybe Map.empty $
Aeson.decode . LBS.pack =<< listToMaybe args
getIntParam :: Map.Map String Value -> String -> Maybe Int
getIntParam m k = round <$> (getNumber =<< Map.lookup k m)
where
getNumber (Number n) = Just n
getNumber _ = Nothing
intOrNull :: Maybe Int -> String
intOrNull = maybe "null" show
main :: IO ()
main = do
params <- parseParams
let minSize = getIntParam params "min_size"
let maxSize = getIntParam params "max_size"
let minVal = getIntParam params "min_value"
let maxVal = getIntParam params "max_value"
testCases <- getTestCases
runHegelTest (\settings -> settings { settingsTestCases = testCases }) $ \tc -> do
-- Use gfilter (const True) to force the CompositeList path, which sends
-- new_collection and collection_more commands. This is required so that
-- the error-mode conformance tests (stop_test_on_collection_more,
-- stop_test_on_new_collection) work correctly.
let elemGen = gfilter (const True) (integers def { rangeMin = minVal, rangeMax = maxVal })
let listGen = lists elemGen def { rangeMin = minSize, rangeMax = maxSize }
items <- draw tc listGen
let len = length items
let minElem = if null items then Nothing else Just (minimum items)
let maxElem = if null items then Nothing else Just (maximum items)
writeMetrics
[ ("size", show len),
("min_element", intOrNull minElem),
("max_element", intOrNull maxElem)
]