@@ -13,7 +13,7 @@ import Control.Monad.State (State, lift, modify, runState)
1313import Data.Array (some , toUnfoldable )
1414import Data.Array as Array
1515import Data.Bifunctor (lmap , rmap )
16- import Data.Either (Either (..), either , hush )
16+ import Data.Either (Either (..), either , fromLeft , hush )
1717import Data.Foldable (oneOf )
1818import Data.List (List (..), fromFoldable , (:))
1919import Data.List.NonEmpty (NonEmptyList (..), catMaybes , cons , cons' )
@@ -34,12 +34,13 @@ import Effect.Console (log, logShow)
3434import Effect.Unsafe (unsafePerformEffect )
3535import Node.Process (lookupEnv )
3636import 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 , (<?>), (<??>), (<~?>))
3838import Parsing.Combinators.Array as Combinators.Array
3939import Parsing.Expr (Assoc (..), Operator (..), buildExprParser )
4040import 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 )
4242import Parsing.String.Basic (intDecimal , letter , noneOfCodePoints , number , oneOfCodePoints , skipSpaces , whiteSpace )
43+ import Parsing.String.Basic as String.Basic
4344import Parsing.String.Replace (breakCap , replace , replaceT , splitCap , splitCapT )
4445import Parsing.Token (TokenParser , makeTokenParser , token , when )
4546import Parsing.Token as Token
@@ -1070,3 +1071,38 @@ main = do
10701071 { actual: lmap parseErrorPosition $ runParser " aa" $ advance consume
10711072 , expected: Left (Position { index: 0 , line: 1 , column: 1 })
10721073 }
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