module Compiler.Lexer.LiteralSpec where import Test.Hspec import Common import Compiler.Lexer.Literals import Parser.Lib import Parser.Parser spec :: Spec spec = do let unwrapParseError :: Either (ParseErrorWithParsed a) a -> Either ParseError a unwrapParseError (Right a) = Right a unwrapParseError (Left a) = Left $ parseError a describe "Literal parsing" $ do it "can parse strings" $ runParser parser ("\"test\"" :: TextWithOffset) `shouldReturn` (Just $ LitString "test") it "can parse strings with escaped quotes" $ runParser parser (toTextWithOffset $ "\"te" <> "\\" <> "\"" <> "st\"") `shouldReturn` (Just $ LitString "te\"st") it "can parse numbers" $ runParser parser "90" `shouldReturn` (Just $ LitNumber 90) it "reject numbers starting with 0" $ (runParser @Literal) parser "09" `shouldReturn` Nothing it "can parse float: 1" $ runParser parser "90.05" `shouldReturn` (Just $ LitFloat 90.05) it "can parse float: 2" $ runParser parser "0.05" `shouldReturn` (Just $ LitFloat 0.05) it "reject float without leading zero" $ (unwrapParseError <$> runParserEither @TextWithOffset @Literal parser ".05") `shouldReturn` (Left CantHandle) it "can parse bool:true" $ runParser parser "true" `shouldReturn` (Just $ LitBool True) it "can parse bool:false" $ runParser parser "false" `shouldReturn` (Just $ LitBool False) specGenerateAndParse @Literal