module TestSupport ( assertLeft , expectEvalWith , expectParseWith , expectEvalEquals , strictlyAscending , withinBoundsInt ) where import Test.Tasty.HUnit (Assertion, assertFailure) assertLeft :: Either String a -> Assertion assertLeft e = case e of Left _ -> pure () Right _ -> assertFailure "expected Left" expectParseWith :: String -> (input -> Either String a) -> input -> IO a expectParseWith label parser input = case parser input of Left err -> assertFailure (label <> " parse failed: " <> err) Right value -> pure value expectEvalWith :: String -> (expr -> Either String result) -> expr -> IO result expectEvalWith label evaluator expr = case evaluator expr of Left err -> assertFailure (label <> " evaluate failed: " <> err) Right value -> pure value expectEvalEquals :: (Eq a, Show a) => [a] -> Either String [a] -> Assertion expectEvalEquals expected evalResult = case evalResult of Left err -> assertFailure err Right xs -> if xs == expected then pure () else assertFailure ("expected " <> show expected <> ", got " <> show xs) withinBoundsInt :: Int -> Int -> [Int] -> Bool withinBoundsInt lo hi = all (\x -> x >= lo && x <= hi) strictlyAscending :: Ord a => [a] -> Bool strictlyAscending [] = True strictlyAscending [_] = True strictlyAscending (x : y : rest) = x < y && strictlyAscending (y : rest)