@@ -27,15 +27,8 @@ 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
30+instance FromDom TestStructure where
31−testStructureAttributes = do
31+ fromDom = testStructureFromDom
32− name <- getCurrentName
33− int <- parseAttribute "int" readContent
34− bool <- parseAttribute "bool" readBool
35− return $ TestStructure
36− { tsName = nameLocalName name
38− , tsBools = pure bool }
40docStruct :: Document
33docStruct :: Document
41docStruct = parseText_ def [lt|
34docStruct = parseText_ def [lt|
@@ -48,13 +41,6 @@ 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">
58docNone :: Document
44docNone :: Document
59docNone = parseText_ def [lt|
45docNone = parseText_ def [lt|
60<?xml version="1.0" encoding="utf-8"?>
46<?xml version="1.0" encoding="utf-8"?>
@@ -62,26 +48,8 @@ docNone = parseText_ def [lt|
65−docSimpleAttr :: Document
51+docEmpty :: 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"?>
83−docSingleEmpty :: Document
84−docSingleEmpty = parseText_ def [lt|
52+docEmpty = parseText_ def [lt|
85<?xml version="1.0" encoding="utf-8"?>
53<?xml version="1.0" encoding="utf-8"?>
@@ -156,7 +124,7 @@ specParser
156 :: String -- ^ Name of spec
124 :: String -- ^ Name of spec
157 -> Document -- ^ Document to parse
125 -> Document -- ^ Document to parse
158 -> (a -> Maybe String) -- ^ Value checker, Nothing if all ok
126 -> (a -> Maybe String) -- ^ Value checker, Nothing if all ok
159− -> DomParser Identity a -- ^ Parser itself
127+ -> DomParser Identity a -- ^ Parser itself
161specParser name doc check parser = it name $ do
129specParser name doc check parser = it name $ do
162 result <- either throwIO return $ runDomParser doc parser
130 result <- either throwIO return $ runDomParser doc parser
@@ -166,9 +134,9 @@ specParser name doc check parser = it name $ do
167specParserEq
135specParserEq
168 :: (Eq a, Show a)
136 :: (Eq a, Show a)
169− => String -- ^ Name of spec
137+ => String -- ^ Name of spec
170− -> Document -- ^ Document to parse
138+ -> Document -- ^ Document to parse
171− -> a -- ^ Value parser should return
139+ -> a -- ^ Value parser should return
172 -> DomParser Identity a -- ^ Parser itself
140 -> DomParser Identity a -- ^ Parser itself
174specParserEq name doc a parser = specParser name doc check parser
142specParserEq name doc a parser = specParser name doc check parser
@@ -193,7 +161,7 @@ specParserFailedPath
193 :: (Show a)
161 :: (Show a)
194 => String -- ^ Name of spec
162 => String -- ^ Name of spec
195 -> Document
163 -> Document
196− -> DomPath -- ^ Expteced path in error
164+ -> [Text] -- ^ Expteced path in error
197 -> DomParser Identity a
165 -> DomParser Identity a
199specParserFailedPath name doc path parser = it name $ example $ do
167specParserFailedPath name doc path parser = it name $ example $ do
@@ -208,37 +176,13 @@ specParserFailedPath name doc path parser = it name $ example $ do
208combinationsSpec :: Spec
176combinationsSpec :: Spec
209combinationsSpec = do
177combinationsSpec = do
210 describe "inElem" $ do
178 describe "inElem" $ do
179+ let parser = inElem "a" textFromDom
211 describe "succeeds" $ do
180 describe "succeeds" $ do
212− describe "simple" $ do
213− let parser = inElem "a" textFromDom
214− specParserEq "docSimple" docSimple "content" parser
181+ specParserEq "docSimple" docSimple "content" parser
215− specParserEq "docMultiple" docMultiple "content1" parser
182+ 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
221− describe "fails" $ do
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− (DomPath ["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
183 describe "fails" $ do
241− specParserFailed "docNone" docNone $ parseAttribute "attr" Right
184+ specParserFailed "docNone" docNone parser
185+ specParserFailed "docEmpty" docEmpty parser
243 describe "inElemAll" $ do
187 describe "inElemAll" $ do
244 let parser = inElemAll "a" textFromDom
188 let parser = inElemAll "a" textFromDom
@@ -248,7 +192,7 @@ combinationsSpec = do
248 specParserEq "docMultiple" docMultiple
192 specParserEq "docMultiple" docMultiple
249 ["content1", "content2", "content3"] parser
193 ["content1", "content2", "content3"] parser
250 describe "fails" $ do
194 describe "fails" $ do
251− specParserFailed "docSingleEmpty" docSingleEmpty parser
195+ specParserFailed "docEmpty" docEmpty parser
253 describe "inElemMay" $ do
197 describe "inElemMay" $ do
254 let parser = inElemMay "a" textFromDom
198 let parser = inElemMay "a" textFromDom
@@ -257,7 +201,7 @@ combinationsSpec = do
257 specParserEq "docSimple" docSimple (Just "content") parser
201 specParserEq "docSimple" docSimple (Just "content") parser
258 specParserEq "docMultiple" docMultiple (Just "content1") parser
202 specParserEq "docMultiple" docMultiple (Just "content1") parser
259 describe "fails" $ do
203 describe "fails" $ do
260− specParserFailed "docSingleEmpty" docSingleEmpty parser
204+ specParserFailed "docEmpty" docEmpty parser
262 describe "inElemNe" $ do
206 describe "inElemNe" $ do
263 let parser = inElemNe "a" textFromDom
207 let parser = inElemNe "a" textFromDom
@@ -267,7 +211,7 @@ combinationsSpec = do
267 (NE.fromList ["content1", "content2", "content3"]) parser
211 (NE.fromList ["content1", "content2", "content3"]) parser
268 describe "fails" $ do
212 describe "fails" $ do
269 specParserFailed "docNone" docNone parser
213 specParserFailed "docNone" docNone parser
270− specParserFailed "docSingleEmpty" docSingleEmpty parser
214+ specParserFailed "docEmpty" docEmpty parser
272 describe "diveElem" $ do
216 describe "diveElem" $ do
273 describe "single element" $ do
217 describe "single element" $ do
@@ -276,7 +220,7 @@ combinationsSpec = do
276 specParserEq "docDeepMultiple1" docDeepMultiple1 "content1" parser
220 specParserEq "docDeepMultiple1" docDeepMultiple1 "content1" parser
277 specParserEq "docDeepMultiple2" docDeepMultiple2 "content1" parser
221 specParserEq "docDeepMultiple2" docDeepMultiple2 "content1" parser
278 describe "fails" $ do
222 describe "fails" $ do
279− specParserFailedPath "docSimple" docSimple (DomPath ["root", "a", "b"]) parser
223+ specParserFailedPath "docSimple" docSimple ["root", "a", "b"] parser
280 describe "multiple elements" $ do
224 describe "multiple elements" $ do
282 parser = diveElem "a" $ inElemAll "b" textFromDom
226 parser = diveElem "a" $ inElemAll "b" textFromDom
@@ -290,7 +234,7 @@ combinationsSpec = do
290 describe "mandatory element" $ do
234 describe "mandatory element" $ do
291 let parser = inElem "a" $ ignoreEmpty textFromDom
235 let parser = inElem "a" $ ignoreEmpty textFromDom
292 describe "succeeds" $ do
236 describe "succeeds" $ do
293− specParserEq "docSingleEmpty" docSingleEmpty Nothing parser
237+ specParserEq "docEmpty" docEmpty Nothing parser
294 specParserEq "docSimple" docSimple (Just "content") parser
238 specParserEq "docSimple" docSimple (Just "content") parser
295 specParserEq "docMultiple" docMultiple (Just "content1") parser
239 specParserEq "docMultiple" docMultiple (Just "content1") parser
296 describe "fails" $ do
240 describe "fails" $ do
@@ -299,7 +243,7 @@ combinationsSpec = do
299 let parser = fmap join $ inElemMay "a" $ ignoreEmpty textFromDom
243 let parser = fmap join $ inElemMay "a" $ ignoreEmpty textFromDom
300 describe "succeeds" $ do
244 describe "succeeds" $ do
301 specParserEq "docNone" docNone Nothing parser
245 specParserEq "docNone" docNone Nothing parser
302− specParserEq "docSingleEmpty" docSingleEmpty Nothing parser
246+ specParserEq "docEmpty" docEmpty Nothing parser
303 specParserEq "docSimple" docSimple (Just "content") parser
247 specParserEq "docSimple" docSimple (Just "content") parser
304 specParserEq "docMultiple" docMultiple (Just "content1") parser
248 specParserEq "docMultiple" docMultiple (Just "content1") parser
@@ -311,9 +255,9 @@ combinationsSpec = do
311 inElem "a" $ do
255 inElem "a" $ do
312 checkCurrentName "a"
256 checkCurrentName "a"
313 describe "fails" $ do
257 describe "fails" $ do
314− specParserFailedPath "root element" docSimple (DomPath ["toor"]) $ do
258+ specParserFailedPath "root element" docSimple ["toor"] $ do
315 checkCurrentName "toor"
259 checkCurrentName "toor"
316− specParserFailedPath "inner element" docSimple (DomPath ["root", "b"]) $ do
260+ specParserFailedPath "inner element" docSimple ["root", "b"] $ do
317 inElem "a" $ checkCurrentName "b"
261 inElem "a" $ checkCurrentName "b"
319contentSpec :: Spec
263contentSpec :: Spec
@@ -327,25 +271,14 @@ contentSpec = do
327structSpec :: Spec
271structSpec :: Spec
328structSpec = do
272structSpec = do
329 describe "succeeds" $ do
273 describe "succeeds" $ do
330− describe "dom structure" $ do
274+ let
332− result = TestStructure
275+ result = TestStructure
333− { tsName = "name"
276+ { tsName = "name"
334− , tsInts = [1,2]
277+ , tsInts = [1,2]
335− , tsBools = pure True }
278+ , tsBools = pure True }
336− specParserEq "docStruct" docStruct result testStructureFromDom
279+ specParserEq "docStruct" docStruct result fromDom
337− describe "attribute structure" $ do
339− result = TestStructure
340− { tsName = "structure"
342− , tsBools = pure True }
343− specParserEq "docAttrStruct" docAttrStruct result testStructureAttributes
344 describe "fails" $ do
280 describe "fails" $ do
345− describe "dom structure" $ do
346− specParserFailed "docSimple" docSimple testStructureFromDom
281+ specParserFailed "docSimple" docSimple testStructureFromDom
347− describe "attr structure" $ do
348− specParserFailed "docNone" docNone testStructureAttributes
350main :: IO ()
283main :: IO ()
351main = hspec $ do
284main = hspec $ do