packages feed

zuramaru-0.1.0.0: test/tasty/Maru/ParserTest.hs

{-# LANGUAGE OverloadedStrings #-}

module Maru.ParserTest where

import Data.Text (Text)
import Maru.Parser (parse, parseErrorPretty)
import Maru.Preprocessor (preprocess)
import Maru.Type
import Test.Tasty (TestTree)
import Test.Tasty.HUnit (testCase, assertFailure, (@?=), Assertion)
import qualified Maru.Type as MT

test_parser_and_preprocessor_shows :: [TestTree]
test_parser_and_preprocessor_shows =
  [ testCase "123 as 123" $ "123" `isShownAs` "123"
  , testCase "abc as abc" $ "abc" `isShownAs` "abc"
  , testCase "(123 456) as (123 456)" $ "(123 456)" `isShownAs` "(123 456)"
  , testCase "( 123 456 789 ) as (123 456 789)" $ "( 123 456 789 )" `isShownAs` "(123 456 789)"
  , testCase "( + 2 (* 3 4) ) as (+ 2 (* 3 4))" $ "( + 2 (* 3 4) )" `isShownAs` "(+ 2 (* 3 4))"
  , testCase "(1 ) as (1)" $ "(1 )" `isShownAs` "(1)"
  ]
  where
    isShownAs :: Text -> Text -> Assertion
    isShownAs code expected =
      case preprocess <$> parse code of
        Left  e     -> assertFailure $ "A parse is failed: " ++ parseErrorPretty e
        Right sexpr -> MT.readable sexpr @?= expected


test_parser_parses_quote_symbols :: [TestTree]
test_parser_parses_quote_symbols =
  [ testCase "'{some} to `Quote' {some}`" $ do
      parse "'1" @?= Right (Quote' (AtomInt' 1))
      parse "'a" @?= Right (Quote' (AtomSymbol' "a"))
      parse "'(1 2)" @?= Right (Quote' (Cons' (AtomInt' 1) (Cons' (AtomInt' 2) Nil')))
  ]