willow-0.1.0.0: test/Test/Willow/Property/DOM.hs
{-|
Description:
Copyright: (c) 2021 Samuel May
License: MPL-2.0
Maintainer: ag.eitilt@gmail.com
Stability: experimental
Portability: portable
-}
module Test.Willow.Property.DOM
( laws
, tests
) where
import qualified Hedgehog as H
import qualified Hedgehog.Classes as H.C
import qualified Hedgehog.Gen as H.G
import qualified Hedgehog.Range as H.R
import Web.Willow.DOM
import Test.Willow.Property.Common
tests :: [H.Group]
tests = []
laws :: IO Bool
laws = H.C.lawsCheckMany
[ ("Tree", treeLaws)
, ("Node", nodeLaws)
, ("NodeType", nodeTypeLaws)
, ("QuirksMode", quirksLaws)
, ("ElementParams", elementLaws)
, ("AttributeParams", attributeLaws)
, ("DocumentTypeParams", doctypeLaws)
]
basicLaws :: (Eq a, Show a, Read a) => H.Gen a -> [H.C.Laws]
basicLaws gen = map ($ gen)
[ H.C.eqLaws
, H.C.showLaws
, H.C.showReadLaws
]
genTree :: H.Gen Tree
genTree = return emptyTree
treeLaws :: [H.C.Laws]
treeLaws = basicLaws genTree
genNode :: H.Gen Node
genNode = H.G.choice
[ Text <$> genText
, Comment <$> genText
, DocumentType <$> genDoctype
, Element <$> genElement
, Attribute <$> genAttribute
, H.G.constant DocumentFragment
, Document <$> genQuirksMode
]
nodeLaws :: [H.C.Laws]
nodeLaws = basicLaws genNode
genNodeType :: H.Gen NodeType
genNodeType = H.G.enumBounded
nodeTypeLaws :: [H.C.Laws]
nodeTypeLaws = map ($ genNodeType)
[ H.C.eqLaws
, H.C.ordLaws
, H.C.showLaws
, H.C.showReadLaws
, H.C.boundedEnumLaws
]
genQuirksMode :: H.Gen QuirksMode
genQuirksMode = H.G.enumBounded
quirksLaws :: [H.C.Laws]
quirksLaws = map ($ genQuirksMode)
[ H.C.eqLaws
, H.C.ordLaws
, H.C.showLaws
, H.C.showReadLaws
, H.C.boundedEnumLaws
]
genElement :: H.Gen ElementParams
genElement = ElementParams
<$> H.G.maybe genText
<*> genText
<*> H.G.maybe genText
<*> fmap fromAttrList (H.G.list (H.R.linear 0 16) genAttribute)
elementLaws :: [H.C.Laws]
elementLaws = basicLaws genElement
genAttribute :: H.Gen AttributeParams
genAttribute = AttributeParams
<$> H.G.maybe genText
<*> genText
<*> H.G.maybe genText
<*> genText
attributeLaws :: [H.C.Laws]
attributeLaws = basicLaws genAttribute
genDoctype :: H.Gen DocumentTypeParams
genDoctype = DocumentTypeParams
<$> genText
<*> genText
<*> genText
doctypeLaws :: [H.C.Laws]
doctypeLaws = basicLaws genDoctype