@@ -27,8 +27,15 @@ testStructureFromDom = do
27 tsBools <- inElemNe "bool" boolFromDom
27 tsBools <- inElemNe "bool" boolFromDom
28 return TestStructure{..}
28 return TestStructure{..}
30+testStructureAttributes :: (Monad m) => DomParserT Identity m TestStructure
31+testStructureAttributes = do
32+ name <- getCurrentName
33+ int <- parseAttribute "int" readContent
34+ bool <- parseAttribute "bool" readBool
30−instance FromDom TestStructure where
35+ return $ TestStructure
31− fromDom = testStructureFromDom
36+ { tsName = name
38+ , tsBools = pure bool }
33docStruct :: Document
40docStruct :: Document
34docStruct = parseText_ def [lt|
41docStruct = parseText_ def [lt|
@@ -41,6 +48,13 @@ docStruct = parseText_ def [lt|
51+docAttrStruct :: Document
52+docAttrStruct = parseText_ def [lt|
53+<?xml version="1.0" encoding="utf-8"?>
54+<structure int="10" bool="t">
44docNone :: Document
58docNone :: Document
45docNone = parseText_ def [lt|
59docNone = parseText_ def [lt|
46<?xml version="1.0" encoding="utf-8"?>
60<?xml version="1.0" encoding="utf-8"?>
@@ -48,8 +62,26 @@ docNone = parseText_ def [lt|
65+docSimpleAttr :: Document
66+docSimpleAttr = parseText_ def [lt|
67+<?xml version="1.0" encoding="utf-8"?>
73+docMultipleAttr :: Document
74+docMultipleAttr = parseText_ def [lt|
75+<?xml version="1.0" encoding="utf-8"?>
51−docEmpty :: Document
83+docSingleEmpty :: Document
52−docEmpty = parseText_ def [lt|
84+docSingleEmpty = parseText_ def [lt|
53<?xml version="1.0" encoding="utf-8"?>
85<?xml version="1.0" encoding="utf-8"?>
@@ -176,13 +208,37 @@ specParserFailedPath name doc path parser = it name $ example $ do
176combinationsSpec :: Spec
208combinationsSpec :: Spec
177combinationsSpec = do
209combinationsSpec = do
178 describe "inElem" $ do
210 describe "inElem" $ do
179− let parser = inElem "a" textFromDom
180 describe "succeeds" $ do
211 describe "succeeds" $ do
212+ describe "simple" $ do
213+ let parser = inElem "a" textFromDom
181− specParserEq "docSimple" docSimple "content" parser
214+ specParserEq "docSimple" docSimple "content" parser
182− specParserEq "docMultiple" docMultiple "content1" 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
183 describe "fails" $ do
221 describe "fails" $ do
222+ describe "simple" $ do
223+ let parser = inElem "a" textFromDom
184− specParserFailed "docNone" docNone parser
224+ specParserFailed "docNone" docNone parser
185− specParserFailed "docEmpty" docEmpty 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"@
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
187 describe "inElemAll" $ do
243 describe "inElemAll" $ do
188 let parser = inElemAll "a" textFromDom
244 let parser = inElemAll "a" textFromDom
@@ -192,7 +248,7 @@ combinationsSpec = do
192 specParserEq "docMultiple" docMultiple
248 specParserEq "docMultiple" docMultiple
193 ["content1", "content2", "content3"] parser
249 ["content1", "content2", "content3"] parser
194 describe "fails" $ do
250 describe "fails" $ do
195− specParserFailed "docEmpty" docEmpty parser
251+ specParserFailed "docSingleEmpty" docSingleEmpty parser
197 describe "inElemMay" $ do
253 describe "inElemMay" $ do
198 let parser = inElemMay "a" textFromDom
254 let parser = inElemMay "a" textFromDom
@@ -201,7 +257,7 @@ combinationsSpec = do
201 specParserEq "docSimple" docSimple (Just "content") parser
257 specParserEq "docSimple" docSimple (Just "content") parser
202 specParserEq "docMultiple" docMultiple (Just "content1") parser
258 specParserEq "docMultiple" docMultiple (Just "content1") parser
203 describe "fails" $ do
259 describe "fails" $ do
204− specParserFailed "docEmpty" docEmpty parser
260+ specParserFailed "docSingleEmpty" docSingleEmpty parser
206 describe "inElemNe" $ do
262 describe "inElemNe" $ do
207 let parser = inElemNe "a" textFromDom
263 let parser = inElemNe "a" textFromDom
@@ -211,7 +267,7 @@ combinationsSpec = do
211 (NE.fromList ["content1", "content2", "content3"]) parser
267 (NE.fromList ["content1", "content2", "content3"]) parser
212 describe "fails" $ do
268 describe "fails" $ do
213 specParserFailed "docNone" docNone parser
269 specParserFailed "docNone" docNone parser
214− specParserFailed "docEmpty" docEmpty parser
270+ specParserFailed "docSingleEmpty" docSingleEmpty parser
216 describe "diveElem" $ do
272 describe "diveElem" $ do
217 describe "single element" $ do
273 describe "single element" $ do
@@ -234,7 +290,7 @@ combinationsSpec = do
234 describe "mandatory element" $ do
290 describe "mandatory element" $ do
235 let parser = inElem "a" $ ignoreEmpty textFromDom
291 let parser = inElem "a" $ ignoreEmpty textFromDom
236 describe "succeeds" $ do
292 describe "succeeds" $ do
237− specParserEq "docEmpty" docEmpty Nothing parser
293+ specParserEq "docSingleEmpty" docSingleEmpty Nothing parser
238 specParserEq "docSimple" docSimple (Just "content") parser
294 specParserEq "docSimple" docSimple (Just "content") parser
239 specParserEq "docMultiple" docMultiple (Just "content1") parser
295 specParserEq "docMultiple" docMultiple (Just "content1") parser
240 describe "fails" $ do
296 describe "fails" $ do
@@ -243,7 +299,7 @@ combinationsSpec = do
243 let parser = fmap join $ inElemMay "a" $ ignoreEmpty textFromDom
299 let parser = fmap join $ inElemMay "a" $ ignoreEmpty textFromDom
244 describe "succeeds" $ do
300 describe "succeeds" $ do
245 specParserEq "docNone" docNone Nothing parser
301 specParserEq "docNone" docNone Nothing parser
246− specParserEq "docEmpty" docEmpty Nothing parser
302+ specParserEq "docSingleEmpty" docSingleEmpty Nothing parser
247 specParserEq "docSimple" docSimple (Just "content") parser
303 specParserEq "docSimple" docSimple (Just "content") parser
248 specParserEq "docMultiple" docMultiple (Just "content1") parser
304 specParserEq "docMultiple" docMultiple (Just "content1") parser
@@ -271,14 +327,25 @@ contentSpec = do
271structSpec :: Spec
327structSpec :: Spec
272structSpec = do
328structSpec = do
273 describe "succeeds" $ do
329 describe "succeeds" $ do
274− let
330+ describe "dom structure" $ do
275− result = TestStructure
332+ result = TestStructure
276− { tsName = "name"
333+ { tsName = "name"
277− , tsInts = [1,2]
334+ , tsInts = [1,2]
278− , tsBools = pure True }
335+ , tsBools = pure True }
279− specParserEq "docStruct" docStruct result fromDom
336+ specParserEq "docStruct" docStruct result testStructureFromDom
337+ describe "attribute structure" $ do
339+ result = TestStructure
340+ { tsName = "structure"
342+ , tsBools = pure True }
343+ specParserEq "docAttrStruct" docAttrStruct result testStructureAttributes
280 describe "fails" $ do
344 describe "fails" $ do
345+ describe "dom structure" $ do
281− specParserFailed "docSimple" docSimple testStructureFromDom
346+ specParserFailed "docSimple" docSimple testStructureFromDom
347+ describe "attr structure" $ do
348+ specParserFailed "docNone" docNone testStructureAttributes
283main :: IO ()
350main :: IO ()
284main = hspec $ do
351main = hspec $ do