1
1
module Test.Main where
2
2
3
3
import Prelude hiding (between )
4
+
4
5
import Control.Alt ((<|>))
5
6
import Control.Monad.Eff (Eff )
6
- import Control.Monad.Eff.Console (CONSOLE , logShow )
7
- import Data.Either (Either (..))
8
- import Data.String (singleton )
9
- import Text.Parsing.StringParser (Parser , ParseError (..), try , runParser )
7
+ import Control.Monad.Eff.Console (CONSOLE )
8
+
9
+ import Data.Either (isLeft , isRight , Either (..))
10
+ import Data.List (List (Nil), (:))
11
+ import Data.String (joinWith , singleton )
12
+ import Data.Unfoldable (replicate )
13
+
14
+ import Test.Assert (assert' , ASSERT , assert )
15
+ import Text.Parsing.StringParser (Parser , runParser , try )
10
16
import Text.Parsing.StringParser.Combinators (many1 , endBy1 , sepBy1 , optionMaybe , many , chainl , fix , between )
11
17
import Text.Parsing.StringParser.Expr (Assoc (..), Operator (..), buildExprParser )
12
- import Text.Parsing.StringParser.String (anyDigit , eof , string , anyChar , anyLetter , alphaNum )
18
+ import Text.Parsing.StringParser.String (anyDigit , eof , string , anyChar )
13
19
14
20
parens :: forall a . Parser a -> Parser a
15
21
parens = between (string " (" ) (string " )" )
@@ -19,12 +25,6 @@ nested = fix $ \p -> (do
19
25
string " a"
20
26
pure 0 ) <|> ((+) 1 ) <$> parens p
21
27
22
- parseTest :: forall a eff . Show a => Parser a -> String -> Eff (console :: CONSOLE | eff ) Unit
23
- parseTest p input =
24
- case runParser p input of
25
- Left (ParseError err) -> logShow err
26
- Right result -> logShow result
27
-
28
28
opTest :: Parser String
29
29
opTest = chainl (singleton <$> anyChar) (string " +" $> append) " "
30
30
@@ -51,22 +51,36 @@ tryTest :: Parser String
51
51
tryTest = try ((<>) <$> string " aa" <*> string " bb" ) <|>
52
52
(<>) <$> string " aa" <*> string " cc"
53
53
54
- main :: forall e . Eff (console :: CONSOLE | e ) Unit
54
+ canParse :: forall a . Parser a -> String -> Boolean
55
+ canParse p input = isRight $ runParser p input
56
+
57
+ parseFail :: forall a . Parser a -> String -> Boolean
58
+ parseFail p input = isLeft $ runParser p input
59
+
60
+ expectResult :: forall a . (Eq a ) => a -> Parser a -> String -> Boolean
61
+ expectResult res p input = runParser p input == Right res
62
+
63
+ main :: forall e . Eff (console :: CONSOLE , assert :: ASSERT | e ) Unit
55
64
main = do
56
- parseTest nested " (((a)))"
57
- parseTest (many (string " a" )) " aaa"
58
- parseTest (parens (do
65
+ assert' " many should not blow the stack" $ canParse (many (string " a" )) (joinWith " " $ replicate 100000 " a" )
66
+ assert' " many failing after" $ parseFail (do
67
+ as <- many (string " a" )
68
+ eof
69
+ pure as) (joinWith " " (replicate 100000 " a" ) <> " b" )
70
+
71
+ assert $ expectResult 3 nested " (((a)))"
72
+ assert $ expectResult (" a" :" a" :" a" :Nil ) (many (string " a" )) " aaa"
73
+ assert $ parseFail (many1 (string " a" )) " "
74
+ assert $ canParse (parens (do
59
75
string " a"
60
76
optionMaybe $ string " b" )) " (ab)"
61
- parseTest (string " a" `sepBy1` string " ," ) " a,a,a"
62
- parseTest (do
77
+ assert $ expectResult ( " a " : " a " : " a " : Nil ) (string " a" `sepBy1` string " ," ) " a,a,a"
78
+ assert $ canParse (do
63
79
as <- string " a" `endBy1` string " ,"
64
80
eof
65
81
pure as) " a,a,a,"
66
- parseTest opTest " a+b+c"
67
- parseTest exprTest " 1*2+3/4-5"
68
- parseTest tryTest " aacc"
69
- parseTest (many1 anyDigit) " 01234/"
70
- parseTest (many1 anyDigit) " 56789:"
71
- parseTest (many anyLetter) " aB"
72
- parseTest (many alphaNum) " aB3"
82
+ assert' " opTest" $ expectResult " abc" opTest " a+b+c"
83
+ assert' " exprTest" $ expectResult (-3 ) exprTest " 1*2+3/4-5"
84
+ assert' " tryTest " $ canParse tryTest " aacc"
85
+ assert $ expectResult (' 0' :' 1' :' 2' :' 3' :' 4' :Nil ) (many1 anyDigit) " 01234/"
86
+ assert $ expectResult (' 5' :' 6' :' 7' :' 8' :' 9' :Nil ) (many1 anyDigit) " 56789:"
0 commit comments