assert4hs-core-0.1.0: test/AssertionsSpec.hs
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wno-type-defaults #-}
module AssertionsSpec where
import AssertionSpecUtils (assertionMessage, testLocation)
import Data.Either (fromLeft, isRight)
import Data.Function ((&))
import Data.Maybe ()
import GHC.Stack
( SrcLoc
( SrcLoc
),
)
import Test.Fluent.Assertions
( contains,
defaultConfig,
hasSize,
isEmpty,
isEqualTo,
isGreaterEqualThan,
isGreaterThan,
isLowerEqualThan,
isLowerThan,
isNotEmpty,
isNotEqualTo,
setAssertionTimeout,
shouldSatisfy,
)
import Test.Fluent.Internal.Assertions
( FluentTestFailure (FluentTestFailure),
assertThat,
assertThat',
)
import Test.Hspec (Spec, describe, hspec, it, shouldBe)
main :: IO ()
main = hspec spec
spec :: Spec
spec = do
describe "chaining assertions" $ do
it "should accumulate errors" $ do
((startLine, endLine), res) <-
testLocation 1 $
assertThat "someString" $
isLowerThan "someString"
. isNotEqualTo "someString"
. isGreaterThan "someString"
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 3
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [ assertionMessage "given \"someString\" should be lower than \"someString\"" (startLine + 1) (endLine + 1),
assertionMessage "given \"someString\" should be not equal to \"someString\"" (startLine + 2) (endLine + 2),
assertionMessage "given \"someString\" should be greater than \"someString\"" (startLine + 3) (endLine + 3)
]
describe "failing assertions" $ do
it "isEqualTo should report correct message" $ do
((startLine, endLine), res) <-
testLocation 1 $
assertThat "someString" $
isEqualTo "otherString"
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 1
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [assertionMessage "given \"someString\" should be equal to \"otherString\"\n \9660 \9660\n\"someString\"\n\9591\n\9474\n\9589\n\"otherString\"\n \9650\9650 \9650\n" (startLine + 1) (endLine + 1)]
it "isNotEqualTo should report correct message" $ do
((startLine, endLine), res) <-
testLocation 1 $
assertThat "someString" $
isNotEqualTo "someString"
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 1
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [assertionMessage "given \"someString\" should be not equal to \"someString\"" (startLine + 1) (endLine + 1)]
it "isGreaterThan should report correct message" $ do
((startLine, endLine), res) <- testLocation 0 $ assertThat 5 $ isGreaterThan 6
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 1
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [assertionMessage "given 5 should be greater than 6" startLine endLine]
it "isGreaterEqualThan should report correct message" $ do
((startLine, endLine), res) <- testLocation 0 $ assertThat 5 $ isGreaterEqualThan 6
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 1
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [assertionMessage "given 5 should be greater or equal to 6" startLine endLine]
it "isLowerThan should report correct message" $ do
((startLine, endLine), res) <- testLocation 0 $ assertThat 5 $ isLowerThan 4
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 1
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [assertionMessage "given 5 should be lower than 4" startLine endLine]
it "isLowerEqualThan should report correct message" $ do
((startLine, endLine), res) <- testLocation 0 $ assertThat 5 $ isLowerEqualThan 4
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 1
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [assertionMessage "given 5 should be lower or equal to 4" startLine endLine]
it "shouldSatisfy should report correct message" $ do
((startLine, endLine), res) <- testLocation 0 $ assertThat 5 $ shouldSatisfy (< 5)
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 1
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [assertionMessage "given 5 does not met a predicate" startLine endLine]
it "hasSize should report correct message" $ do
((startLine, endLine), res) <- testLocation 0 $ assertThat [1 .. 7] $ hasSize 5
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 1
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [assertionMessage "expected size 5 is not equal actual size 7" startLine endLine]
it "isEmpty should report correct message" $ do
((startLine, endLine), res) <- testLocation 0 $ assertThat (Just 1) $ isEmpty
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 1
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [assertionMessage "should be empty, but is not" startLine endLine]
it "isNotEmpty should report correct message" $ do
((startLine, endLine), res) <- testLocation 0 $ assertThat Nothing $ isNotEmpty
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 1
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [assertionMessage "should be not empty" startLine endLine]
it "contains should report correct message" $ do
((startLine, endLine), res) <- testLocation 0 $ assertThat (Just 1) $ contains 10
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 1
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [assertionMessage "should contain element 10, but it doesn't" startLine endLine]
it "report timeout" $ do
let config = defaultConfig & setAssertionTimeout 100000
((startLine, endLine), res) <- testLocation 0 $ assertThat' config [0 ..] $ isEqualTo [0 ..]
isRight res `shouldBe` False
let (FluentTestFailure assertThatLoc messages erros success) = fromLeft undefined res
erros `shouldBe` 1
success `shouldBe` 0
assertThatLoc `shouldBe` Just (SrcLoc "main" "AssertionsSpec" "test/AssertionsSpec.hs" startLine 0 endLine 0)
messages
`shouldBe` [assertionMessage "Timeout occurred, probably some infinitive data structure or not terminating predicate has been used. Timeout: 0.1s" startLine endLine]
describe "success assertions" $ do
it "isEqualTo should report correct message" $ do
(_, res) <-
testLocation 1 $
assertThat "someString" $
isEqualTo "someString"
isRight res `shouldBe` True
it "isNotEqualTo should report correct message" $ do
(_, res) <-
testLocation 1 $
assertThat "someString" $
isNotEqualTo "otherString"
isRight res `shouldBe` True
it "isGreaterThan should report correct message" $ do
(_, res) <- testLocation 0 $ assertThat 5 $ isGreaterThan 4
isRight res `shouldBe` True
it "isGreaterEqualThan should report correct message" $ do
(_, res) <- testLocation 0 $ assertThat 5 $ isGreaterEqualThan 5
isRight res `shouldBe` True
it "isLowerThan should report correct message" $ do
(_, res) <- testLocation 0 $ assertThat 5 $ isLowerThan 6
isRight res `shouldBe` True
it "isLowerEqualThan should report correct message" $ do
(_, res) <- testLocation 0 $ assertThat 5 $ isLowerEqualThan 5
isRight res `shouldBe` True
it "shouldSatisfy should report correct message" $ do
(_, res) <- testLocation 0 $ assertThat 5 $ shouldSatisfy (> 4)
isRight res `shouldBe` True
it "hasSize should report correct message" $ do
(_, res) <- testLocation 0 $ assertThat [0 .. 4] $ hasSize 5
isRight res `shouldBe` True
it "isEmpty should report correct message" $ do
(_, res) <- testLocation 0 $ assertThat Nothing $ isEmpty
isRight res `shouldBe` True
it "isNotEmpty should report correct message" $ do
(_, res) <- testLocation 0 $ assertThat (Just 1) $ isNotEmpty
isRight res `shouldBe` True
it "contains should report correct message" $ do
(_, res) <- testLocation 0 $ assertThat (Just 10) $ contains 10
isRight res `shouldBe` True