Parcourir la source

Test Context's metadataStack

Adrien Brault il y a 12 ans
Parent
commit
f226163cbe

+ 2 - 2
src/JMS/Serializer/GraphNavigator.php

@@ -184,14 +184,14 @@ final class GraphNavigator
                     $metadata = $this->resolveMetadata($context, $data, $metadata);
                 }
 
-                $context->pushClassMetadata($metadata);
-
                 if (null !== $exclusionStrategy && $exclusionStrategy->shouldSkipClass($metadata, $context)) {
                     $this->leaveScope($context, $data);
 
                     return null;
                 }
 
+                $context->pushClassMetadata($metadata);
+
                 if ($context instanceof SerializationContext) {
                     foreach ($metadata->preSerializeMethods as $method) {
                         $method->invoke($data);

+ 53 - 0
tests/JMS/Serializer/Tests/Serializer/ContextTest.php

@@ -19,7 +19,10 @@
 namespace JMS\Serializer\Tests\Serializer;
 
 use JMS\Serializer\Context;
+use JMS\Serializer\Metadata\ClassMetadata;
+use JMS\Serializer\Metadata\PropertyMetadata;
 use JMS\Serializer\SerializationContext;
+use JMS\Serializer\Tests\Fixtures\InlineChild;
 use JMS\Serializer\Tests\Fixtures\Node;
 use JMS\Serializer\SerializerBuilder;
 
@@ -94,4 +97,54 @@ class ContextTest extends \PHPUnit_Framework_TestCase
 
         $serializer->serialize($object, 'json', SerializationContext::create()->addExclusionStrategy($exclusionStrategy));
     }
+
+    public function testSerializationMetadataStack()
+    {
+        $object = new Node(array(
+            $child = new InlineChild(),
+        ));
+        $self = $this;
+
+        $exclusionStrategy = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface');
+        $exclusionStrategy->expects($this->any())
+            ->method('shouldSkipClass')
+            ->will($this->returnCallback(function (ClassMetadata $classMetadata, SerializationContext $context) use ($self, $object, $child) {
+                $stack = $context->getMetadataStack();
+
+                if ($object === $context->getObject()) {
+                    $self->assertEquals(0, $stack->count());
+                }
+
+                if ($child === $context->getObject()) {
+                    $self->assertEquals(2, $stack->count());
+                    $self->assertEquals('JMS\Serializer\Tests\Fixtures\Node', $stack[1]->name);
+                    $self->assertEquals('children', $stack[0]->name);
+                }
+
+                return false;
+            }));
+
+        $exclusionStrategy->expects($this->any())
+            ->method('shouldSkipProperty')
+            ->will($this->returnCallback(function (PropertyMetadata $propertyMetadata, SerializationContext $context) use ($self, $object, $child) {
+                $stack = $context->getMetadataStack();
+
+                if ('JMS\Serializer\Tests\Fixtures\Node' === $propertyMetadata->class && $propertyMetadata->name === 'children') {
+                    $self->assertEquals(1, $stack->count());
+                    $self->assertEquals('JMS\Serializer\Tests\Fixtures\Node', $stack[0]->name);
+                }
+
+                if ('JMS\Serializer\Tests\Fixtures\InlineChild' === $propertyMetadata->class) {
+                    $self->assertEquals(3, $stack->count());
+                    $self->assertEquals('JMS\Serializer\Tests\Fixtures\Node', $stack[2]->name);
+                    $self->assertEquals('children', $stack[1]->name);
+                    $self->assertEquals('JMS\Serializer\Tests\Fixtures\InlineChild', $stack[0]->name);
+                }
+
+                return false;
+            }));
+
+        $serializer = SerializerBuilder::create()->build();
+        $serializer->serialize($object, 'json', SerializationContext::create()->addExclusionStrategy($exclusionStrategy));
+    }
 }