{-# LANGUAGE OverloadedLists #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeFamilies #-} import Data.HashMap.Strict (HashMap) import Data.Text (Text) import Data.Text.Format.Simple import Data.Text.Format.Simple.Internal import Lens.Micro.Platform import Test.Hspec import GHC.Exts instance IsList Compiled where type Item Compiled = Part fromList = Compiled toList = unCompiled parserSpec :: Spec parserSpec = describe "the parser" $ do it "parses a string to a string" $ parse "a literal string" `shouldBe` Right [String "a literal string"] it "parses a variable" $ parse "${var}" `shouldBe` Right [NamedVar "var"] it "parses a string followed by a variable" $ parse "str ${var}" `shouldBe` Right [String "str ", NamedVar "var"] it "parses a string followed by a variable w/o whitespace" $ parse "str${var}" `shouldBe` Right [String "str", NamedVar "var"] it "parses a string followed by a variable followed by a string" $ parse "str ${var} str2" `shouldBe` Right [String "str ", NamedVar "var", String " str2"] it "parses a literal '$'" $ parse "$" `shouldBe` Right [String "$"] it "parses several consecutive literal '$'" $ parse "$$$$" `shouldBe` Right [String "$$$$"] formatSpec :: Spec formatSpec = do let subMap :: HashMap Name Text subMap = [("one", "twenty"), ("two", "fourty"), ("var", "value"), ("var2", "it")] lookup k = subMap ^. at k sp :: Compiled -> (Text, [Name]) sp = flip formatC lookup describe "formatC" $ do it "substitutes a single named variable to itself" $ sp "${var}" `shouldBe` ("value", []) it "substitutes a variable between text" $ sp "do ${var2} right" `shouldBe` ("do it right", []) it "substitutes several variables" $ sp "counting from ${one} to ${two}" `shouldBe` ("counting from twenty to fourty", []) it "reports missing names" $ sp "counting from ${one} to ${three}" `shouldBe` ("counting from twenty to ", ["three"]) main :: IO () main = hspec $ do parserSpec formatSpec