packages feed

miso-css-0.0.1: test/Miso/Css/Test/StyleMock.hs

{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE RequiredTypeArguments #-}

module Miso.Css.Test.StyleMock
  ( module Miso.Css.Test.StyleMock
  , module X
  ) where

import Data.ByteString.Lazy qualified as L
import Data.ByteString.Char8 qualified as C8
import Miso.Css.Style.PostAppend as Post
import Miso.Css.Test.Prelude as X

domLbs :: forall m a en es r ei atrs kids cls ecs children.
  ( UnwrapBranches (MapMaybeFilterOutFullyMatchedHead '[] ecs) ~ '[]
  , DuplicatedIds kids ~ '[]
  ) =>
  E m a en es r ei atrs kids cls ecs children ->
  L.ByteString
domLbs = toHtml . toView

doNotTcNoBr :: forall m a en es r ei atrs kids cls ecs children.
  forall exDids -> (DuplicatedIds kids ~ exDids) =>
  forall exEcs -> (UnwrapBranches (MapMaybeFilterOutFullyMatchedHead '[] ecs) ~ exEcs) =>
  E m a en es r ei atrs kids cls ecs children ->
  TestTree
doNotTcNoBr _ _ _ =
  testCase "see type message from the checker" do
    () @?= ()

doNotTc :: forall m a en es r ei atrs kids cls ecs children.
  forall exDids -> (DuplicatedIds kids ~ exDids) =>
  forall exEcs -> (MapMaybeFilterOutFullyMatchedHead '[] ecs ~ exEcs) =>
  E m a en es r ei atrs kids cls ecs children ->
  TestTree
doNotTc _ _ _ =
  testCase "see type message from the checker" do
    () @?= ()

go :: forall m a en es r ei atrs kids cls ecs children.
  ( UnwrapBranches (MapMaybeFilterOutFullyMatchedHead '[] ecs) ~ '[]
  , DuplicatedIds kids ~ '[]
  ) =>
  L.ByteString -> E m a en es r ei atrs kids cls ecs children -> TestTree
go ex el =
  testCase (C8.unpack $ C8.toStrict ex) do
    domLbs el @?= ex

infixl 1 `go`

a :: OrClass '[] "a"
a = TopOrClass pa
b :: OrClass '[] "b"
b = TopOrClass pb
c :: OrClass '[] "c"
c = TopOrClass pc
d :: OrClass '[] "d"
d = TopOrClass pd
pul :: Proxy "ul"
pul = Proxy @"ul"
{- HLINT ignore "Use camelCase" -}
ul_a :: OrClass '[ '[ '(NowOrLater, '[T "ul"], '[], '[])]] "a"
ul_a = AddAncestorBranch (AddSubSegConstraint (Proxy @T) pul $ CssOrphan nol) a
-- #x .a
id_a :: OrClass '[ '[ '(NowOrLater, '[I "b"], '[], '[])]] "a"
id_a = AddAncestorBranch (AddSubSegConstraint (Proxy @I) pb $ CssOrphan nol) a
pa :: Proxy "a"
pa = Proxy @"a"
pb :: Proxy "b"
pb = Proxy @"b"
pc :: Proxy "c"
pc = Proxy @"c"
pd :: Proxy "d"
pd = Proxy @"d"

type Ai = ElementId "a"
type Bi = ElementId "b"
type Ci = ElementId "c"
type Di = ElementId "d"

nol_c :: OrClass '[ '[ '(NowOrLater, '[], '[], '[])]] "c"
nol_c = AddAncestorBranch (CssOrphan nol) c
jn_c :: OrClass '[ '[ '(JustNow, '[], '[], '[])]] "c"
jn_c =  AddAncestorBranch (CssOrphan jn) c

ac :: OrClass '[ '[ '(NowOrLater, '[C "a"], '[], '[])]] "c"
ac = AddAncestorBranch (AddSubSegConstraint (Proxy @C) pa $ CssOrphan nol) c

-- .a _ .b
ab :: OrClass '[ [ '(AutoClean, '[], '[], '[])
                 , '(NowOrLater, '[C "a"], '[], '[])
                 ] ] "b"
ab =
  AddAncestorBranch
  (   CssOrphan nol
  & ( AddSubSegConstraint (Proxy @C) pa
  >>> NextAncestor acn) ) b

-- .a _ .b _ .c
abc :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(NowOrLater, '[C "b"], '[], '[])
     , '(NowOrLater, '[C "a"], '[], '[])
     ] ] "c"
