1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
{-# OPTIONS_GHC -fno-warn-missing-fields #-}
{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}
{-# OPTIONS_GHC -fno-warn-missing-methods #-}
{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}
{-# OPTIONS_GHC -O0 #-}
module Test.Hspec.Core.Example.LocationSpec (spec) where
import Prelude ()
import Helper
import Test.Hspec.Core.Example
import Test.Hspec.Core.Example.Location
class SomeClass a where
someMethod :: a -> IO ()
instance SomeClass () where
data Person = Person {
name :: String
, age :: Int
} deriving (Eq, Show)
spec :: Spec
spec = do
describe "parseAssertionFailed" $ do
context "with pre-GHC-8.* error message" $ do
it "extracts source location" $ do
parseAssertionFailed "Foo.hs:4:7-12: Assertion failed\n" `shouldBe` Just (Location "Foo.hs" 4 7)
describe "extractLocation" $ do
context "with pattern match failure in do expression" $ do
context "in IO" $ do
it "extracts Location" $ do
let location = Just $ Location file (__LINE__ + 2) 13
Left e <- try $ do
Just n <- return Nothing
return (n :: Int)
extractLocation e `shouldBe` location
#if !MIN_VERSION_base(4,12,0)
context "in Either" $ do
it "extracts Location" $ do
let location = Just $ Location file (__LINE__ + 4) 15
let
foo :: Either () ()
foo = do
23 <- Right (42 :: Int)
pass
Left e <- try (evaluate foo)
extractLocation e `shouldBe` location
#endif
context "with ErrorCall" $ do
it "extracts Location" $ do
let
location =
Just $ Location file (succ __LINE__) 34
Left e <- try (evaluate (undefined :: ()))
extractLocation e `shouldBe` location
context "with PatternMatchFail" $ do
context "with single-line source span" $ do
it "extracts Location" $ do
let
location = Just $ Location file (__LINE__ + 1) 40
Left e <- try (evaluate (let Just n = Nothing in (n :: Int)))
extractLocation e `shouldBe` location
context "with multi-line source span" $ do
it "extracts Location" $ do
let location = Just $ Location file (__LINE__ + 1) 36
Left e <- try (evaluate (case Nothing of
Just n -> n :: Int
))
extractLocation e `shouldBe` location
context "with RecConError" $ do
it "extracts Location" $ do
let
location = Just $ Location file (__LINE__ + 1) 39
Left e <- try $ evaluate (age Person {name = "foo"})
extractLocation e `shouldBe` location
context "with NoMethodError" $ do
it "extracts Location" $ do
Left e <- try $ someMethod ()
extractLocation e `shouldBe` Just (Location file 19 10)
context "with AssertionFailed" $ do
it "extracts Location" $ do
let
location = Just $ Location file (__LINE__ + 1) 36
Left e <- try . evaluate $ assert False ()
extractLocation e `shouldBe` location
describe "parseCallStack" $ do
it "parses Location from call stack" $ do
let input = unlines [
"CallStack (from HasCallStack):"
, " error, called at libraries/base/GHC/Err.hs:79:14 in base:GHC.Err"
, " undefined, called at test/Test/Hspec.hs:13:32 in main:Test.Hspec"
]
parseCallStack input `shouldBe` Just (Location ("test" </> "Test" </> "Hspec.hs") 13 32)
describe "parseLocation" $ do
it "parses Location" $ do
parseLocation "test/Test/Hspec.hs:13:32" `shouldBe` Just (Location ("test" </> "Test" </> "Hspec.hs") 13 32)
describe "parseSourceSpan" $ do
it "parses single-line source span" $ do
parseSourceSpan "test/Test/Hspec.hs:25:36-51:" `shouldBe` Just (Location ("test" </> "Test" </> "Hspec.hs") 25 36)
it "parses multi-line source span" $ do
parseSourceSpan "test/Test/Hspec.hs:(15,7)-(17,26):" `shouldBe` Just (Location ("test" </> "Test" </> "Hspec.hs") 15 7)
file :: FilePath
file = workaroundForIssue19236 __FILE__
|