1{-# LANGUAGE OverloadedStrings #-}23module Formatter where45import Test.Tasty6import Test.Tasty.HUnit78import Data.Text ()9import SchemeDoc.Format.Procedure10import SchemeDoc.Format.Variable11import SchemeDoc.Types12import Util1314makeFmt :: (Sexp -> Maybe a) -> String -> (Maybe a)15makeFmt func scm = case parse scm of16 Left _ -> Nothing17 Right s -> func $ head s1819------------------------------------------------------------------------2021formatter :: TestTree22formatter =23 testGroup24 "Tests for Scheme formatters"25 [variableFmt, procedureFmt]2627variableFmt :: TestTree28variableFmt =29 testGroup30 "Formatter for Variable definitions"31 [ testCase "Simple variable definition" $ do32 assertEqual "String variable" (Just $ Variable "foo" (Id "bar")) $33 makeFmt mkVariable "(define foo bar)"3435 assertEqual "Number variable" (Just $ Variable "x" (Number 42)) $36 makeFmt mkVariable "(define x 42)"37 , testCase "Invalid variable definition" $ do38 assertEqual "" Nothing $ makeFmt mkVariable "(define (foo) bar)"39 ]4041procedureFmt :: TestTree42procedureFmt =43 testGroup44 "Formatter for procedure definitions"45 [ testCase "Simple procedure definition" $ do46 assertEqual "" (Just $ Procedure "foo" ["bar", "baz"] [(List [(Id "list"), (Id "bar")])]) $47 makeFmt mkProcedure "(define (foo bar baz) (list bar))"4849 assertEqual "" (Just $ Procedure "id" ["x"] [(Id "x")]) $50 makeFmt mkProcedure "(define (id x) x)"51 , testCase "Procedure definition with period" $ do52 assertEqual53 "Multiple parameters"54 (Just $ Procedure "foo" ["bar", ".", "baz"] [(Id "baz")])55 $ makeFmt mkProcedure "(define (foo bar . baz) baz)"5657 assertEqual58 "Single parameter"59 (Just $ Procedure "parse-seq" [".", "o"] [(List [(Id "parse-seq-list"), (Id "o")])])60 $ makeFmt mkProcedure "(define (parse-seq . o) (parse-seq-list o))"61 ]