@@ -13,7 +13,7 @@ import Control.Monad.State (State, lift, modify, runState)
13
13
import Data.Array (some , toUnfoldable )
14
14
import Data.Array as Array
15
15
import Data.Bifunctor (lmap , rmap )
16
- import Data.Either (Either (..), either , hush )
16
+ import Data.Either (Either (..), either , fromLeft , hush )
17
17
import Data.Foldable (oneOf )
18
18
import Data.List (List (..), fromFoldable , (:))
19
19
import Data.List.NonEmpty (NonEmptyList (..), catMaybes , cons , cons' )
@@ -34,12 +34,13 @@ import Effect.Console (log, logShow)
34
34
import Effect.Unsafe (unsafePerformEffect )
35
35
import Node.Process (lookupEnv )
36
36
import Parsing (ParseError (..), ParseState (..), Parser , ParserT , Position (..), consume , fail , getParserT , initialPos , parseErrorMessage , parseErrorPosition , position , region , runParser )
37
- import Parsing.Combinators (advance , between , chainl , chainl1 , chainr , chainr1 , choice , empty , endBy , endBy1 , lookAhead , many , many1 , many1Till , many1Till_ , manyIndex , manyTill , manyTill_ , notFollowedBy , optionMaybe , sepBy , sepBy1 , sepEndBy , sepEndBy1 , skipMany , skipMany1 , try , (<?>), (<??>), (<~?>))
37
+ import Parsing.Combinators (advance , between , chainl , chainl1 , chainr , chainr1 , choice , empty , endBy , endBy1 , lookAhead , many , many1 , many1Till , many1Till_ , manyIndex , manyTill , manyTill_ , notFollowedBy , optionMaybe , replicateA , sepBy , sepBy1 , sepEndBy , sepEndBy1 , skipMany , skipMany1 , try , (<?>), (<??>), (<~?>))
38
38
import Parsing.Combinators.Array as Combinators.Array
39
39
import Parsing.Expr (Assoc (..), Operator (..), buildExprParser )
40
40
import Parsing.Language (haskellDef , haskellStyle , javaStyle )
41
- import Parsing.String (anyChar , anyCodePoint , anyTill , char , eof , match , regex , rest , satisfy , string , takeN )
41
+ import Parsing.String (anyChar , anyCodePoint , anyTill , char , eof , match , parseErrorHuman , regex , rest , satisfy , string , takeN )
42
42
import Parsing.String.Basic (intDecimal , letter , noneOfCodePoints , number , oneOfCodePoints , skipSpaces , whiteSpace )
43
+ import Parsing.String.Basic as String.Basic
43
44
import Parsing.String.Replace (breakCap , replace , replaceT , splitCap , splitCapT )
44
45
import Parsing.Token (TokenParser , makeTokenParser , token , when )
45
46
import Parsing.Token as Token
@@ -1070,3 +1071,38 @@ main = do
1070
1071
{ actual: lmap parseErrorPosition $ runParser " aa" $ advance consume
1071
1072
, expected: Left (Position { index: 0 , line: 1 , column: 1 })
1072
1073
}
1074
+
1075
+ log " \n TESTS error messages\n "
1076
+ do
1077
+ let input = " 12345six789"
1078
+ assertEqual' " parseErrorHuman 1"
1079
+ { actual: Array .drop 1 $ parseErrorHuman input 20 $ fromLeft (ParseError " " initialPos)
1080
+ $ runParser input (replicateA 9 String.Basic .digit :: Parser String (List Char ))
1081
+ , expected: [ " ▼" , " 12345six789" ]
1082
+ }
1083
+
1084
+ do
1085
+ let input = " 12345six789"
1086
+ assertEqual' " parseErrorHuman 2"
1087
+ { actual: Array .drop 1 $ parseErrorHuman input 5 $ fromLeft (ParseError " " initialPos)
1088
+ $ runParser input (replicateA 9 String.Basic .digit :: Parser String (List Char ))
1089
+ , expected: [ " ▼" , " 45six" ]
1090
+ }
1091
+
1092
+ do
1093
+ let input = " aaaa🍷\r\n bbbb"
1094
+ assertEqual' " parseErrorHuman 3"
1095
+ { actual: parseErrorHuman input 20 $ fromLeft (ParseError " " initialPos)
1096
+ $ runParser input
1097
+ $ string " aaaa" *> (replicateA 7 letter :: Parser String (List Char ))
1098
+ , expected: [ " Expected letter at position index:4 (line:1, column:5)" , " ▼" , " aaaa🍷" ]
1099
+ }
1100
+
1101
+ do
1102
+ let input = " aaaa\r\n 🍷bbbb"
1103
+ assertEqual' " parseErrorHuman 4"
1104
+ { actual: parseErrorHuman input 20 $ fromLeft (ParseError " " initialPos)
1105
+ $ runParser input
1106
+ $ string " aaaa\r\n " *> (replicateA 5 letter :: Parser String (List Char ))
1107
+ , expected: [ " Expected letter at position index:6 (line:2, column:1)" , " ▼" , " 🍷bbbb" ]
1108
+ }
0 commit comments