add transforms test
This commit is contained in:
parent
9e348d929c
commit
fff1013711
@ -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)) {
|
|
||||||
return $predicate($object->$property);
|
|
||||||
} elseif (method_exists($object, $getter = 'get'.ucfirst($property))) {
|
|
||||||
return $predicate($object->$getter());
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
/**
|
||||||
|
* @param string $field
|
||||||
|
* @param $predicate
|
||||||
|
*
|
||||||
|
* @return \Kadet\Functional\Predicate
|
||||||
|
*/
|
||||||
|
function field(string $field, $predicate)
|
||||||
|
{
|
||||||
|
return predicate(f\pipe(t\field($field), $predicate));
|
||||||
}
|
}
|
||||||
|
|
||||||
function instance(string $class)
|
function instance(string $class)
|
||||||
|
|||||||
118
tests/ObjectTransformsTest.php
Normal file
118
tests/ObjectTransformsTest.php
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user