packages feed

yampa-test-0.14.12: tests/Test/FRP/Yampa/Arrow.hs

-- |
-- Description : Test cases for arrow helper functions.
-- Copyright   : (c) Ivan Perez, 2022
-- Authors     : Ivan Perez
module Test.FRP.Yampa.Arrow
    ( tests
    )
  where

-- External modules
import Test.QuickCheck       (Gen, Property, arbitrary, forAll, forAllBlind)
import Test.Tasty            (TestTree, testGroup)
import Test.Tasty.QuickCheck (testProperty)

-- External modules: Yampa
import FRP.Yampa as Yampa

tests :: TestTree
tests = testGroup "Regression tests for FRP.Yampa.Arrow"
  [ testProperty "dup (qc)"  testDup
  , testProperty "arr2 (qc)" testArr2
  , testProperty "arr3 (qc)" testArr3
  , testProperty "arr4 (qc)" testArr4
  , testProperty "arr5 (qc)" testArr5
  ]

-- * Arrow plumbing aids

testDup :: Property
testDup =
    forAll input $ \x ->
      (fst (dup x) == x) && (snd (dup x) == x)
  where
    input :: Gen Integer
    input = arbitrary

-- * Liftings

testArr2 :: Property
testArr2 =
    forAll input $ \x@(x1, x2) ->
    forAllBlind inputF $ \f ->
      arr2 f x == f x1 x2
  where
    input :: Gen (Integer, Integer)
    input = arbitrary

    inputF :: Gen (Integer -> Integer -> Integer)
    inputF = arbitrary

testArr3 :: Property
testArr3 =
    forAll input $ \x@(x1, x2, x3) ->
    forAllBlind inputF $ \f ->
      arr3 f x == f x1 x2 x3
  where
    input :: Gen (Integer, Integer, Integer)
    input = arbitrary

    inputF :: Gen (Integer -> Integer -> Integer -> Integer)
    inputF = arbitrary

testArr4 :: Property
testArr4 =
    forAll input $ \x@(x1, x2, x3, x4) ->
    forAllBlind inputF $ \f ->
      arr4 f x == f x1 x2 x3 x4
  where
    input :: Gen (Integer, Integer, Integer, Integer)
    input = arbitrary

    inputF :: Gen (Integer -> Integer -> Integer -> Integer -> Integer)
    inputF = arbitrary

testArr5 :: Property
testArr5 =
    forAll input $ \x@(x1, x2, x3, x4, x5) ->
    forAllBlind inputF $ \f ->
      arr5 f x == f x1 x2 x3 x4 x5
  where
    input :: Gen (Integer, Integer, Integer, Integer, Integer)
    input = arbitrary

    inputF :: Gen (  Integer
                  -> Integer
                  -> Integer
                  -> Integer
                  -> Integer
                  -> Integer
                  )
    inputF = arbitrary