/** * @test */ public function test_evaluate_object_field() { $obj = new Target\PrivateClass('aa', 'bb', 999, 12345, 'xyz'); $evaluator = new Strategy\ObjectFieldEvaluator($obj); $this->assertTrue($evaluator->hasField('a')); $this->assertFalse($evaluator->hasField('b')); $this->assertFalse($evaluator->hasField('c')); $this->assertFalse($evaluator->hasField('d')); $this->assertFalse($evaluator->hasField('e')); $this->assertFalse($evaluator->hasGetter('a')); $this->assertTrue($evaluator->hasGetter('b')); $this->assertFalse($evaluator->hasGetter('c')); $this->assertFalse($evaluator->hasGetter('d')); $this->assertFalse($evaluator->hasGetter('e')); $this->assertFalse($evaluator->hasGetter('getA')); $this->assertFalse($evaluator->hasGetter('getB')); $this->assertFalse($evaluator->hasGetter('getC')); $this->assertTrue($evaluator->hasGetter('getD')); $this->assertFalse($evaluator->hasGetter('getE')); $this->assertEquals([true, 'aa'], $evaluator->evaluateField('a')); $this->assertEquals([true, 'bb'], $evaluator->evaluateField('b')); $this->assertEquals([false, null], $evaluator->evaluateField('c')); $this->assertEquals([true, 12345], $evaluator->evaluateField('d')); $this->assertEquals([false, null], $evaluator->evaluateField('e')); }
/** * {inheritdoc} */ public function serialize($value, array $formatters) { if (!is_object($value)) { return []; } $evaluator = new ObjectFieldEvaluator($value); $value1 = $this->builtin !== null ? $this->builtin->serialize($value, $formatters) : []; $value2 = array_reduce(array_keys($this->strategies), function (&$tmp, $f) use($evaluator, $formatters) { list($valid, $v) = $evaluator->evaluateField($f); return $valid ? $tmp + [$f => $this->strategies[$f]->serialize($v, $formatters)] : $tmp; }, []); return $value1 + $value2; }