1+ -- Run tests:
2+ --
3+ -- spago -x spago-dev.dhall test
4+ --
5+
16module Test.Main where
27
38import Prelude hiding (between , when )
@@ -16,17 +21,18 @@ import Data.Number (infinity, isNaN)
1621import Data.String.CodePoints as SCP
1722import Data.String.CodeUnits (fromCharArray , singleton )
1823import Data.String.CodeUnits as SCU
24+ import Data.String.Regex.Flags (RegexFlags , ignoreCase , noFlags )
1925import Data.Tuple (Tuple (..))
2026import Effect (Effect )
21- import Effect.Console (logShow )
27+ import Effect.Console (log , logShow )
2228import Partial.Unsafe (unsafePartial )
2329import Test.Assert (assert' )
2430import Parsing (ParseError (..), Parser , ParserT , fail , parseErrorMessage , parseErrorPosition , position , region , runParser )
2531import Parsing.Combinators (between , chainl , chainl1Rec , chainlRec , chainr1Rec , chainrRec , choice , endBy1 , endBy1Rec , endByRec , many1Rec , many1TillRec , many1TillRec_ , many1Till_ , manyTillRec , manyTillRec_ , manyTill_ , notFollowedBy , optionMaybe , sepBy1 , sepBy1Rec , sepByRec , sepEndBy1Rec , sepEndByRec , skipMany1Rec , skipManyRec , try , (<?>), (<??>), (<~?>))
2632import Parsing.Expr (Assoc (..), Operator (..), buildExprParser )
2733import Parsing.Language (haskellDef , haskellStyle , javaStyle )
2834import Parsing.Pos (Position (..), initialPos )
29- import Parsing.String (anyChar , anyCodePoint , char , eof , noneOfCodePoints , oneOfCodePoints , regex , rest , satisfy , string , takeN , whiteSpace )
35+ import Parsing.String (anyChar , anyCodePoint , char , eof , regex , noneOfCodePoints , oneOfCodePoints , rest , satisfy , string , takeN , whiteSpace )
3036import Parsing.String.Basic (intDecimal , number , letter )
3137import Parsing.Token (TokenParser , makeTokenParser , match , token , when )
3238import Parsing.Token as Parser.Token
@@ -94,6 +100,14 @@ manySatisfyTest = do
94100 _ <- char ' ?'
95101 pure (fromCharArray r)
96102
103+ mkRegexTest :: String -> String -> String -> RegexFlags -> (Parser String String -> Parser String String ) -> Effect Unit
104+ mkRegexTest input expected pattern flags pars =
105+ case regex pattern flags of
106+ Left err -> assert' (" error: " <> show err) false
107+ Right p -> parseTest input expected $ pars p
108+
109+ -- TODO everything is stack-safe now.
110+ --
97111-- This test doesn't test the actual stack safety of these combinators, mainly
98112-- because I don't know how to come up with an example guaranteed to be large
99113-- enough to overflow the stack. But thankfully, their stack safety is more or
@@ -559,6 +573,7 @@ javaStyleTest = do
559573main :: Effect Unit
560574main = do
561575
576+ log " \n TESTS String\n "
562577 parseErrorTestPosition
563578 (many $ char ' f' *> char ' ?' )
564579 " foo"
@@ -667,6 +682,8 @@ main = do
667682 parseErrorTestPosition (string " a\n b\n c\n " *> eof) " a\n b\n c\n d\n " (Position { column: 1 , line: 4 })
668683 parseErrorTestPosition (string " \t a" *> eof) " \t ab" (Position { column: 10 , line: 1 })
669684
685+ log " \n TESTS number\n "
686+
670687 parseTest " Infinity" infinity number
671688 parseTest " +Infinity" infinity number
672689 parseTest " -Infinity" (negate infinity) number
@@ -681,6 +698,7 @@ main = do
681698 parseTest " -6.0" (-6.0 ) number
682699 parseTest " +6.0" (6.0 ) number
683700
701+ log " \n TESTS Operator\n "
684702 -- test from issue #161
685703 -- all the below operators should play well together
686704 parseErrorTestMessage
@@ -749,24 +767,23 @@ main = do
749767 -- TODO This shows the current limitations of the number parser. Ideally this parse should fail.
750768 parseTest " 1..3" 1.0 $ number <* eof
751769
770+ log " \n TESTS intDecimal\n "
752771 parseTest " -300" (-300 ) intDecimal
753772
754- parseTest " regex-" " regex" (regex {} " regex" <* char ' -' <* eof)
755- parseTest " -regex" " regex" (char ' -' *> regex {} " regex" <* eof)
756- parseTest " regexregex" " regexregex" (regex {} " (regex)*" )
757- parseTest " regexregex" " regex" (regex {} " (^regex)*" )
758- parseTest " ReGeX" " ReGeX" (regex { ignoreCase: true } " regex" )
759- parseTest " regexcapregexcap" " regexcap" (regex {} " (?<CaptureGroupName>regexcap)" )
760- parseTest " regexcapregexcap" " regexcap" (regex {} " (((?<CaptureGroupName>(r)e(g)excap)))" )
761-
762- -- Maybe it is nonsense to allow multiline regex.
763- -- Because an end-of-line regex pattern `$` will match but then the
764- -- newline character will not be consumed.
765- -- Also why does this test fail? I think it should succeed.
766- -- parseTest "regex\nregex\n" "regex\nregex\n" (regex {dotAll: false, multiline: true} "(^regex$)+")
773+ log " \n TESTS Regex\n "
774+ mkRegexTest " regex-" " regex" " regex" noFlags (\regex -> regex <* char ' -' <* eof)
775+ mkRegexTest " -regex" " regex" " regex" noFlags (\regex -> char ' -' *> regex <* eof)
776+ mkRegexTest " regexregex" " regexregex" " (regex)*" noFlags identity
777+ mkRegexTest " regexregex" " regex" " (^regex)*" noFlags identity
778+ mkRegexTest " ReGeX" " ReGeX" " regex" ignoreCase identity
779+ mkRegexTest " regexcapregexcap" " regexcap" " (?<CaptureGroupName>regexcap)" noFlags identity
780+ mkRegexTest " regexcapregexcap" " regexcap" " (((?<CaptureGroupName>(r)e(g)excap)))" noFlags identity
767781
782+ log " \n TESTS Stack Safe Loops\n "
768783 stackSafeLoopsTest
769784
785+ log " \n TESTS Token Parser\n "
786+
770787 tokenParserIdentifierTest
771788 tokenParserReservedTest
772789 tokenParserOperatorTest
@@ -799,18 +816,21 @@ main = do
799816 tokenParserCommaSepTest
800817 tokenParserCommaSep1Test
801818
819+ log " \n TESTS Haskell Style\n "
802820 haskellStyleTest
821+ log " \n TESTS Java Style\n "
803822 javaStyleTest
804823
824+ log " \n TESTS region\n "
825+ let
826+ prependContext m' (ParseError m pos) = ParseError (m' <> m) pos
827+ p = region (prependContext " context1 " ) $ do
828+ _ <- string " a"
829+ region (prependContext " context2 " ) $ do
830+ string " b"
805831 case runParser " aa" p of
806832 Right _ -> assert' " error: ParseError expected!" false
807833 Left (ParseError message _) -> do
808834 let messageExpected = " context1 context2 Expected \" b\" "
809835 assert' (" expected message: " <> messageExpected <> " , message: " <> message) (message == messageExpected)
810836 logShow messageExpected
811- where
812- prependContext m' (ParseError m pos) = ParseError (m' <> m) pos
813- p = region (prependContext " context1 " ) $ do
814- _ <- string " a"
815- region (prependContext " context2 " ) $ do
816- string " b"
0 commit comments