module Saturn.Unstable.RenderSpec where

import qualified Saturn.Unstable.Render as Render
import qualified Saturn.Unstable.Type.ScheduleSpec as ScheduleSpec
import qualified Test.Hspec as Hspec

spec :: Hspec.Spec
spec :: Spec
spec = String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
Hspec.describe String
"Saturn.Unstable.Render" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
Hspec.describe String
"toString" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    String -> IO () -> SpecWith (Arg (IO ()))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
Hspec.it String
"works with wildcards" (IO () -> SpecWith (Arg (IO ())))
-> IO () -> SpecWith (Arg (IO ()))
forall a b. (a -> b) -> a -> b
$ do
      Schedule
schedule <- [[Word8]]
-> [[Word8]] -> [[Word8]] -> [[Word8]] -> [[Word8]] -> IO Schedule
forall (m :: * -> *).
MonadFail m =>
[[Word8]]
-> [[Word8]] -> [[Word8]] -> [[Word8]] -> [[Word8]] -> m Schedule
ScheduleSpec.new [] [] [] [] []
      Schedule -> String
Render.toString Schedule
schedule String -> String -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`Hspec.shouldBe` String
"* * * * *"

    String -> IO () -> SpecWith (Arg (IO ()))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
Hspec.it String
"works with numbers" (IO () -> SpecWith (Arg (IO ())))
-> IO () -> SpecWith (Arg (IO ()))
forall a b. (a -> b) -> a -> b
$ do
      Schedule
schedule <- [[Word8]]
-> [[Word8]] -> [[Word8]] -> [[Word8]] -> [[Word8]] -> IO Schedule
forall (m :: * -> *).
MonadFail m =>
[[Word8]]
-> [[Word8]] -> [[Word8]] -> [[Word8]] -> [[Word8]] -> m Schedule
ScheduleSpec.new [[Word8
4]] [[Word8
3]] [[Word8
2]] [[Word8
1]] [[Word8
0]]
      Schedule -> String
Render.toString Schedule
schedule String -> String -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`Hspec.shouldBe` String
"4 3 2 1 0"

    String -> IO () -> SpecWith (Arg (IO ()))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
Hspec.it String
"works with ranges" (IO () -> SpecWith (Arg (IO ())))
-> IO () -> SpecWith (Arg (IO ()))
forall a b. (a -> b) -> a -> b
$ do
      Schedule
schedule <- [[Word8]]
-> [[Word8]] -> [[Word8]] -> [[Word8]] -> [[Word8]] -> IO Schedule
forall (m :: * -> *).
MonadFail m =>
[[Word8]]
-> [[Word8]] -> [[Word8]] -> [[Word8]] -> [[Word8]] -> m Schedule
ScheduleSpec.new [[Word8
8, Word8
9]] [[Word8
6, Word8
7]] [[Word8
4, Word8
5]] [[Word8
2, Word8
3]] [[Word8
0, Word8
1]]
      Schedule -> String
Render.toString Schedule
schedule String -> String -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`Hspec.shouldBe` String
"8-9 6-7 4-5 2-3 0-1"

    String -> IO () -> SpecWith (Arg (IO ()))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
Hspec.it String
"works with choices" (IO () -> SpecWith (Arg (IO ())))
-> IO () -> SpecWith (Arg (IO ()))
forall a b. (a -> b) -> a -> b
$ do
      Schedule
schedule <- [[Word8]]
-> [[Word8]] -> [[Word8]] -> [[Word8]] -> [[Word8]] -> IO Schedule
forall (m :: * -> *).
MonadFail m =>
[[Word8]]
-> [[Word8]] -> [[Word8]] -> [[Word8]] -> [[Word8]] -> m Schedule
ScheduleSpec.new [[Word8
8], [Word8
9]] [[Word8
6], [Word8
7]] [[Word8
4], [Word8
5]] [[Word8
2], [Word8
3]] [[Word8
0], [Word8
1]]
      Schedule -> String
Render.toString Schedule
schedule String -> String -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`Hspec.shouldBe` String
"8,9 6,7 4,5 2,3 0,1"