Generic test to verify if a type obey the applicative laws.
public static test ( callable $assertEqual, callable $pure, Widmogrod\FantasyLand\Applicative $u, Widmogrod\FantasyLand\Applicative $v, Widmogrod\FantasyLand\Applicative $w, callable $f, mixed $x ) | ||
$assertEqual | callable | Asserting function (Applicative $a1, Applicative $a2, $message) |
$pure | callable | Applicative "constructor" |
$u | Widmogrod\FantasyLand\Applicative | Applicative f => f (a -> b) |
$v | Widmogrod\FantasyLand\Applicative | Applicative f => f (a -> b) |
$w | Widmogrod\FantasyLand\Applicative | Applicative f => f (a -> b) |
$f | callable | (a -> b) |
$x | mixed | Value to put into a applicative |
/** * @dataProvider provideApplicativeTestData */ public function test_it_should_obey_applicative_laws(Applicative $u, Applicative $v, Applicative $w, callable $f, $x) { ApplicativeLaws::test(f\curryN(3, [$this, 'assertEquals']), f\curryN(1, Identity::of), $u, $v, $w, $f, $x); }
/** * @dataProvider provideApplicativeTestData */ public function test_it_should_obey_applicative_laws($pure, Applicative $u, Applicative $v, Applicative $w, callable $f, $x, $reader) { ApplicativeLaws::test(function (Reader $a, Reader $b, $message) use($reader) { $this->assertEquals($a->runReader($reader), $b->runReader($reader), $message); }, $pure, $u, $v, $w, $f, $x); }
/** * @dataProvider provideApplicativeTestData */ public function test_it_should_obey_applicative_laws($pure, Applicative $u, Applicative $v, Applicative $w, callable $f, $x) { ApplicativeLaws::test(function (Writer $a, Writer $b, $message) { $this->assertEquals($a->runWriter(), $b->runWriter(), $message); }, $pure, $u, $v, $w, $f, $x); }
/** * @dataProvider provideApplicativeTestData */ public function test_it_should_obey_applicative_laws($pure, Applicative $u, Applicative $v, Applicative $w, callable $f, $x, $state) { ApplicativeLaws::test(function (State $a, State $b, $message) use($state) { $this->assertEquals($a->runState($state), $b->runState($state), $message); }, f\curryN(1, $pure), $u, $v, $w, $f, $x); }