55
66module Test.Main where
77
8- import Prelude ( class Eq , class Show , Unit , append , bind , const , discard , div , flip , identity , map , negate , pure , show , unit , void , ($), ($>), (*), (*>), (+), (-), (/), (/=), (<$), (<$>), (<*), (<*>), (<>), (==), (>>=) )
8+ import Prelude hiding ( between , when )
99
1010import Control.Alt ((<|>))
1111import Control.Lazy (fix , defer )
12+ import Control.Monad.Rec.Class (Step (..), tailRecM )
1213import Control.Monad.State (State , lift , modify , runState )
1314import Data.Array (some , toUnfoldable )
1415import Data.Array as Array
1516import Data.Bifunctor (lmap , rmap )
1617import Data.CodePoint.Unicode as CodePoint.Unicode
1718import Data.Either (Either (..), either , fromLeft , hush )
1819import Data.Foldable (oneOf )
20+ import Data.Function.Uncurried (mkFn5 , runFn2 )
1921import Data.List (List (..), fromFoldable , (:))
2022import Data.List as List
2123import Data.List.NonEmpty (NonEmptyList (..), catMaybes , cons , cons' )
@@ -35,7 +37,7 @@ import Effect (Effect)
3537import Effect.Console (log , logShow )
3638import Effect.Unsafe (unsafePerformEffect )
3739import Node.Process (lookupEnv )
38- import Parsing (ParseError (..), ParseState (..), Parser , ParserT , Position (..), consume , fail , getParserT , initialPos , parseErrorPosition , position , region , runParser )
40+ import Parsing (ParseError (..), ParseState (..), Parser , ParserT (..) , Position (..), consume , fail , getParserT , initialPos , parseErrorPosition , position , region , runParser )
3941import Parsing.Combinators (advance , between , chainl , chainl1 , chainr , chainr1 , choice , empty , endBy , endBy1 , lookAhead , many , many1 , many1Till , many1Till_ , manyIndex , manyTill , manyTill_ , notFollowedBy , optional , optionMaybe , replicateA , sepBy , sepBy1 , sepEndBy , sepEndBy1 , skipMany , skipMany1 , try , tryRethrow , (<?>), (<??>), (<~?>))
4042import Parsing.Combinators.Array as Combinators.Array
4143import Parsing.Expr (Assoc (..), Operator (..), buildExprParser )
@@ -49,7 +51,7 @@ import Parsing.Token as Token
4951import Partial.Unsafe (unsafePartial )
5052import Test.Assert (assert' , assertEqual' )
5153import Test.IndentationTests as IndentationTests
52- import Test.Lib
54+ import Test.Lib ( class ParseErrorHuman__OnlyString , TestM , mkParseErrorTestMessage , mkParseErrorTestPosition , mkParseTest )
5355
5456parseTest :: forall s a . Show a => Eq a => ParseErrorHuman__OnlyString s => s -> a -> Parser s a -> Effect Unit
5557parseTest = mkParseTest runParser
@@ -60,6 +62,13 @@ parseErrorTestPosition = mkParseErrorTestPosition runParser
6062parseErrorTestMessage :: forall s a . Show a => Parser s a -> s -> String -> Effect Unit
6163parseErrorTestMessage = mkParseErrorTestMessage runParser
6264
65+ parseState :: forall m s a . (ParseState s -> Tuple (ParseState s ) a ) -> ParserT s m a
66+ parseState k = ParserT
67+ ( mkFn5 \state1 _ _ _ done -> do
68+ let Tuple state2 res = k state1
69+ runFn2 done state2 res
70+ )
71+
6372parens :: forall m a . ParserT String m a -> ParserT String m a
6473parens = between (string " (" ) (string " )" )
6574
@@ -581,8 +590,44 @@ takeWhilePropagateFail = do
581590 " f"
582591 (Position { index: 1 , line: 1 , column: 2 })
583592
593+ applicativeSemantics :: Parser String String
594+ applicativeSemantics =
595+ ( string " foo"
596+ <* parseState (\(ParseState a b _) -> Tuple (ParseState a b false ) unit)
597+ <* fail " fail"
598+ )
599+ <|> pure " "
600+
601+ bindSemantics :: Parser String String
602+ bindSemantics =
603+ ( do
604+ _ <- string " foo"
605+ parseState (\(ParseState a b _) -> Tuple (ParseState a b false ) unit)
606+ fail " fail"
607+ )
608+ <|> pure " "
609+
610+ monadRecSemantics :: Parser String String
611+ monadRecSemantics = loop <|> pure " "
612+ where
613+ loop = tailRecM
614+ ( case _ of
615+ 1 -> do
616+ _ <- string " foo"
617+ pure (Loop 2 )
618+ 2 ->
619+ parseState (\(ParseState a b _) -> Tuple (ParseState a b false ) (Loop 3 ))
620+ _ ->
621+ fail " fail"
622+ )
623+ 1
624+
584625main :: Effect Unit
585626main = do
627+ log " \n TESTS Semantics\n "
628+ parseErrorTestMessage applicativeSemantics " foo" " fail"
629+ parseErrorTestMessage bindSemantics " foo" " fail"
630+ parseErrorTestMessage monadRecSemantics " foo" " fail"
586631
587632 log " \n TESTS Indentation\n "
588633 IndentationTests .testIndentationParser
0 commit comments