add transforms test

This commit is contained in:
Kacper Donat 2019-03-17 15:26:16 +01:00
parent 9e348d929c
commit fff1013711
2 changed files with 134 additions and 16 deletions

View File

@ -12,6 +12,8 @@ namespace Kadet\Functional\Predicates;
use function Kadet\Functional\predicate; use function Kadet\Functional\predicate;
use Kadet\Functional\Predicate\ClosurePredicate; use Kadet\Functional\Predicate\ClosurePredicate;
use Kadet\Functional\Transforms as t;
use Kadet\Functional as f;
/** /**
* @param string $method * @param string $method
@ -22,11 +24,7 @@ use Kadet\Functional\Predicate\ClosurePredicate;
*/ */
function method(string $method, $predicate, ...$args) function method(string $method, $predicate, ...$args)
{ {
$predicate = predicate($predicate); return predicate(f\pipe(t\method($method, ...$args), $predicate));
return new ClosurePredicate(function ($object) use ($method, $predicate, $args) {
return $predicate($object->{$method}($args));
});
} }
/** /**
@ -35,18 +33,20 @@ function method(string $method, $predicate, ...$args)
* *
* @return \Kadet\Functional\Predicate * @return \Kadet\Functional\Predicate
*/ */
function property(string $property, $predicate) { function property(string $property, $predicate)
$predicate = predicate($predicate); {
return predicate(f\pipe(t\property($property), $predicate));
}
return new ClosurePredicate(function ($object) use ($property, $predicate) { /**
if (isset($object->$property)) { * @param string $field
return $predicate($object->$property); * @param $predicate
} elseif (method_exists($object, $getter = 'get'.ucfirst($property))) { *
return $predicate($object->$getter()); * @return \Kadet\Functional\Predicate
} else { */
return false; function field(string $field, $predicate)
} {
}); return predicate(f\pipe(t\field($field), $predicate));
} }
function instance(string $class) function instance(string $class)

View File

@ -0,0 +1,118 @@
<?php
/**
* Copyright 2019 Kacper Donat
*
* @author Kacper "Kadet" Donat <kacper@kadet.net>
*
* Full license available in separate LICENSE file
*/
class PropertiesObject {
private $getter;
private $magic = [];
public $field = 'value';
public function __construct($field, $getter, array $magic = [])
{
$this->field = $field;
$this->getter = $getter;
$this->magic = $magic;
}
public function getValue()
{
return $this->getter;
}
public function __get($name)
{
return $this->magic[$name];
}
public function __toString()
{
return __CLASS__;
}
}
class ObjectTransformsTest extends \PHPUnit\Framework\TestCase
{
use RandomDataTrait;
/**
* @dataProvider randomDataProvider
*/
public function testFieldTransform($data = null)
{
$object = new PropertiesObject($data, null, []);
$transform = \Kadet\Functional\Transforms\field('field');
$this->assertSame($transform($object), $data);
}
/**
* @dataProvider randomDataProvider
*/
public function testFieldTransformMagic($data = null)
{
$object = new PropertiesObject(false, false, ['magic' => $data]);
$transform = \Kadet\Functional\Transforms\property('magic');
$this->assertSame($transform($object), $data);
}
/**
* @dataProvider randomDataProvider
*/
public function testPropertyTransformGetter($data = null)
{
$object = new PropertiesObject(false, $data, []);
$transform = \Kadet\Functional\Transforms\property('value');
$this->assertSame($transform($object), $data);
}
/**
* @dataProvider randomDataProvider
*/
public function testGetterTransform($data = null)
{
$object = new PropertiesObject(false, $data, []);
$transform = \Kadet\Functional\Transforms\getter('value');
$this->assertSame($transform($object), $data);
}
/**
* @dataProvider randomDataProvider
*/
public function testPropertyTransformField($data = null)
{
$object = new PropertiesObject($data, false, []);
$transform = \Kadet\Functional\Transforms\property('field');
$this->assertSame($transform($object), $data);
}
/**
* @dataProvider randomDataProvider
*/
public function testPropertyTransformMagic($data = null)
{
$object = new PropertiesObject(false, false, ['magic' => $data]);
$transform = \Kadet\Functional\Transforms\property('magic');
$this->assertSame($transform($object), $data);
}
/**
* @dataProvider randomDataProvider
*/
public function testMethodTransform($data = null)
{
$object = new PropertiesObject(false, false);
$transform = \Kadet\Functional\Transforms\method('__toString');
$this->assertSame($transform($object), PropertiesObject::class);
}
}