2{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3{-# LANGUAGE OverloadedStrings #-}
4{-# LANGUAGE ScopedTypeVariables #-}
5{-# LANGUAGE ViewPatterns #-}
7{-# OPTIONS_GHC -Wall -Werror -fno-warn-orphans #-}
9module Text.HTML.ParserSpec
12import qualified Data.Text as T
13import qualified Data.Text.Lazy as TL
14import qualified Data.Text.Lazy.Builder as B
17import Test.QuickCheck.Instances ()
18import Text.HTML.Parser
21instance Arbitrary Token where
22 arbitrary = oneof [validOpen, validClose, validFlat]
24 shrink (TagOpen n as) = TagOpen n <$> shrink as
25 shrink (TagClose _) = []
26 shrink (ContentText _) = []
27 shrink (ContentChar _) = []
28 shrink (Comment b) = Comment . B.fromText <$> (shrink . TL.toStrict . B.toLazyText $ b)
29 shrink (Doctype t) = Doctype <$> shrink t
31instance Arbitrary Attr where
32 arbitrary = Attr <$> validXmlTag <*> validXmlText
33 shrink (Attr k v) = Attr <$> shrink k <*> shrink v
36validOpen = TagOpen <$> validXmlTag <*> arbitrary
38validClose :: Gen Token
39validClose = TagClose <$> validXmlTag
43 [ ContentChar <$> validXmlChar
44 , ContentText <$> validXmlText
45 , Comment . B.fromText <$> validXmlText
46 , Doctype <$> validXmlText
49validXmlChar :: Gen Char
50validXmlChar = elements (' ' : ['a'..'z']) -- FIXME: generate wider range of values
52validXmlTag :: Gen T.Text
53validXmlTag = T.pack <$> sized (`maxListOf1` elements ['a'..'z']) -- FIXME: generate wider range of values
55validXmlText :: Gen T.Text
56validXmlText = mconcat <$> sized (`maxListOf` (T.cons <$> validXmlChar <*> validXmlTag)) -- FIXME: generate wider range of values
58maxListOf :: Int -> Gen a -> Gen [a]
59maxListOf n g = take n <$> listOf g
61maxListOf1 :: Int -> Gen a -> Gen [a]
62maxListOf1 (min 1 -> n) g = take n <$> listOf1 g
68 it "parseTokens and renderTokens are inverse" . property . forAllShrink arbitrary shrink $
69 \(canonicalizeTokens -> tokens)
70 -> (parseTokens . TL.toStrict . renderTokens $ tokens) `shouldBe` tokens
72 it "canonicalizeTokens is idempotent" . property . forAllShrink arbitrary shrink $
74 -> canonicalizeTokens tokens `shouldBe` canonicalizeTokens (canonicalizeTokens tokens)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list