11module Test.Main where
22
33import Prelude hiding (between )
4+
45import Control.Alt ((<|>))
56import 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 )
1016import Text.Parsing.StringParser.Combinators (many1 , endBy1 , sepBy1 , optionMaybe , many , chainl , fix , between )
1117import 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 )
1319
1420parens :: forall a . Parser a -> Parser a
1521parens = between (string " (" ) (string " )" )
@@ -19,12 +25,6 @@ nested = fix $ \p -> (do
1925 string " a"
2026 pure 0 ) <|> ((+) 1 ) <$> parens p
2127
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-
2828opTest :: Parser String
2929opTest = chainl (singleton <$> anyChar) (string " +" $> append) " "
3030
@@ -51,22 +51,36 @@ tryTest :: Parser String
5151tryTest = try ((<>) <$> string " aa" <*> string " bb" ) <|>
5252 (<>) <$> string " aa" <*> string " cc"
5353
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
5564main = 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
5975 string " a"
6076 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
6379 as <- string " a" `endBy1` string " ,"
6480 eof
6581 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