xml-hamlet-0.3.0.1: test/main.hs
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE OverloadedStrings #-}
import Text.Hamlet.XML
import qualified Text.XML as X
import Test.HUnit
import Test.Hspec
import Test.Hspec.HUnit ()
main :: IO ()
main = hspecX [describe "xml-hamlet"
[ it "handles plain tags" $ [xml|
<foo>
<baz>
|] @?=
[ X.NodeElement $ X.Element "foo" []
[ X.NodeElement $ X.Element "baz" [] []
]
]
, it "handles raw text" $ [xml|
<foo>
<baz>bin
|] @?=
[ X.NodeElement $ X.Element "foo" []
[ X.NodeElement $ X.Element "baz" []
[ X.NodeContent "bin"
]
]
]
, it "handles variables" $ [xml|
<foo>
<baz>#{bin}
|] @?=
[ X.NodeElement $ X.Element "foo" []
[ X.NodeElement $ X.Element "baz" []
[ X.NodeContent "bin"
]
]
]
, it "handles embed" $ [xml|
<foo>
<baz>^{nodes}
|] @?=
[ X.NodeElement $ X.Element "foo" []
[ X.NodeElement $ X.Element "baz" [] nodes
]
]
, it "handles attributes" $ [xml|
<foo>
<bar here=there>
<baz>
|] @?=
[ X.NodeElement $ X.Element "foo" []
[ X.NodeElement $ X.Element "bar" [("here", "there")]
[ X.NodeElement $ X.Element "baz" [] []
]
]
]
, it "handles attributes" $ [xml|
<foo>
<bar here=there>
<baz :False:false=false :True:true=#{true}>
|] @?=
[ X.NodeElement $ X.Element "foo" []
[ X.NodeElement $ X.Element "bar" [("here", "there")]
[ X.NodeElement $ X.Element "baz" [("true", "true")] []
]
]
]
, it "handles forall" $ [xml|
$forall x <- xs
<word>#{x}
|] @?=
[ X.NodeElement $ X.Element "word" [] [X.NodeContent "foo"]
, X.NodeElement $ X.Element "word" [] [X.NodeContent "bar"]
, X.NodeElement $ X.Element "word" [] [X.NodeContent "baz"]
]
, it "handles with" $ [xml|
$with ys <- xs
$forall x <- ys
<word>#{x}
|] @?=
[ X.NodeElement $ X.Element "word" [] [X.NodeContent "foo"]
, X.NodeElement $ X.Element "word" [] [X.NodeContent "bar"]
, X.NodeElement $ X.Element "word" [] [X.NodeContent "baz"]
]
, it "handles maybe" $ [xml|
$maybe _x <- Just five
<one>
$nothing
<two>
$maybe _x <- Nothing
<three>
$nothing
<four>
|] @?=
[ X.NodeElement $ X.Element "one" [] []
, X.NodeElement $ X.Element "four" [] []
]
, it "handles conditionals" $ [xml|
$if True
<one>
$else
<two>
$if False
<three>
$elseif True
<four>
$if False
<five>
$elseif False
<six>
$else
<seven>
|] @?=
[ X.NodeElement $ X.Element "one" [] []
, X.NodeElement $ X.Element "four" [] []
, X.NodeElement $ X.Element "seven" [] []
]
, it "recognizes clark notation" $ [xml|
<{foo}bar {baz}bin="x">
|] @?= [X.NodeElement $ X.Element "{foo}bar" [("{baz}bin", "x")] []]
, it "recognizes clark with URLs" $ [xml|
<{http://www.example.com/foo/bar}baz>
|] @?= [X.NodeElement $ X.Element "{http://www.example.com/foo/bar}baz" [] []]
, it "allow embedding comments" $[xml|^{comment}|] @?= comment
, it "multiline tags" $ [xml|
<foo bar=baz
bin=bin>content
|] @?= [xml|<foo bar=baz bin=bin>content|]
, it "short circuiting of attributes" $ [xml|<foo :False:x=#{undefined}>|] @?= [xml|<foo>|]
]]
where
bin = "bin"
nodes = [X.NodeInstruction $ X.Instruction "ifoo" "ibar"]
true = "true"
xs = ["foo", "bar", "baz"]
comment = [X.NodeComment "somecomment"]
five :: Int
five = 5