assert4hs-core-0.1.0: src/Test/Fluent/Assertions/List.hs
{-# OPTIONS_HADDOCK show-extensions #-}
-- |
-- Module : Test.Fluent.Assertions.List
-- Description : Set of assertions for List type
-- Copyright : (c) Pawel Nosal, 2021
-- License : MIT
-- Maintainer : p.nosal1986@gmail.com
-- Stability : experimental
--
-- This library aims to provide a set of combinators to assert List type.
module Test.Fluent.Assertions.List where
import Data.List (isPrefixOf)
import GHC.Stack (HasCallStack)
import Test.Fluent.Assertions (Assertion, forceError, simpleAssertion)
import Test.Fluent.Diff (pretty)
-- | assert if given list has same length as expected list
--
-- @
-- assertThat [1..10] $ shouldHaveSameSizeAs [0..10]
-- @
shouldHaveSameSizeAs :: HasCallStack => [a] -> Assertion [a]
shouldHaveSameSizeAs expected = simpleAssertion predicate message
where
predicate given = length given == length expected
message given =
"should have same leght, but they don't. Given: "
<> show (length given)
<> " is not equal to expected "
<> show (length expected)
-- | verify if the given list has a length lower or equal to expected value
--
-- @
-- assertThat [1..10] $ shouldHaveSizeLowerOrEqual 10
-- @
shouldHaveSizeLowerOrEqual :: HasCallStack => Int -> Assertion [a]
shouldHaveSizeLowerOrEqual expected = simpleAssertion predicate message
where
predicate given = length given >= expected
message given =
"the lenght of given list is "
<> show (length given)
<> ", but should be lower or equal "
<> show expected
-- | verify if the given list has expected prefix
--
-- @
-- assertThat [1..10] $ shouldStartWith [0..4]
-- @
shouldStartWith :: (Eq a, Show a, HasCallStack) => [a] -> Assertion [a]
shouldStartWith expected = forceError (shouldHaveSizeLowerOrEqual expectedLenght) . simpleAssertion predicate message
where
predicate = (expected `isPrefixOf`)
expectedLenght = length expected
actualPrefix x = take expectedLenght x
message x =
"should start with "
<> show expected
<> ", but it start with "
<> show (actualPrefix x)
-- | verify if the given list does not start with prefix
--
-- @
-- assertThat [1..10] $ shouldNotStartWith [1..4]
-- @
shouldNotStartWith :: (Eq a, Show a, HasCallStack) => [a] -> Assertion [a]
shouldNotStartWith expected = simpleAssertion predicate message
where
predicate = not . (expected `isPrefixOf`)
message _ =
"should not start with "
<> show expected
<> ", but it does"
shouldBeSameAs :: (Eq a, HasCallStack, Show a) => [a] -> Assertion [a]
shouldBeSameAs expected = simpleAssertion predicate message
where
predicate = (== expected)
message given = "given list should be same as expected list, but is not.\n" <> pretty given expected
shouldContain :: (Eq a, HasCallStack, Show a) => a -> Assertion [a]
shouldContain expected = simpleAssertion predicate message
where
predicate = elem expected
message _ = "given list should contain element " <> show expected <> ", but it doesn't."
shouldNotContain :: (Eq a, HasCallStack, Show a) => a -> Assertion [a]
shouldNotContain expected = simpleAssertion predicate message
where
predicate = notElem expected
message _ = "given list should not contain element " <> show expected <> ", but it doesn."
-- | verify if the given list contains same elements as expected list in any order
--
-- @
-- assertThat [1..10] $ shouldNotStartWith [1..4]
-- @
shouldHaveSameElements :: (HasCallStack, Eq a, Show a) => [a] -> Assertion [a]
shouldHaveSameElements expected = forceError (shouldHaveSameSizeAs expected) . simpleAssertion predicate errorMessage
where
predicate given = all (`elem` expected) given
inGiven given = filter (`notElem` given) expected
inExpected given = filter (`notElem` expected) given
errorMessage given = "two lists should have same elements but:\n " ++ message
where
message = case (inGiven given, inExpected given) of
([], []) -> "bug in shouldHaveSameElements assertion, please report this to the maintainer"
(xs, ys) -> "given list don't have " ++ show xs ++ "\nexpected list don't have " ++ show ys