packages feed

lambda-calculator-0.5.0: test/Language/Lambda/PrettyPrintSpec.hs

module Language.Lambda.PrettyPrintSpec where

import Test.Hspec

import Language.Lambda.PrettyPrint
  
spec :: Spec
spec = do
  describe "PDoc" $ do
    it "pretty prints empty" $ do
      prettyPrint' empty `shouldBe` ""

    it "pretty prints added components" $ do
      let pdoc = add "f" (add "x" empty)
      prettyPrint' pdoc `shouldBe` "fx"

    it "pretty prints appended components" $ do
      let pdoc = append ["f", "x", "y"] empty
      prettyPrint' pdoc `shouldBe` "fxy"

    it "pretty prints between parens" $ do
      let pdoc = between (PDoc ["f"]) "(" ")" empty
      prettyPrint' pdoc `shouldBe` "(f)"

      let pdoc' = betweenParens (PDoc ["f"]) empty
      prettyPrint' pdoc' `shouldBe` "(f)"

    it "pretty prints intercalated spaces" $ do
      let pdoc = intercalate ["f", "x", "y"] [space] empty
      prettyPrint' pdoc `shouldBe` "f x y"

    it "pretty prints lambda" $ do
      let pdoc = between (PDoc ["x"]) "\\" ". " (add "x" empty)
      prettyPrint' pdoc `shouldBe` "\\x. x"

prettyPrint' :: PDoc String -> String
prettyPrint' = prettyPrint