1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
{-# 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
|