diff --git a/src/Predicates/objects.php b/src/Predicates/objects.php index e6ecbe7..61d0980 100644 --- a/src/Predicates/objects.php +++ b/src/Predicates/objects.php @@ -12,6 +12,8 @@ namespace Kadet\Functional\Predicates; use function Kadet\Functional\predicate; use Kadet\Functional\Predicate\ClosurePredicate; +use Kadet\Functional\Transforms as t; +use Kadet\Functional as f; /** * @param string $method @@ -22,11 +24,7 @@ use Kadet\Functional\Predicate\ClosurePredicate; */ function method(string $method, $predicate, ...$args) { - $predicate = predicate($predicate); - - return new ClosurePredicate(function ($object) use ($method, $predicate, $args) { - return $predicate($object->{$method}($args)); - }); + return predicate(f\pipe(t\method($method, ...$args), $predicate)); } /** @@ -35,18 +33,20 @@ function method(string $method, $predicate, ...$args) * * @return \Kadet\Functional\Predicate */ -function property(string $property, $predicate) { - $predicate = predicate($predicate); +function property(string $property, $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) diff --git a/tests/ObjectTransformsTest.php b/tests/ObjectTransformsTest.php new file mode 100644 index 0000000..ba8ec94 --- /dev/null +++ b/tests/ObjectTransformsTest.php @@ -0,0 +1,118 @@ + + * + * 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); + } +} \ No newline at end of file