@@ -27,8 +27,15 @@ testStructureFromDom = do
2727 tsBools <- inElemNe "bool" boolFromDom
2828 return TestStructure{..}
2929
30−instance FromDom TestStructure where
31− fromDom = testStructureFromDom
30+testStructureAttributes :: (Monad m) => DomParserT Identity m TestStructure
31+testStructureAttributes = do
32+ name <- getCurrentName
33+ int <- parseAttribute "int" readContent
34+ bool <- parseAttribute "bool" readBool
35+ return $ TestStructure
36+ { tsName = name
37+ , tsInts = [int]
38+ , tsBools = pure bool }
3239
3340docStruct :: Document
3441docStruct = parseText_ def [lt|
@@ -41,6 +48,13 @@ docStruct = parseText_ def [lt|
4148</root>
4249|]
4350
51+docAttrStruct :: Document
52+docAttrStruct = parseText_ def [lt|
53+<?xml version="1.0" encoding="utf-8"?>
54+<structure int="10" bool="t">
55+</structure>
56+|]
57+
4458docNone :: Document
4559docNone = parseText_ def [lt|
4660<?xml version="1.0" encoding="utf-8"?>
@@ -48,8 +62,26 @@ docNone = parseText_ def [lt|
4862</root>
4963|]
5064
51−docEmpty :: Document
52−docEmpty = parseText_ def [lt|
65+docSimpleAttr :: Document
66+docSimpleAttr = parseText_ def [lt|
67+<?xml version="1.0" encoding="utf-8"?>
68+<root>
69+<a attr="content"/>
70+</root>
71+|]
72+
73+docMultipleAttr :: Document
74+docMultipleAttr = parseText_ def [lt|
75+<?xml version="1.0" encoding="utf-8"?>
76+<root>
77+<a attr="content1"/>
78+<a attr="content2"/>
79+<a attr="content3"/>
80+</root>
81+|]
82+
83+docSingleEmpty :: Document
84+docSingleEmpty = parseText_ def [lt|
5385<?xml version="1.0" encoding="utf-8"?>
5486<root>
5587 <a/>
@@ -176,13 +208,37 @@ specParserFailedPath name doc path parser = it name $ example $ do
176208combinationsSpec :: Spec
177209combinationsSpec = do
178210 describe "inElem" $ do
179− let parser = inElem "a" textFromDom
180211 describe "succeeds" $ do
181− specParserEq "docSimple" docSimple "content" parser
182− specParserEq "docMultiple" docMultiple "content1" parser
212+ describe "simple" $ do
213+ let parser = inElem "a" textFromDom
214+ specParserEq "docSimple" docSimple "content" parser
215+ specParserEq "docMultiple" docMultiple "content1" parser
216+ describe "deep" $ do
217+ let parser = inElem "a" $ inElem "b" textFromDom
218+ specParserEq "docDeep" docDeep "content" parser
219+ specParserEq "docDeepMultiple1" docDeepMultiple1 "content1" parser
220+ specParserEq "docDeepWithContent" docDeepWithContent "content" parser
183221 describe "fails" $ do
184− specParserFailed "docNone" docNone parser
185− specParserFailed "docEmpty" docEmpty parser
222+ describe "simple" $ do
223+ let parser = inElem "a" textFromDom
224+ specParserFailed "docNone" docNone parser
225+ specParserFailed "docSingleEmpty" docSingleEmpty parser
226+ describe "deep" $ do
227+ let parser = inElem "a" $ inElem "b" textFromDom
228+ specParserFailedPath "docDeepMultiple2" docDeepMultiple2
229+ ["root", "a", "b"] parser
230+ -- should fail here because first tag "a" does not contains
231+ -- tag "b" which is expected by parser @inElem "b"@
232+
233+ describe "parseAttribute" $ do
234+ describe "succeeds" $ do
235+ specParserEq "docSimpleAttr" docSimpleAttr "content"
236+ $ inElem "a" $ parseAttribute "attr" Right
237+ let res = ["content1", "content2", "content3"]
238+ specParserEq "docMultipleAttr" docMultipleAttr res
239+ $ inElemAll "a" $ parseAttribute "attr" Right
240+ describe "fails" $ do
241+ specParserFailed "docNone" docNone $ parseAttribute "attr" Right
186242
187243 describe "inElemAll" $ do
188244 let parser = inElemAll "a" textFromDom
@@ -192,7 +248,7 @@ combinationsSpec = do
192248 specParserEq "docMultiple" docMultiple
193249 ["content1", "content2", "content3"] parser
194250 describe "fails" $ do
195− specParserFailed "docEmpty" docEmpty parser
251+ specParserFailed "docSingleEmpty" docSingleEmpty parser
196252
197253 describe "inElemMay" $ do
198254 let parser = inElemMay "a" textFromDom
@@ -201,7 +257,7 @@ combinationsSpec = do
201257 specParserEq "docSimple" docSimple (Just "content") parser
202258 specParserEq "docMultiple" docMultiple (Just "content1") parser
203259 describe "fails" $ do
204− specParserFailed "docEmpty" docEmpty parser
260+ specParserFailed "docSingleEmpty" docSingleEmpty parser
205261
206262 describe "inElemNe" $ do
207263 let parser = inElemNe "a" textFromDom
@@ -211,7 +267,7 @@ combinationsSpec = do
211267 (NE.fromList ["content1", "content2", "content3"]) parser
212268 describe "fails" $ do
213269 specParserFailed "docNone" docNone parser
214− specParserFailed "docEmpty" docEmpty parser
270+ specParserFailed "docSingleEmpty" docSingleEmpty parser
215271
216272 describe "diveElem" $ do
217273 describe "single element" $ do
@@ -234,7 +290,7 @@ combinationsSpec = do
234290 describe "mandatory element" $ do
235291 let parser = inElem "a" $ ignoreEmpty textFromDom
236292 describe "succeeds" $ do
237− specParserEq "docEmpty" docEmpty Nothing parser
293+ specParserEq "docSingleEmpty" docSingleEmpty Nothing parser
238294 specParserEq "docSimple" docSimple (Just "content") parser
239295 specParserEq "docMultiple" docMultiple (Just "content1") parser
240296 describe "fails" $ do
@@ -243,7 +299,7 @@ combinationsSpec = do
243299 let parser = fmap join $ inElemMay "a" $ ignoreEmpty textFromDom
244300 describe "succeeds" $ do
245301 specParserEq "docNone" docNone Nothing parser
246− specParserEq "docEmpty" docEmpty Nothing parser
302+ specParserEq "docSingleEmpty" docSingleEmpty Nothing parser
247303 specParserEq "docSimple" docSimple (Just "content") parser
248304 specParserEq "docMultiple" docMultiple (Just "content1") parser
249305
@@ -271,14 +327,25 @@ contentSpec = do
271327structSpec :: Spec
272328structSpec = do
273329 describe "succeeds" $ do
274− let
275− result = TestStructure
276− { tsName = "name"
277− , tsInts = [1,2]
278− , tsBools = pure True }
279− specParserEq "docStruct" docStruct result fromDom
330+ describe "dom structure" $ do
331+ let
332+ result = TestStructure
333+ { tsName = "name"
334+ , tsInts = [1,2]
335+ , tsBools = pure True }
336+ specParserEq "docStruct" docStruct result testStructureFromDom
337+ describe "attribute structure" $ do
338+ let
339+ result = TestStructure
340+ { tsName = "structure"
341+ , tsInts = [10]
342+ , tsBools = pure True }
343+ specParserEq "docAttrStruct" docAttrStruct result testStructureAttributes
280344 describe "fails" $ do
281− specParserFailed "docSimple" docSimple testStructureFromDom
345+ describe "dom structure" $ do
346+ specParserFailed "docSimple" docSimple testStructureFromDom
347+ describe "attr structure" $ do
348+ specParserFailed "docNone" docNone testStructureAttributes
282349
283350main :: IO ()
284351main = hspec $ do