packages feed

shakespeare-1.0.1.1: test/ShakespeareBaseTest.hs

module ShakespeareBaseTest (specs) where

import Test.HUnit hiding (Test)
import Test.Hspec.Monadic
import Test.Hspec.HUnit ()

import Text.ParserCombinators.Parsec (parse, ParseError, (<|>))
import Text.Shakespeare.Base (parseVarString, parseUrlString, parseIntString)
import Text.Shakespeare (preFilter, defaultShakespeareSettings, ShakespeareSettings(..), PreConvert(..), PreConversion(..))

-- run :: Text.Parsec.Prim.Parsec Text.Parsec.Pos.SourceName () c -> Text.Parsec.Pos.SourceName -> c

specs :: Specs
specs = describe "shakespeare-js" $ do
  it "parseStrings" $ do
    Right "%{var}" @=?  run varString "%{var}"
    Right "@{url}" @=?  run urlString "@{url}"
    Right "^{int}" @=?  run intString "^{int}"
    Right "@{url}" @=?  run (varString <|> urlString <|> intString) "@{url} #{var}"

  it "preFilter off" $ do
    str <- preFilter defaultShakespeareSettings template
    str @=? template

  it "preFilter on" $ do
    str <- preFilter preConversionSettings template
    "unchanged `#{var}` `@{url}` `^{int}`" @=? str

  it "preFilter ignore quotes" $ do
    str <- preFilter preConversionSettings templateQuote
    "unchanged '#{var}' `@{url}` '^{int}'" @=? str

  it "preFilter ignore comments" $ do
    str <- preFilter preConversionSettings templateCommented
    "unchanged & '#{var}' @{url} '^{int}'" @=? str

  where
    varString = parseVarString '%'
    urlString = parseUrlString '@' '?'
    intString = parseIntString '^'

    preConversionSettings = defaultShakespeareSettings {
      preConversion = Just PreConvert {
          preConvert = Id
        , preEscapeBegin = "`"
        , preEscapeEnd = "`"
        , preEscapeIgnoreBalanced = "'\""
        , preEscapeIgnoreLine = "&"
        }
    }
    template  = "unchanged #{var} @{url} ^{int}"
    templateQuote = "unchanged '#{var}' @{url} '^{int}'"
    templateCommented = "unchanged & '#{var}' @{url} '^{int}'"

    run parser str = eShowErrors $ parse parser str str

    eShowErrors :: Either ParseError c -> c
    eShowErrors = either (error . show) id