abc =
  AddAncestorBranch
  (   CssOrphan nol
  & ( AddSubSegConstraint (Proxy @C) pa
  >>> NextAncestor nol
  >>> AddSubSegConstraint (Proxy @C) pb
  >>> NextAncestor acn) )
  c
-- .a.b _ .c
ab_c :: OrClass '[['(AutoClean, '[], '[], '[]), '(NowOrLater, [C "b", C "a"], '[], '[])]] "c"
ab_c =
  AddAncestorBranch
  (   CssOrphan nol
  & ( AddSubSegConstraint (Proxy @C) pa
  >>> AddSubSegConstraint (Proxy @C) pb
  >>> NextAncestor acn) )
  c
-- .b.a _ .c
ba_c :: OrClass '[ '[ '(NowOrLater, [C "a", C "b"], '[], '[])]] "c"
ba_c =
  AddAncestorBranch
  (   CssOrphan nol
  & ( AddSubSegConstraint (Proxy @C) pb
  >>> AddSubSegConstraint (Proxy @C) pa) )
  c
-- #c.a _ .b
idC_and_a_b :: OrClass '[ '[ '(NowOrLater, [I "c", C "a"], '[], '[])]] "b"
idC_and_a_b =
  AddAncestorBranch
  (   CssOrphan nol
  & ( AddSubSegConstraint (Proxy @C) pa
  >>> AddSubSegConstraint (Proxy @I) pc) )
  b
ul_and_a_b :: OrClass '[ '[ '(NowOrLater, [T "ul", C "a"], '[], '[])]] "b"
ul_and_a_b =
  AddAncestorBranch
  (   CssOrphan nol
  & ( AddSubSegConstraint (Proxy @C) pa
  >>> AddSubSegConstraint (Proxy @T) pul) )
  b
-- id_a = AddAncestorBranch (AddSubSegConstraint (Proxy @I) pb $ CssOrphan nol) a
a_id_a :: OrClass '[ '[ '(AutoClean, '[I "a"], '[], '[])]] "a"
a_id_a =
  AddAncestorBranch (CssOrphan acn & AddSubSegConstraint (Proxy @I) pa) a

-- .a.b
a_next_to_b :: OrClass '[ '[ '(AutoClean, '[C "a"], '[], '[])]] "b"
a_next_to_b =
  AddAncestorBranch (CssOrphan acn & AddSubSegConstraint (Proxy @C) pa) b

-- .c > .a.b
c_dir_a_with_b :: OrClass
  '[ [ '(AutoClean, '[C "a"], '[], '[])
     , '(JustNow, '[C "c"], '[], '[])
     ] ] "b"
c_dir_a_with_b =
  AddAncestorBranch
  ( CssOrphan jn
  & (   AddSubSegConstraint (Proxy @C) pc
    >>> NextAncestor acn
    >>> AddSubSegConstraint (Proxy @C) pa))
  b

-- .b.a
b_next_to_a :: OrClass '[ '[ '(AutoClean, '[C "b"], '[], '[])]] "a"
b_next_to_a =
  AddAncestorBranch
  (AddSubSegConstraint (Proxy @C) pb $ CssOrphan acn) a
-- .a[a]
a_wants_a_attr :: OrClass '[ '[ '(AutoClean, '[A "a"], '[], '[])]] "a"
a_wants_a_attr = AddAncestorBranch (AddSubSegConstraint (Proxy @A) pa $ CssOrphan acn) a
-- [a] > .a
a_wants_a_attr_in_parent :: OrClass '[ '[ '(JustNow, '[A "a"], '[], '[])]] "a"
a_wants_a_attr_in_parent = AddAncestorBranch (AddSubSegConstraint (Proxy @A) pa $ CssOrphan jn) a

pdiv :: Proxy "div"
pdiv = Proxy @"div"
div_child :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[T "div"], '[], '[])
     ] ]   "div_child"
div_child = -- div > .div_child
  AddAncestorBranch
  (   CssOrphan jn
  & ( AddSubSegConstraint (Proxy @T) pdiv
  >>> NextAncestor acn) )
  (TopOrClass (Proxy @"div_child"))
div_ul_child :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[T "ul"], '[], '[])
     , '(JustNow, '[T "div"], '[], '[])
     ]
   ] "div_ul_child"
