packages feed

css-parser-0.0.1: test/CssParser/Test/Arbitrary/Rule.hs

{-# OPTIONS_GHC -fconstraint-solver-iterations=24 #-}
{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE RecordWildCards #-}
module CssParser.Test.Arbitrary.Rule where

import CssParser.At.Supports ( FqFun )
import CssParser.At.Supports qualified as S
import CssParser.Ident
    ( CaseSensetivity, TagName(NoTag, AsteriskTag) )
import CssParser.Norm ( normUntilConst, Norm(..) )
import CssParser.Prelude
import CssParser.Rule
import CssParser.Rule.Pseudo ( Language(..), PseudoElement )
import CssParser.Rule.Value ( PropValsList(PropValsList) )
import CssParser.At.Import
    ( Import(ImportUrlSupports, ImportUrlLayer) )
import CssParser.Test.Arbitrary
import CssParser.Test.Arbitrary.At ()
import CssParser.Test.Arbitrary.Container ()
import CssParser.Test.Arbitrary.FontFeatureValues ()
import CssParser.Test.Arbitrary.FontPaletteValues ()
import CssParser.Test.Arbitrary.Function ()
import CssParser.Test.Arbitrary.Ident ()
import CssParser.Test.Arbitrary.Media ()
import CssParser.Test.Arbitrary.MonoPair ()
import Data.List ( null )

instance Arbitrary Language where
  arbitrary = Language <$> elements ["en", "af-ZA", "ar", "de", "ar-BH", "pl", "ru"]

isPartialTagSelector :: TagSelector -> Bool
isPartialTagSelector TagSelector {..} =
  tagName == NoTag && null tagSubSelectors

instance Arbitrary TagSelector where
  arbitrary = do
    ts <- genericArbitrary
    if isPartialTagSelector ts
      then pure ts { tagName = AsteriskTag }
      else pure ts
  shrink = filter (not . isPartialTagSelector) . genericShrink

instance Norm Selector where
  normalize = \case
    Selector _ fts ots -> Selector Nothing fts ots
    PeSelector _ fts ots pe -> PeSelector Nothing fts ots pe
    PeSelectorOnly pe -> PeSelectorOnly pe

instance Arbitrary Selector where
  arbitrary = normalize <$> genericArbitrary
  shrink x = fmap normalize (genericShrink x)

deriving via (GenericArbitrary TagRelation) instance Arbitrary TagRelation
deriving via (GenericArbitrary TagSubSelector) instance Arbitrary TagSubSelector

instance Norm CssRuleBodyItem where
  normalize = \case
    CssEnumLeaf pn (PropValsList (x :| [])) -> CssLeafRule pn x
    o -> o

deriving via (GenericArbitrary AtRule) instance Arbitrary AtRule
deriving via (GenericArbitrary CssRule) instance Arbitrary CssRule

instance Arbitrary CssRuleBodyItem where
  arbitrary = normalize <$> genericArbitrary
  shrink x = normalize <$>  genericShrink x

deriving via (GenericArbitrary AttrOp) instance Arbitrary AttrOp
deriving via (GenericArbitrary PseudoElement) instance Arbitrary PseudoElement
deriving via (GenericArbitrary CompositePe) instance Arbitrary CompositePe
deriving via (GenericArbitrary PseudeTagSelector) instance Arbitrary PseudeTagSelector
deriving via (GenericArbitrary CaseSensetivity) instance Arbitrary CaseSensetivity
deriving via (GenericArbitrary AtrPat) instance Arbitrary AtrPat

deriving via (GenericArbitrary (FqFun SelectorList)) instance Arbitrary (FqFun SelectorList)

instance Arbitrary FeatureQuery where
  arbitrary = normUntilConst <$> genericArbitrary
  shrink = normUntilConst <$> genericShrink

expandToParen :: FeatureQuery ->  FeatureQuery
expandToParen = \case
  S.FqParen x -> expandToParen x
  o -> o

instance Norm (Import SelectorList) where
  normalize = \case
    ImportUrlLayer src ln mfq mqs -> ImportUrlLayer src ln (expandToParen <$> mfq) mqs
    ImportUrlSupports src mfq mqs -> ImportUrlSupports src (expandToParen <$> mfq) mqs
    o -> o

instance Arbitrary (Import SelectorList) where
  arbitrary = normalize <$> genericArbitrary
  shrink = normalize <$> genericShrink