packages feed

ogmarkup-3.0.0: test/GeneratorSpec.hs

{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE QuasiQuotes           #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module GeneratorSpec where

import           Text.Shakespeare.Text
import           Data.Maybe

import           Data.Text                        (Text)
import           Test.Hspec

import           Text.Ogmarkup.Private.Config
import           Text.Ogmarkup.Private.Typography

import qualified Text.Ogmarkup.Private.Ast        as Ast
import qualified Text.Ogmarkup.Private.Generator  as Gen

spec :: Spec
spec = do describe "format" $ do
            it "should deal with raw input" $
              Gen.runGenerator (Gen.format sentence) TestConf
                `shouldBe` "Bonjour toi."

          describe "component" $ do
            it "should deal with thought" $
              Gen.runGenerator (Gen.component False False (Ast.Thought simpleReply Nothing))
                               TestConf
                `shouldBe` "[thou-anonymous][reply]Bonjour toi.[/reply][/thou-anonymous]"

data TestConf = TestConf

instance GenConf TestConf Text where
  typography _ = frenchTypo

  documentTemplate _ doc = [st|[doc]#{doc}[/doc]|]

  errorTemplate _ err = [st|[error]#{err}[/error]|]

  storyTemplate _ story = [st|[story]#{story}[/story]|]

  asideTemplate _ (Just cls) aside = [st|[aside-#{cls}]#{aside}[/aside-#{cls}]|]
  asideTemplate _ _ aside = [st|[aside]#{aside}[/aside]|]

  paragraphTemplate _ par = [st|[par]#{par}[/par]|]

  tellerTemplate _ teller = [st|[tell]#{teller}[/tell]|]

  dialogueTemplate _ auth dial = [st|[dial-#{auth}]#{dial}[/dial-#{auth}]|]

  thoughtTemplate _ auth thou = [st|[thou-#{auth}]#{thou}[/thou-#{auth}]|]

  replyTemplate _ rep = [st|[reply]#{rep}[/reply]|]

  betweenDialogue _ = "[br]"

  emphTemplate _ txt = [st|[em]#{txt}[/em]|]

  strongEmphTemplate _ txt = [st|[strong]#{txt}[/strong]|]

  authorNormalize _ = maybe "anonymous" id

  printSpace _ None = ""
  printSpace _ Normal = " "
  printSpace _ Nbsp = "_"

sentence :: Ast.Format Text
sentence = Ast.Raw [ Ast.Word "Bonjour"
                   , Ast.Word "toi"
                   , Ast.Punctuation Ast.Point ]

simpleReply :: Ast.Reply Text
simpleReply = Ast.Simple [ sentence ]