{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Main where
import Control.Applicative (Alternative)
import Data.Monoid (Sum)
import Data.Set as Set
import Test.Hspec
import Test.QuickCheck.Classes.Hspec
import Shpadoinkle.Widgets.Form.Dropdown
import Shpadoinkle.Widgets.Types
instance Show (a -> b) where
show _ = "(a -> b)"
main :: IO ()
main = hspec $ do
describe "Set" $ legal @SetLike @Set
describe "Toggle" $ do
legal @Eq @Toggle
legal @Ord @Toggle
legal @Show @Toggle
legal @Semigroup @Toggle
legal @Monoid @Toggle
describe "Hover" $ do
legal @Eq @Hover
legal @Ord @Hover
legal @Show @Hover
legal @Semigroup @Hover
legal @Monoid @Hover
describe "Hygiene" $ do
legal @Eq @Hygiene
legal @Ord @Hygiene
legal @Show @Hygiene
legal @Semigroup @Hygiene
legal @Monoid @Hygiene
describe "Remote" $ do
legal @Eq @(Remote Int Int)
legal @Ord @(Remote Int Int)
legal @Show @(Remote Int Int)
legal @Monoid @(Remote Int (Sum Int))
legal @Functor @(Remote Int)
legal @Applicative @(Remote Int)
legal @Monad @(Remote Int)
legal @Alternative @(Remote Int)
legal @Foldable @(Remote Int)
describe "Input" $ do
legal @Eq @(Input (Sum Int))
legal @Ord @(Input (Sum Int))
legal @Show @(Input (Sum Int))
legal @Monoid @(Input (Sum Int))
legal @Functor @Input
legal @Applicative @Input
legal @Monad @Input
legal @Foldable @Input
describe "Validated" $ do
legal @Eq @(Validated Int Int)
legal @Ord @(Validated Int Int)
legal @Show @(Validated Int Int)
legal @Semigroup @(Validated Int Int)
legal @Functor @(Validated Int)
legal @Applicative @(Validated Int)
legal @Monad @(Validated Int)
legal @Foldable @(Validated Int)
describe "Choice" $ do
describe "'One" $ do
legal @Eq @(Choice 'One Int)
legal @Ord @(Choice 'One Int)
legal @Show @(Choice 'One Int)
legal @Semigroup @(Choice 'One (Sum Int))
legal @Monoid @(Choice 'One (Sum Int))
legal @SetLike @(Choice 'One)
legal @Foldable @(Choice 'One)
legal @(Selection Choice) @'One
legal @(Deselection Choice) @'One
describe "'AtleastOne" $ do
legal @Eq @(Choice 'AtleastOne Int)
legal @Ord @(Choice 'AtleastOne Int)
legal @Show @(Choice 'AtleastOne Int)
legal @Semigroup @(Choice 'AtleastOne (Sum Int))
legal @SetLike @(Choice 'AtleastOne)
legal @Foldable @(Choice 'AtleastOne)
legal @(Selection Choice) @'AtleastOne
describe "'Many" $ do
legal @Eq @(Choice 'Many Int)
legal @Ord @(Choice 'Many Int)
legal @Show @(Choice 'Many Int)
legal @Semigroup @(Choice 'Many (Sum Int))
legal @Monoid @(Choice 'Many (Sum Int))
legal @SetLike @(Choice 'Many)
legal @Foldable @(Choice 'Many)
legal @(Selection Choice) @'Many
legal @(Deselection Choice) @'Many
describe "ConsideredChoice" $ do
describe "'One" $ do
legal @Eq @(ConsideredChoice 'One Int)
legal @Ord @(ConsideredChoice 'One Int)
legal @Show @(ConsideredChoice 'One Int)
legal @Semigroup @(ConsideredChoice 'One (Sum Int))
legal @Monoid @(ConsideredChoice 'One (Sum Int))
legal @SetLike @(ConsideredChoice 'One)
legal @Foldable @(ConsideredChoice 'One)
legal @(Selection ConsideredChoice) @'One
legal @(Deselection ConsideredChoice) @'One
describe "'AtleastOne" $ do
legal @Eq @(ConsideredChoice 'AtleastOne Int)
legal @Ord @(ConsideredChoice 'AtleastOne Int)
legal @Show @(ConsideredChoice 'AtleastOne Int)
legal @Semigroup @(ConsideredChoice 'AtleastOne (Sum Int))
legal @SetLike @(ConsideredChoice 'AtleastOne)
legal @Foldable @(ConsideredChoice 'AtleastOne)
legal @(Selection ConsideredChoice) @'AtleastOne
describe "'Many" $ do
legal @Eq @(ConsideredChoice 'Many Int)
legal @Ord @(ConsideredChoice 'Many Int)
legal @Show @(ConsideredChoice 'Many Int)
legal @Semigroup @(ConsideredChoice 'Many (Sum Int))
legal @Monoid @(ConsideredChoice 'Many (Sum Int))
legal @SetLike @(ConsideredChoice 'Many)
legal @Foldable @(ConsideredChoice 'Many)
legal @(Selection ConsideredChoice) @'Many
legal @(Deselection ConsideredChoice) @'Many
describe "Dropdown" $ do
describe "'One" $ do
legal @Eq @(Dropdown 'One Int)
legal @Ord @(Dropdown 'One Int)
legal @Show @(Dropdown 'One Int)
legal @Semigroup @(Dropdown 'One (Sum Int))
legal @Monoid @(Dropdown 'One (Sum Int))
legal @SetLike @(Dropdown 'One)
legal @Foldable @(Dropdown 'One)
legal @(Selection Dropdown) @'One
legal @(Deselection Dropdown) @'One
describe "'AtleastOne" $ do
legal @Eq @(Dropdown 'AtleastOne Int)
legal @Ord @(Dropdown 'AtleastOne Int)
legal @Show @(Dropdown 'AtleastOne Int)
legal @Semigroup @(Dropdown 'AtleastOne (Sum Int))
legal @SetLike @(Dropdown 'AtleastOne)
legal @Foldable @(Dropdown 'AtleastOne)
legal @(Selection Dropdown) @'AtleastOne
describe "'Many" $ do
legal @Eq @(Dropdown 'Many Int)
legal @Ord @(Dropdown 'Many Int)
legal @Show @(Dropdown 'Many Int)
legal @Semigroup @(Dropdown 'Many (Sum Int))
legal @Monoid @(Dropdown 'Many (Sum Int))
legal @SetLike @(Dropdown 'Many)
legal @Foldable @(Dropdown 'Many)
legal @(Selection Dropdown) @'Many
legal @(Deselection Dropdown) @'Many