@@ -7,6 +7,7 @@ module Text.Megaparsec.UtilsSpec
7
7
import Control.Applicative (some )
8
8
import Control.Applicative.Combinators (choice )
9
9
import Control.Monad (void )
10
+ import Data.Bifunctor (first )
10
11
import Data.Char (isAlphaNum , toUpper )
11
12
import Data.Either (isLeft )
12
13
import Data.List (intercalate )
@@ -19,7 +20,8 @@ import Test.Hspec (Expectation, Spec, SpecWith,
19
20
import Test.QuickCheck (Arbitrary (.. ), Gen , elements ,
20
21
forAll , listOf , listOf1 ,
21
22
property , suchThat )
22
- import Text.Megaparsec (Parsec , eof , parseMaybe ,
23
+ import Text.Megaparsec (Parsec , eof ,
24
+ errorBundlePretty , parseMaybe ,
23
25
runParser )
24
26
import Text.Megaparsec.Char (alphaNumChar , char , digitChar ,
25
27
string )
@@ -101,6 +103,12 @@ exhaustive f = foldl1 (>>) $ mkIt <$> values
101
103
instance Arbitrary a => Arbitrary (NonEmpty a ) where
102
104
arbitrary = (:|) <$> arbitrary <*> arbitrary
103
105
106
+ parseOrPrettyError
107
+ :: Parsec Void String a
108
+ -> String
109
+ -> Either String a
110
+ parseOrPrettyError p = first errorBundlePretty . runParser p " test"
111
+
104
112
spec :: Spec
105
113
spec = do
106
114
describe " parsers" $ do
@@ -146,57 +154,57 @@ spec = do
146
154
describe " occurrence" $ do
147
155
it " SomeData" . forAll input $ \ (prefix, v, suffix) -> do
148
156
let s = unwords [prefix, show (v :: SomeData ), suffix]
149
- runParser (occurrence someDataParser) " test " s `shouldBe` Right v
157
+ parseOrPrettyError (occurrence someDataParser) s `shouldBe` Right v
150
158
151
159
it " SomeEnum" . forAll input $ \ (prefix, v, suffix) -> do
152
160
let s = unwords [prefix, show (v :: SomeEnum ), suffix]
153
- runParser (occurrence someEnumParser) " test " s `shouldBe` Right v
161
+ parseOrPrettyError (occurrence someEnumParser) s `shouldBe` Right v
154
162
155
163
it " SomeADT" . forAll input $ \ (prefix, v, suffix) -> do
156
164
let s = unwords [prefix, show (v :: SomeADT ), suffix]
157
- runParser (occurrence someADTParser) " test " s `shouldBe` Right v
165
+ parseOrPrettyError (occurrence someADTParser) s `shouldBe` Right v
158
166
159
167
describe " occurrences" $ do
160
168
it " SomeData" . forAll input $ \ (prefix, v, suffix) -> do
161
169
let s = unwords [prefix, show (v :: SomeData ), suffix]
162
- runParser (occurrences someDataParser) " test " s `shouldBe` Right [v]
170
+ parseOrPrettyError (occurrences someDataParser) s `shouldBe` Right [v]
163
171
164
172
context " SomeEnum" $ do
165
173
it " words" . forAll input $ \ (prefix, v, suffix) -> do
166
174
let s = unwords [prefix, show (v :: SomeEnum ), suffix]
167
- runParser (occurrences someEnumParser) " test " s `shouldBe` Right [v]
175
+ parseOrPrettyError (occurrences someEnumParser) s `shouldBe` Right [v]
168
176
169
177
it " with partial" $
170
- runParser (occurrences someEnumParser) " test " " a [Some] SomeA yo" `shouldBe`
178
+ parseOrPrettyError (occurrences someEnumParser) " a [Some] SomeA yo" `shouldBe`
171
179
Right [SomeA ]
172
180
173
181
it " SomeADT" . forAll input $ \ (prefix, v, suffix) -> do
174
182
let s = unwords [prefix, show (v :: SomeADT ), suffix]
175
- runParser (occurrences someADTParser) " test " s `shouldBe` Right [v]
183
+ parseOrPrettyError (occurrences someADTParser) s `shouldBe` Right [v]
176
184
177
185
describe " comma-separated" $ do
178
186
context " valid" $ do
179
187
it " single" . property $ \ x -> do
180
188
let y = abs x
181
- runParser (commaSeparated numParser) " test " (show y)
189
+ parseOrPrettyError (commaSeparated numParser) (show y)
182
190
`shouldBe` Right (y :| [] )
183
191
184
192
it " multiple" . property $ \ xs -> do
185
193
let ys = fmap abs xs
186
194
s = intercalate " ," . map show $ N. toList ys
187
- runParser (commaSeparated numParser) " test " s
195
+ parseOrPrettyError (commaSeparated numParser) s
188
196
`shouldBe` Right ys
189
197
190
198
context " invalid" $ do
191
199
it " empty" $
192
- runParser (commaSeparated numParser) " test " " " `shouldSatisfy` isLeft
200
+ parseOrPrettyError (commaSeparated numParser) " " `shouldSatisfy` isLeft
193
201
194
202
it " first" $
195
- runParser (commaSeparated numParser) " test" " abc,42 " `shouldSatisfy` isLeft
203
+ parseOrPrettyError (commaSeparated numParser) " test" `shouldSatisfy` isLeft
196
204
197
205
it " first partially correct" $
198
- runParser (commaSeparated (numParser <* eof)) " test" " 42abc,42 "
206
+ parseOrPrettyError (commaSeparated (numParser <* eof)) " test"
199
207
`shouldSatisfy` isLeft
200
208
201
209
it " second" $
202
- runParser (commaSeparated numParser) " test" " 42,abc " `shouldSatisfy` isLeft
210
+ parseOrPrettyError (commaSeparated numParser) " test" `shouldSatisfy` isLeft
0 commit comments