packages feed

rhine-1.3: test/Except.hs

module Except where

-- tasty
import Test.Tasty

-- tasty-hunit
import Test.Tasty.HUnit

-- rhine
import FRP.Rhine
import Util (runScheduleRhinePure)

tests =
  testGroup
    "Except"
    [ testCase "Can raise and catch an exception" $ do
        let clsf = safely $ do
              try $ sinceInitS >>> throwOnCond (== 3) ()
              safe $ arr (const (-1))
        runScheduleRhinePure (clsf @@ FixedStep @1) (replicate 5 ()) @?= [Just 1, Just 2, Just (-1), Just (-1), Just (-1)]
    , testCase "Can raise and catch very many exceptions without steps in between" $ do
        let clsf = safely $ go 100000
            go n = do
              _ <- try $ throwOnCond (< n) ()
              go $ n - 1
            inputs = [0]
        runScheduleRhinePure (clsf @@ FixedStep @1) inputs @?= [Just 0]
    , testCase "Can raise, catch, and keep very many exceptions without steps in between" $ do
        let clsf = safely $ go 1000 []
            go n ns = do
              _ <- try $ throwOnCond (< n) () >>> arr (const ns)
              go (n - 1) (n : ns)
            inputs = [0]
        runScheduleRhinePure (clsf @@ FixedStep @1) inputs @?= [Just [1 .. 1000]]
    , testCase "Can raise, catch, and keep very many exceptions without steps in between, using Monad" $ do
        let clsf = safely $ go 1000 []
            go n ns = do
              n' <- try $ throwOnCond (< n) n >>> arr (const ns)
              go (n' - 1) (n' : ns)
            inputs = [0]
        runScheduleRhinePure (clsf @@ FixedStep @1) inputs @?= [Just [1 .. 1000]]
    ]