div_ul_child =
  AddAncestorBranch
  (   CssOrphan jn
  & ( AddSubSegConstraint (Proxy @T) pdiv
  >>> NextAncestor jn
  >>> AddSubSegConstraint (Proxy @T) pul
  >>> NextAncestor acn) )
  (TopOrClass (Proxy @"div_ul_child"))
-- .a > .b > .c
a_dir_b_dir_c :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[C "b"], '[], '[])
     , '(JustNow, '[C "a"], '[], '[])
     ]
   ] "c"
a_dir_b_dir_c =
  AddAncestorBranch
  (   CssOrphan jn
  & ( AddSubSegConstraint (Proxy @C) pa
  >>> NextAncestor jn
  >>> AddSubSegConstraint (Proxy @C) pb
  >>> NextAncestor acn) )
  c
-- .a > .b _ .c
a_dir_b_sp_c :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(NowOrLater, '[C "b"], '[], '[])
     , '(JustNow, '[C "a"], '[], '[])
     ] ] "c"
a_dir_b_sp_c =
  AddAncestorBranch
  (   CssOrphan jn
  & ( AddSubSegConstraint (Proxy @C) pa
  >>> NextAncestor nol
  >>> AddSubSegConstraint (Proxy @C) pb
  >>> NextAncestor acn) )
  c
-- .a _ .b > .c
a_sp_b_dir_c :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[C "b"], '[], '[])
     , '(NowOrLater, '[C "a"], '[], '[])
     ] ] "c"
a_sp_b_dir_c =
  AddAncestorBranch
  (   CssOrphan nol
  & ( AddSubSegConstraint (Proxy @C) pa
  >>> NextAncestor jn
  >>> AddSubSegConstraint (Proxy @C) pb
  >>> NextAncestor acn) )
  c

-- .a > .b > .c > .d
a_dir_b_dir_c_dir_d :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[C "c"], '[], '[])
     , '(JustNow, '[C "b"], '[], '[])
     , '(JustNow, '[C "a"], '[], '[])
     ]
   ] "d"
a_dir_b_dir_c_dir_d =
  AddAncestorBranch
  (   CssOrphan jn -- .a
  & ( AddSubSegConstraint (Proxy @C) pa
  >>> NextAncestor jn -- .b
  >>> AddSubSegConstraint (Proxy @C) pb
  >>> NextAncestor jn -- .c
  >>> AddSubSegConstraint (Proxy @C) pc
  >>> NextAncestor acn) )
  d
-- * > * > .c
star_dir_star_dir_c :: OrClass '[['(JustNow, '[], '[], '[]), '(JustNow, '[], '[], '[])]] "c"
star_dir_star_dir_c =
  AddAncestorBranch (CssOrphan jn & NextAncestor jn)
  c
-- .a > .b
a_dir_b :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[C "a"], '[], '[])
     ] ] "b"
a_dir_b =
  AddAncestorBranch
  (   CssOrphan jn
  & ( AddSubSegConstraint (Proxy @C) pa
  >>> NextAncestor acn) )
  b

-- .a > .b _ .c
a_dir_b_spc_c :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(NowOrLater, '[C "b"], '[], '[])
     , '(JustNow, '[C "a"], '[], '[])
     ] ] "c"
a_dir_b_spc_c =
  AddAncestorBranch
  (   CssOrphan jn
  & ( AddSubSegConstraint (Proxy @C) pa
  >>> NextAncestor nol
  >>> AddSubSegConstraint (Proxy @C) pb
  >>> NextAncestor acn) )
  c
-- .a + .b
a_dirSib_b :: OrClass
  '[ [ '(AutoClean,  '[], '[], '[])
     , '(NowOrLater, '[], '[], '[ '[ '(JustNow, '[C "a"])]])
     ] ] "b"
a_dirSib_b =
  AddAncestorBranch
    (   CssOrphan nol
    & ( AddSiblingBranch (AddSegToSibBranch (AddSib (Proxy @C) pa $ NilSib jn) NilSibBranch)
    >>> NextAncestor acn) )
    b
-- .a + .b + .c
a_dirSib_b_dirSib_c :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[], '[], '[ [ '(JustNow, '[C "b"])
                               , '(JustNow, '[C "a"]) ] ])
     ] ] "c"
a_dirSib_b_dirSib_c =
  AddAncestorBranch
    (   CssOrphan jn
    & ( AddSiblingBranch
        (   AddSegToSibBranch (AddSib (Proxy @C) pa $ NilSib jn)
        >>> AddSegToSibBranch (AddSib (Proxy @C) pb $ NilSib jn)
        $   NilSibBranch
        )
    >>> NextAncestor acn
      ) )
    c

