module Saturn.Unstable.Type.WildcardSpec where

import qualified Data.Text.Lazy.Builder as Builder
import qualified Saturn.Unstable.Type.Wildcard as Wildcard
import qualified Test.Hspec as Hspec
import qualified Test.QuickCheck as QuickCheck
import qualified Text.Parsec as Parsec

spec :: Hspec.Spec
spec :: Spec
spec = forall a. HasCallStack => String -> SpecWith a -> SpecWith a
Hspec.describe String
"Saturn.Unstable.Type.Wildcard" forall a b. (a -> b) -> a -> b
$ do
  forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
Hspec.it String
"round trips"
    forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> [a]) -> (a -> prop) -> Property
QuickCheck.forAllShrink Gen Wildcard
arbitrary Wildcard -> [Wildcard]
shrink
    forall a b. (a -> b) -> a -> b
$ \Wildcard
x -> do
      forall s t a.
Stream s Identity t =>
Parsec s () a -> String -> s -> Either ParseError a
Parsec.parse forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Wildcard
Wildcard.parsec String
"" (Builder -> Text
Builder.toLazyText forall a b. (a -> b) -> a -> b
$ Wildcard -> Builder
Wildcard.toBuilder Wildcard
x)
        forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation
`Hspec.shouldBe` forall a b. b -> Either a b
Right Wildcard
x

arbitrary :: QuickCheck.Gen Wildcard.Wildcard
arbitrary :: Gen Wildcard
arbitrary = () -> Wildcard
Wildcard.fromUnit forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => Gen a
QuickCheck.arbitrary

shrink :: Wildcard.Wildcard -> [Wildcard.Wildcard]
shrink :: Wildcard -> [Wildcard]
shrink = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap () -> Wildcard
Wildcard.fromUnit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Arbitrary a => a -> [a]
QuickCheck.shrink forall b c a. (b -> c) -> (a -> b) -> a -> c
. Wildcard -> ()
Wildcard.toUnit