module Saturn.Unstable.Type.WeekdaySpec where

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

arbitrary :: QuickCheck.Gen Weekday.Weekday
arbitrary :: Gen Weekday
arbitrary = forall a b. Gen a -> (a -> Maybe b) -> Gen b
QuickCheck.suchThatMap Gen Field
FieldSpec.arbitrary Field -> Maybe Weekday
Weekday.fromField

shrink :: Weekday.Weekday -> [Weekday.Weekday]
shrink :: Weekday -> [Weekday]
shrink = forall a b. (a -> Maybe b) -> [a] -> [b]
Maybe.mapMaybe Field -> Maybe Weekday
Weekday.fromField forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field -> [Field]
FieldSpec.shrink forall b c a. (b -> c) -> (a -> b) -> a -> c
. Weekday -> Field
Weekday.toField

new :: (MonadFail m) => [[Word.Word8]] -> m Weekday.Weekday
new :: forall (m :: * -> *). MonadFail m => [[Word8]] -> m Weekday
new [[Word8]]
xs = do
  Field
field <- forall (m :: * -> *). MonadFail m => [[Word8]] -> m Field
FieldSpec.new [[Word8]]
xs
  forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall (m :: * -> *) a. MonadFail m => String -> m a
fail forall a b. (a -> b) -> a -> b
$ String
"invalid Weekday: " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show [[Word8]]
xs) forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Field -> Maybe Weekday
Weekday.fromField Field
field