From 18241104e44ed98506a5a9f0af7c20f050abc387 Mon Sep 17 00:00:00 2001 From: widmogrod Date: Tue, 12 Dec 2017 22:12:03 +0100 Subject: [PATCH] Make Maybe Monoid tests more sain --- example/MaybeMonoidTest.php | 81 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 12 deletions(-) diff --git a/example/MaybeMonoidTest.php b/example/MaybeMonoidTest.php index 7ac72b2..6ff26f3 100644 --- a/example/MaybeMonoidTest.php +++ b/example/MaybeMonoidTest.php @@ -2,8 +2,12 @@ use Widmogrod\Functional as f; use Widmogrod\Monad\Maybe\Just; -use Widmogrod\Monad\Maybe\Nothing; +use Widmogrod\Monad\Maybe\Maybe; use Widmogrod\Primitive\Listt; +use Widmogrod\Primitive\Stringg; +use const Widmogrod\Monad\Maybe\maybeNull; +use function Widmogrod\Functional\map; +use function Widmogrod\Monad\Maybe\just; use function Widmogrod\Monad\Maybe\maybeNull; class MaybeMonoidTest extends \PHPUnit_Framework_TestCase @@ -11,34 +15,87 @@ class MaybeMonoidTest extends \PHPUnit_Framework_TestCase /** * @dataProvider provideData */ - public function test_it_should_concat_only_just_values($data, $expected) + public function test_it_should_concat_only_strings_and_skip_nulls(array $data, array $expected, string $asString) { - $makeMaybeMonoid = function ($val) { + $fullName = Listt::of($data) + ->map(maybeNull) + ->map(map(Stringg::of)) + ->reduce(f\concatM, just(Stringg::mempty())); + + $this->assertInstanceOf(Just::class, $fullName); + $this->assertEquals($fullName, just(Stringg::of($asString))); + } + + /** + * @dataProvider provideData + */ + public function test_it_should_concat_only_just_values_naive_string_implementation(array $data, array $expected, string $asString) + { + // $makeMaybeMonoid :: string -> Maybe Stringg + $makeMaybeMonoid = function ($val): Maybe { + return maybeNull($val)->map(Stringg::of); + }; + + // $names :: array Maybe Stringg + $names = array_values(array_map($makeMaybeMonoid, $data)); + + // $firstName :: Maybe Stringg + // $middleName :: Maybe Stringg + // $lastName :: Maybe Stringg + list($firstName, $middleName, $lastName) = $names; + + // $fullName :: Maybe Stringg + $fullName = $firstName->concat($middleName)->concat($lastName); + + $this->assertInstanceOf(Just::class, $fullName); + $this->assertEquals($fullName, just(Stringg::of($asString))); + } + + /** + * @dataProvider provideData + */ + public function test_it_should_concat_only_just_values_list_naive_implementation2(array $data, array $expected) + { + // $makeMaybeMonoid :: string -> Maybe Listt string + $makeMaybeMonoid = function ($val): Maybe { return maybeNull($val)->map(Listt::of); }; + // $names :: array Maybe Listt string $names = array_values(array_map($makeMaybeMonoid, $data)); + // $firstName :: Maybe Listt string + // $middleName :: Maybe Listt string + // $lastName :: Maybe Listt string list($firstName, $middleName, $lastName) = $names; + // $fullName :: Maybe Listt string $fullName = $firstName->concat($middleName)->concat($lastName); - $fullNameFromReduce = array_reduce($names, f\concatM, Nothing::mempty()); $this->assertInstanceOf(Just::class, $fullName); - $this->assertEquals($fullName->extract()->extract(), $expected); - $this->assertEquals($fullNameFromReduce->extract()->extract(), $expected); + $this->assertEquals($fullName, just(Listt::of($expected))); } public function provideData() { return [ - [ - '$data' => ['firstName' => 'First', 'middleName' => null, 'lastName' => 'Last'], - '$expected' => ['First', 'Last'] + 'array with null values' => [ + '$data' => [ + 'firstName' => 'First', + 'middleName' => null, + 'lastName' => 'Last' + ], + '$expected' => ['First', 'Last'], + '$asString' => 'FirstLast', ], - [ - '$data' => ['firstName' => 'First', 'middleName' => 'Middle', 'lastName' => 'Last'], - '$expected' => ['First', 'Middle', 'Last'] + 'array with strings' => [ + '$data' => [ + 'firstName' => 'First', + 'middleName' => 'Middle', + 'lastName' => 'Last' + ], + '$expected' => ['First', 'Middle', 'Last'], + '$asString' => 'FirstMiddleLast', ] ]; } -- 2.11.0