-- .a ~ .b ~ .c
a_genSib_b_genSib_c :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[], '[], '[['(NowOrLater, '[C "b"]), '(NowOrLater, '[C "a"])]])
     ] ] "c"
a_genSib_b_genSib_c =
  AddAncestorBranch
    (   CssOrphan jn
    & ( AddSiblingBranch
        (   AddSegToSibBranch (AddSib (Proxy @C) pa $ NilSib nol)
        >>> AddSegToSibBranch (AddSib (Proxy @C) pb $ NilSib nol)
        $   NilSibBranch
        )
    >>> NextAncestor acn
      ) )
    c
-- _ .c > .a + .b
c_dir_a_dirSib_b :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[C "c"], '[], '[ '[ '(JustNow, '[C "a"])]]) ] ] "b"
c_dir_a_dirSib_b =
  AddAncestorBranch
    (   CssOrphan jn
    & ( AddSubSegConstraint (Proxy @C) pc
    >>> AddSiblingBranch (AddSegToSibBranch (AddSib (Proxy @C) pa $ NilSib jn) NilSibBranch)
    >>> NextAncestor acn) )
    b
-- _ | .c > .a + .b _ .d
c_dir_a_dirSib_b_spc_d :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(NowOrLater, '[C "b"], '[], '[])
     , '(JustNow, '[C "c"], '[], '[ '[ '(JustNow, '[C "a"])]])
     ] ] "d"
c_dir_a_dirSib_b_spc_d =
  AddAncestorBranch
    (   CssOrphan jn
    & ( AddSubSegConstraint (Proxy @C) pc
    >>> AddSiblingBranch (AddSegToSibBranch (AddSib (Proxy @C) pa $ NilSib jn) NilSibBranch)
    >>> NextAncestor nol
    >>> AddSubSegConstraint (Proxy @C) pb
    >>> NextAncestor acn) )
    d
-- .a.b > .c
a_with_b_dir_c :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, [C "b", C "a"], '[], '[])
     ] ] "c"
a_with_b_dir_c =
  AddAncestorBranch
    (   CssOrphan jn
    & ( AddSubSegConstraint (Proxy @C) pa
    >>> AddSubSegConstraint (Proxy @C) pb
    >>> NextAncestor acn) )
    c
-- .a.b + .c
a_with_b_dirSib_c :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[], '[], '[ '[ '(JustNow, [C "b", C "a"])]]) ] ] "c"
a_with_b_dirSib_c =
  AddAncestorBranch
    (   AddSiblingBranch (AddSegToSibBranch (AddSib (Proxy @C) pb $ AddSib (Proxy @C) pa $ NilSib jn) NilSibBranch)
    >>> NextAncestor acn
    $   CssOrphan jn ) -- or nol - does not matter
    c

pspan :: Proxy "span"
pspan = Proxy @"span"
pp :: Proxy "p"
pp = Proxy @"p"

-- _ | p ~ span > .a
p_genSib_span_dir_a =
  AddAncestorBranch
    (   CssOrphan jn    -- >
    & ( AddSiblingBranch
          (   AddSegToSibBranch (AddSib (Proxy @T) pp $ NilSib nol)
              NilSibBranch )
    >>> NextAncestor jn -- siblings
    >>> AddSubSegConstraint (Proxy @T) pspan
    >>> NextAncestor acn
      ) )
    a

-- _ | div + p ~ span > .a
div_dirSib_p_genSib_span_dir_a =
  AddAncestorBranch
    (   CssOrphan jn    -- >
    & ( AddSiblingBranch
          (   AddSegToSibBranch (AddSib (Proxy @T) pdiv $ NilSib jn)
          >>> AddSegToSibBranch (AddSib (Proxy @T) pp $ NilSib nol)
          $   NilSibBranch )
    >>> NextAncestor jn -- siblings
    >>> AddSubSegConstraint (Proxy @T) pspan
    >>> NextAncestor acn) )
    a

-- _ | div + p ~ span > .a + .b
div_dirSib_p_genSib_span_dir_a_dirSib_b :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[T "span"], '[], '[ '[ '(JustNow, '[C "a"])]])
     , '(JustNow, '[], '[], '[['(NowOrLater, '[T "p"]), '(JustNow, '[T "div"])]])
     ] ] "b"
