diff --git a/src/Snapshot/ObjectSnapshot.php b/src/Snapshot/ObjectSnapshot.php index eb19122..a97b021 100644 --- a/src/Snapshot/ObjectSnapshot.php +++ b/src/Snapshot/ObjectSnapshot.php @@ -41,18 +41,14 @@ public function __construct($object) $this->raw = $object; $this->oid = spl_object_hash($object); - $refl = new ReflectionObject($object); - if (method_exists('\\ReflectionObject', 'isCloneable') && $refl->isCloneable()) { - $this->raw = clone $object; - } + $export = (array) $object; + $class = get_class($object); - /** @var \ReflectionProperty $reflProperty */ - foreach ($refl->getProperties() as $reflProperty) { - $reflProperty->setAccessible(true); - $value = $reflProperty->getValue($object); + foreach ($export as $property => $value) { + $property = str_replace(["\x00*\x00", "\x00{$class}\x00"], '', $property); // not accessible properties - $this->data[$reflProperty->getName()] = $value; + $this->data[$property] = $value; } parent::normalize(); diff --git a/test/Snapshot/ObjectSnapshotTest.php b/test/Snapshot/ObjectSnapshotTest.php index 3beae19..fbaf2f1 100644 --- a/test/Snapshot/ObjectSnapshotTest.php +++ b/test/Snapshot/ObjectSnapshotTest.php @@ -48,19 +48,52 @@ public function testConstructWithoutObject() new ObjectSnapshot([]); } - /** - * @dataProvider deepProvider - */ - public function testDeepConstructor($value) + public function testExportAllProperties() { - new ObjectSnapshot((object) ['foo' => $value]); + $snapshot = new ObjectSnapshot(new Foo('foo', 'bar', 'baz')); + $data = $snapshot->getComparableData(); + + $this->assertCount(3, $data); + + $this->assertArrayHasKey('foo', $data); + $this->assertArrayHasKey('bar', $data); + $this->assertArrayHasKey('baz', $data); + + $this->assertSame('foo', $data['foo']); + $this->assertSame('bar', $data['bar']); + $this->assertSame('baz', $data['baz']); } - public function deepProvider() + public function testDeepConstructor() { - return [[(object) ['bar' => 'baz']], - [['bar' => 'baz']], - ['fubar']]; + $object = new Foo( + (object) ['foo' => 'bar'], // object + ['baz' => 'fubar'], // array + 'fubaz' // scalar + ); + + $snapshot = new ObjectSnapshot($object); + $data = $snapshot->getComparableData(); + + $this->assertInstanceOf('Totem\\Snapshot\\ObjectSnapshot', $data['foo']); + $this->assertInstanceOf('Totem\\Snapshot\\ArraySnapshot', $data['bar']); + $this->assertNotInstanceOf('Totem\\AbstractSnapshot', $data['baz']); } } +// todo in php7 : use anon class ! +class Foo +{ + public $foo; + protected $bar; + private $baz; + + public function __construct($foo, $bar, $baz) + { + $this->foo = $foo; + $this->bar = $bar; + $this->baz = $baz; + } +} + +