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