1{-# LANGUAGE TemplateHaskell #-}
2module Text.Shakespeare.BaseSpec (spec) where
3
4import Test.Hspec
5import Text.Shakespeare
6import Text.ParserCombinators.Parsec
7       ((<|>), ParseError, parse, runParser)
8import Text.Shakespeare.Base
9       (Deref(..), Ident(..), parseDeref, parseVarString, parseUrlString,
10        parseIntString)
11import Language.Haskell.TH.Syntax (Exp (VarE))
12import Data.Text.Lazy.Builder (toLazyText, fromLazyText)
13import Data.Text.Lazy (pack)
14
15-- run :: Text.Parsec.Prim.Parsec Text.Parsec.Pos.SourceName () c -> Text.Parsec.Pos.SourceName -> c
16
17spec :: Spec
18spec = do
19  let preFilterN = preFilter Nothing
20  {-
21  it "parseStrings" $ do
22    run varString "%{var}" `shouldBe` Right "%{var}"
23    run urlString "@{url}" `shouldBe` Right "@{url}"
24    run intString "^{int}" `shouldBe` Right "^{int}"
25
26    run (varString <|> urlString <|> intString) "@{url} #{var}" `shouldBe` Right "@{url}"
27  -}
28
29  it "parseDeref parse expressions with infix operator and trailing spaces" $ do
30    runParser parseDeref () "" " a + b \t " `shouldBe`
31      (Right
32         (DerefBranch
33            (DerefBranch (DerefIdent (Ident "+")) (DerefIdent (Ident "a")))
34            (DerefIdent (Ident "b"))))
35
36  it "preFilter off" $ do
37    preFilterN defaultShakespeareSettings template
38      `shouldReturn` template
39
40  it "preFilter on" $ do
41    preFilterN preConversionSettings template `shouldReturn`
42      "(function(shakespeare_var_var, shakespeare_var_url, shakespeare_var_int){unchanged shakespeare_var_var shakespeare_var_url shakespeare_var_int})(#{var}, @{url}, ^{int});\n"
43
44  it "preFilter ignore quotes" $ do
45    preFilterN preConversionSettings templateQuote `shouldReturn`
46      "(function(shakespeare_var_url){unchanged '#{var}' shakespeare_var_url '^{int}'})(@{url});\n"
47
48  it "preFilter ignore comments" $ do
49    preFilterN preConversionSettings templateCommented
50      `shouldReturn` "unchanged & '#{var}' @{url} '^{int}'"
51
52  it "reload" $ do
53    let helper input = $(do
54            shakespeareFileReload defaultShakespeareSettings
55                { toBuilder = VarE 'pack
56                , wrap = VarE 'toLazyText
57                , unwrap = VarE 'fromLazyText
58                } "test/reload.txt") undefined
59    helper "here1" `shouldBe` pack "here1\n"
60    helper "here2" `shouldBe` pack "here2\n"
61
62  where
63    varString = parseVarString '%'
64    urlString = parseUrlString '@' '?'
65    intString = parseIntString '^'
66
67    preConversionSettings = defaultShakespeareSettings {
68      preConversion = Just PreConvert {
69          preConvert = Id
70        , preEscapeIgnoreBalanced = "'\""
71        , preEscapeIgnoreLine = "&"
72        , wrapInsertion = Just WrapInsertion {
73            wrapInsertionIndent = Nothing
74          , wrapInsertionStartBegin = "function("
75          , wrapInsertionSeparator = ", "
76          , wrapInsertionStartClose = "){"
77          , wrapInsertionEnd = "}"
78          , wrapInsertionAddParens = True
79          }
80        }
81    }
82    template  = "unchanged #{var} @{url} ^{int}"
83    templateQuote = "unchanged '#{var}' @{url} '^{int}'"
84    templateCommented = "unchanged & '#{var}' @{url} '^{int}'"
85
86    run parser str = eShowErrors $ parse parser str str
87
88    eShowErrors :: Either ParseError c -> c
89    eShowErrors = either (error . show) id
90
91