module Saturn.Unstable.Type.NumberSpec where

import qualified Data.Text.Lazy.Builder as Builder
import qualified Saturn.Unstable.Type.Number as Number
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.Number" 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 Number
arbitrary Number -> [Number]
shrink
    forall a b. (a -> b) -> a -> b
$ \Number
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 Number
Number.parsec String
"" (Builder -> Text
Builder.toLazyText forall a b. (a -> b) -> a -> b
$ Number -> Builder
Number.toBuilder Number
x)
        forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation
`Hspec.shouldBe` forall a b. b -> Either a b
Right Number
x

arbitrary :: QuickCheck.Gen Number.Number
arbitrary :: Gen Number
arbitrary = Word8 -> Number
Number.fromWord8 forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => Gen a
QuickCheck.arbitrary

shrink :: Number.Number -> [Number.Number]
shrink :: Number -> [Number]
shrink = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Word8 -> Number
Number.fromWord8 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
. Number -> Word8
Number.toWord8