div_dirSib_p_genSib_span_dir_a_dirSib_b =
  AddAncestorBranch
    (   CssOrphan jn    -- >
    & ( AddSiblingBranch
          (   AddSegToSibBranch (AddSib (Proxy @T) pdiv $ NilSib jn)
          >>> AddSegToSibBranch (AddSib (Proxy @T) pp $ NilSib nol)
          $   NilSibBranch )
    >>> NextAncestor jn -- siblings
    >>> AddSubSegConstraint (Proxy @T) pspan
    >>> AddSiblingBranch (AddSegToSibBranch (AddSib (Proxy @C) pa $ NilSib jn) NilSibBranch)
    >>> NextAncestor acn) )
    b

-- _ | div ~ p + span > .a + .b
div_genSib_p_dirSib_span_dir_a_dirSib_b :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[T "span"], '[], '[ '[ '(JustNow, '[C "a"])]])
     , '(JustNow, '[], '[], '[['(JustNow, '[T "p"]), '(NowOrLater, '[T "div"])]])
     ] ] "b"
div_genSib_p_dirSib_span_dir_a_dirSib_b =
  AddAncestorBranch
    (   CssOrphan jn    -- >
    & ( AddSiblingBranch
        (   NilSibBranch
        & ( AddSegToSibBranch (AddSib (Proxy @T) pdiv $ NilSib nol)
        >>> AddSegToSibBranch (AddSib (Proxy @T) pp $ NilSib jn) )
        )
    >>> NextAncestor jn -- siblings
    >>> AddSubSegConstraint (Proxy @T) pspan
    >>> AddSiblingBranch (AddSegToSibBranch (AddSib (Proxy @C) pa $ NilSib jn) NilSibBranch)
    >>> NextAncestor acn) )
    b

-- .a + .b > .c
a_dirSib_b_dir_c :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[C "b"], '[], '[])
     , '(JustNow, '[], '[], '[ '[ '(JustNow, '[C "a"]) ] ])
     ] ] "c"
a_dirSib_b_dir_c =
  AddAncestorBranch
    (   CssOrphan jn    -- >
    & ( AddSiblingBranch (AddSegToSibBranch (AddSib (Proxy @C) pa $ NilSib jn) NilSibBranch)
    >>> NextAncestor jn -- always jn for + or ~
    >>> AddSubSegConstraint (Proxy @C) pb
    >>> NextAncestor acn) )
    c

-- .a ~ .b
a_genSib_b :: OrClass
  '[ [ '(AutoClean,  '[], '[], '[])
     , '(JustNow, '[], '[], '[ '[ '(NowOrLater, '[C "a"]) ]])
     ] ] "b"
a_genSib_b =
  AddAncestorBranch
    (   CssOrphan jn -- nol is the same here
    & ( AddSiblingBranch (AddSegToSibBranch (AddSib (Proxy @C) pa $ NilSib nol) NilSibBranch)
    >>> NextAncestor acn) )
    b

-- .a ~ .b _ .c
a_genSib_b_spc_c :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(NowOrLater, '[C "b"], '[], '[])
     , '(NowOrLater, '[], '[], '[ '[ '(NowOrLater, '[C "a"])]])
     ] ] "c"
a_genSib_b_spc_c =
  AddAncestorBranch
    (   CssOrphan nol
    & ( AddSiblingBranch (AddSegToSibBranch (AddSib (Proxy @C) pa $ NilSib nol) NilSibBranch)
    >>> NextAncestor nol -- always nol for ~
    >>> AddSubSegConstraint (Proxy @C) pb
    >>> NextAncestor acn) )
    c

root_b :: OrClass '[ '[ '(NowOrLater, '[R], '[], '[])]] "b"
root_b =
  AddAncestorBranch
    (AddRoot $ CssOrphan nol)
    b
-- :root > body > .a > .b
root_dir_body_dir_a_dir_b :: OrClass
  '[ [ '(AutoClean, '[], '[], '[])
     , '(JustNow, '[C "a"], '[], '[])
     , '(JustNow, '[T BODY], '[], '[])
     , '(JustNow, '[R], '[], '[])
     ]
   ] "b"
root_dir_body_dir_a_dir_b =
  AddAncestorBranch
    (   CssOrphan jn
    & ( AddRoot
    >>> NextAncestor jn
    >>> AddSubSegConstraint (Proxy @T) (Proxy @BODY)
    >>> NextAncestor jn
    >>> AddSubSegConstraint (Proxy @C) pa
    >>> NextAncestor acn) )
    b