git.iko.soy/typeable/html-parse
on master help sign in
46 lines 1.3 kB history raw
1{-# LANGUAGE FlexibleInstances #-}
2{-# LANGUAGE OverloadedStrings #-}
3{-# LANGUAGE ScopedTypeVariables #-}
5{-# OPTIONS_GHC -Wall -Werror -fno-warn-orphans #-}
7module Text.HTML.TreeSpec
8where
10import Control.Applicative
11import Data.Tree
12import Test.Hspec
13import Test.QuickCheck
14import Test.QuickCheck.Instances ()
15import Text.HTML.Parser
16import Text.HTML.ParserSpec
17import Text.HTML.Tree
18import Prelude
21arbitraryTokenForest :: Gen (Forest Token)
22arbitraryTokenForest = listOf arbitraryTokenTree
24arbitraryTokenTree :: Gen (Tree Token)
25arbitraryTokenTree = oneof
26 [ Node <$> validClosingOpen <*> scale (`div` 5) arbitraryTokenForest
27 , Node <$> validNonClosingOpen <*> pure []
28 , Node <$> validFlat <*> pure []
29 ]
32validNonClosingOpen :: Gen Token
33validNonClosingOpen = TagOpen <$> elements nonClosing <*> arbitrary
35validClosingOpen :: Gen Token
36validClosingOpen = do
37 n <- validXmlTagName
38 let n' = if n `elem` nonClosing then "_" else n
39 TagOpen n' <$> arbitrary
42spec :: Spec
43spec = do
44 it "parseTokenForests and renderTokenForest are inverses"
45 . property . forAllShrink arbitraryTokenForest shrink $
46 \forest -> tokensToForest (tokensFromForest forest) `shouldBe` Right forest