-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathComposeTest.php
84 lines (67 loc) · 2.46 KB
/
ComposeTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
declare(strict_types = 1);
namespace Marcosh\EffectorTest;
use Eris\Generator;
use Eris\TestTrait;
use Marcosh\Effector\Compose;
use PHPUnit\Framework\TestCase;
final class ComposeTest extends TestCase
{
use TestTrait;
public function testComposeOfZeroPiecesIsTheIdentityFunction()
{
$this->forAll(
Generator\choose(0, 1000)
)->then(function ($number) {
$compose = Compose::pieces();
self::assertSame($number, $compose($number));
});
}
public function testComposeOFOnePieceIsTheIdentityFunctor()
{
$this->forAll(
Generator\choose(0, 1000),
Generator\choose(0, 1000)
)->then(function ($add, $number) {
$callable = function ($x) use ($add) {return $x + $add;};
$compose = Compose::pieces($callable);
self::assertSame($callable($number), $compose($number));
});
}
public function testComposeOnMultiplePiecesIsComposition()
{
$this->forAll(
Generator\choose(0, 1000),
Generator\choose(0, 1000),
Generator\choose(0, 1000)
)->then(function ($add, $mult, $number) {
$first = function ($x) use ($add) {return $x + $add;};
$second = function ($y) use ($mult) {return $y * $mult;};
$compose = Compose::pieces($first, $second);
self::assertSame(($number + $add) * $mult, $compose($number));
});
}
public function testComposeOfNotCallableThrowsInvalidArgumentException()
{
self::expectException(\TypeError::class);
self::expectExceptionMessage('Argument 1 passed to Marcosh\Effector\Compose::pieces() must be callable, integer given');
Compose::pieces(23);
}
public function testComposeIterable()
{
$this->forAll(
Generator\choose(0, 1000),
Generator\choose(0, 1000),
Generator\choose(0, 1000),
Generator\choose(0, 1000)
)->then(function ($add, $mult, $sub, $number) {
$iterable = (function () use ($add, $mult, $sub) {
yield function ($x) use ($add) {return $x + $add;};
yield function ($x) use ($mult) {return $x * $mult;};
yield function ($x) use ($sub) {return $x - $sub;};
})();
$compose = Compose::iterable($iterable);
self::assertSame((($number + $add) * $mult) - $sub, $compose($number));
});
}
}