1
+ -- Run tests:
2
+ --
3
+ -- spago -x spago-dev.dhall test
4
+ --
5
+
1
6
module Test.Main where
2
7
3
8
import Prelude hiding (between , when )
@@ -16,17 +21,18 @@ import Data.Number (infinity, isNaN)
16
21
import Data.String.CodePoints as SCP
17
22
import Data.String.CodeUnits (fromCharArray , singleton )
18
23
import Data.String.CodeUnits as SCU
24
+ import Data.String.Regex.Flags (RegexFlags , ignoreCase , noFlags )
19
25
import Data.Tuple (Tuple (..))
20
26
import Effect (Effect )
21
- import Effect.Console (logShow )
27
+ import Effect.Console (log , logShow )
22
28
import Partial.Unsafe (unsafePartial )
23
29
import Test.Assert (assert' )
24
30
import Parsing (ParseError (..), Parser , ParserT , fail , parseErrorMessage , parseErrorPosition , position , region , runParser )
25
31
import 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 , (<?>), (<??>), (<~?>))
26
32
import Parsing.Expr (Assoc (..), Operator (..), buildExprParser )
27
33
import Parsing.Language (haskellDef , haskellStyle , javaStyle )
28
34
import 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 )
30
36
import Parsing.String.Basic (intDecimal , number , letter )
31
37
import Parsing.Token (TokenParser , makeTokenParser , match , token , when )
32
38
import Parsing.Token as Parser.Token
@@ -94,6 +100,14 @@ manySatisfyTest = do
94
100
_ <- char ' ?'
95
101
pure (fromCharArray r)
96
102
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
+ --
97
111
-- This test doesn't test the actual stack safety of these combinators, mainly
98
112
-- because I don't know how to come up with an example guaranteed to be large
99
113
-- enough to overflow the stack. But thankfully, their stack safety is more or
@@ -559,6 +573,7 @@ javaStyleTest = do
559
573
main :: Effect Unit
560
574
main = do
561
575
576
+ log " \n TESTS String\n "
562
577
parseErrorTestPosition
563
578
(many $ char ' f' *> char ' ?' )
564
579
" foo"
@@ -667,6 +682,8 @@ main = do
667
682
parseErrorTestPosition (string " a\n b\n c\n " *> eof) " a\n b\n c\n d\n " (Position { column: 1 , line: 4 })
668
683
parseErrorTestPosition (string " \t a" *> eof) " \t ab" (Position { column: 10 , line: 1 })
669
684
685
+ log " \n TESTS number\n "
686
+
670
687
parseTest " Infinity" infinity number
671
688
parseTest " +Infinity" infinity number
672
689
parseTest " -Infinity" (negate infinity) number
@@ -681,6 +698,7 @@ main = do
681
698
parseTest " -6.0" (-6.0 ) number
682
699
parseTest " +6.0" (6.0 ) number
683
700
701
+ log " \n TESTS Operator\n "
684
702
-- test from issue #161
685
703
-- all the below operators should play well together
686
704
parseErrorTestMessage
@@ -749,24 +767,23 @@ main = do
749
767
-- TODO This shows the current limitations of the number parser. Ideally this parse should fail.
750
768
parseTest " 1..3" 1.0 $ number <* eof
751
769
770
+ log " \n TESTS intDecimal\n "
752
771
parseTest " -300" (-300 ) intDecimal
753
772
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
767
781
782
+ log " \n TESTS Stack Safe Loops\n "
768
783
stackSafeLoopsTest
769
784
785
+ log " \n TESTS Token Parser\n "
786
+
770
787
tokenParserIdentifierTest
771
788
tokenParserReservedTest
772
789
tokenParserOperatorTest
@@ -799,18 +816,21 @@ main = do
799
816
tokenParserCommaSepTest
800
817
tokenParserCommaSep1Test
801
818
819
+ log " \n TESTS Haskell Style\n "
802
820
haskellStyleTest
821
+ log " \n TESTS Java Style\n "
803
822
javaStyleTest
804
823
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"
805
831
case runParser " aa" p of
806
832
Right _ -> assert' " error: ParseError expected!" false
807
833
Left (ParseError message _) -> do
808
834
let messageExpected = " context1 context2 Expected \" b\" "
809
835
assert' (" expected message: " <> messageExpected <> " , message: " <> message) (message == messageExpected)
810
836
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