+ */
+class ClassDiscriminatorMappingTest extends TestCase
+{
+ public function testGetClass()
+ {
+ $mapping = new ClassDiscriminatorMapping('type', array(
+ 'first' => AbstractDummyFirstChild::class,
+ ));
+
+ $this->assertEquals(AbstractDummyFirstChild::class, $mapping->getClassForType('first'));
+ $this->assertEquals(null, $mapping->getClassForType('second'));
+ }
+
+ public function testMappedObjectType()
+ {
+ $mapping = new ClassDiscriminatorMapping('type', array(
+ 'first' => AbstractDummyFirstChild::class,
+ ));
+
+ $this->assertEquals('first', $mapping->getMappedObjectType(new AbstractDummyFirstChild()));
+ $this->assertEquals(null, $mapping->getMappedObjectType(new AbstractDummySecondChild()));
+ }
+}
diff --git a/src/Symfony/Component/Serializer/Tests/Mapping/Loader/AnnotationLoaderTest.php b/src/Symfony/Component/Serializer/Tests/Mapping/Loader/AnnotationLoaderTest.php
index b2e5c69211227..b6566d333166c 100644
--- a/src/Symfony/Component/Serializer/Tests/Mapping/Loader/AnnotationLoaderTest.php
+++ b/src/Symfony/Component/Serializer/Tests/Mapping/Loader/AnnotationLoaderTest.php
@@ -13,8 +13,13 @@
use Doctrine\Common\Annotations\AnnotationReader;
use PHPUnit\Framework\TestCase;
+use Symfony\Component\Serializer\Mapping\AttributeMetadata;
+use Symfony\Component\Serializer\Mapping\ClassDiscriminatorMapping;
use Symfony\Component\Serializer\Mapping\ClassMetadata;
use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
+use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummy;
+use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummyFirstChild;
+use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummySecondChild;
use Symfony\Component\Serializer\Tests\Mapping\TestClassMetadataFactory;
/**
@@ -52,6 +57,22 @@ public function testLoadGroups()
$this->assertEquals(TestClassMetadataFactory::createClassMetadata(), $classMetadata);
}
+ public function testLoadDiscriminatorMap()
+ {
+ $classMetadata = new ClassMetadata(AbstractDummy::class);
+ $this->loader->loadClassMetadata($classMetadata);
+
+ $expected = new ClassMetadata(AbstractDummy::class, new ClassDiscriminatorMapping('type', array(
+ 'first' => AbstractDummyFirstChild::class,
+ 'second' => AbstractDummySecondChild::class,
+ )));
+
+ $expected->addAttributeMetadata(new AttributeMetadata('foo'));
+ $expected->getReflectionClass();
+
+ $this->assertEquals($expected, $classMetadata);
+ }
+
public function testLoadMaxDepth()
{
$classMetadata = new ClassMetadata('Symfony\Component\Serializer\Tests\Fixtures\MaxDepthDummy');
diff --git a/src/Symfony/Component/Serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php b/src/Symfony/Component/Serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php
index 974d42ee55926..db2d7fda81aa7 100644
--- a/src/Symfony/Component/Serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php
+++ b/src/Symfony/Component/Serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php
@@ -12,8 +12,13 @@
namespace Symfony\Component\Serializer\Tests\Mapping\Loader;
use PHPUnit\Framework\TestCase;
+use Symfony\Component\Serializer\Mapping\AttributeMetadata;
+use Symfony\Component\Serializer\Mapping\ClassDiscriminatorMapping;
use Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader;
use Symfony\Component\Serializer\Mapping\ClassMetadata;
+use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummy;
+use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummyFirstChild;
+use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummySecondChild;
use Symfony\Component\Serializer\Tests\Mapping\TestClassMetadataFactory;
/**
@@ -62,4 +67,19 @@ public function testMaxDepth()
$this->assertEquals(2, $attributesMetadata['foo']->getMaxDepth());
$this->assertEquals(3, $attributesMetadata['bar']->getMaxDepth());
}
+
+ public function testLoadDiscriminatorMap()
+ {
+ $classMetadata = new ClassMetadata(AbstractDummy::class);
+ $this->loader->loadClassMetadata($classMetadata);
+
+ $expected = new ClassMetadata(AbstractDummy::class, new ClassDiscriminatorMapping('type', array(
+ 'first' => AbstractDummyFirstChild::class,
+ 'second' => AbstractDummySecondChild::class,
+ )));
+
+ $expected->addAttributeMetadata(new AttributeMetadata('foo'));
+
+ $this->assertEquals($expected, $classMetadata);
+ }
}
diff --git a/src/Symfony/Component/Serializer/Tests/Mapping/Loader/YamlFileLoaderTest.php b/src/Symfony/Component/Serializer/Tests/Mapping/Loader/YamlFileLoaderTest.php
index 918af73b14d8f..7a0ecdd446d05 100644
--- a/src/Symfony/Component/Serializer/Tests/Mapping/Loader/YamlFileLoaderTest.php
+++ b/src/Symfony/Component/Serializer/Tests/Mapping/Loader/YamlFileLoaderTest.php
@@ -12,8 +12,13 @@
namespace Symfony\Component\Serializer\Tests\Mapping\Loader;
use PHPUnit\Framework\TestCase;
+use Symfony\Component\Serializer\Mapping\AttributeMetadata;
+use Symfony\Component\Serializer\Mapping\ClassDiscriminatorMapping;
use Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader;
use Symfony\Component\Serializer\Mapping\ClassMetadata;
+use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummy;
+use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummyFirstChild;
+use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummySecondChild;
use Symfony\Component\Serializer\Tests\Mapping\TestClassMetadataFactory;
/**
@@ -77,4 +82,19 @@ public function testMaxDepth()
$this->assertEquals(2, $attributesMetadata['foo']->getMaxDepth());
$this->assertEquals(3, $attributesMetadata['bar']->getMaxDepth());
}
+
+ public function testLoadDiscriminatorMap()
+ {
+ $classMetadata = new ClassMetadata(AbstractDummy::class);
+ $this->loader->loadClassMetadata($classMetadata);
+
+ $expected = new ClassMetadata(AbstractDummy::class, new ClassDiscriminatorMapping('type', array(
+ 'first' => AbstractDummyFirstChild::class,
+ 'second' => AbstractDummySecondChild::class,
+ )));
+
+ $expected->addAttributeMetadata(new AttributeMetadata('foo'));
+
+ $this->assertEquals($expected, $classMetadata);
+ }
}
diff --git a/src/Symfony/Component/Serializer/Tests/SerializerTest.php b/src/Symfony/Component/Serializer/Tests/SerializerTest.php
index f7f8594cb12bc..7550b3c9b7ba1 100644
--- a/src/Symfony/Component/Serializer/Tests/SerializerTest.php
+++ b/src/Symfony/Component/Serializer/Tests/SerializerTest.php
@@ -12,6 +12,10 @@
namespace Symfony\Component\Serializer\Tests;
use PHPUnit\Framework\TestCase;
+use Symfony\Component\Serializer\Mapping\ClassDiscriminatorFromClassMetadata;
+use Symfony\Component\Serializer\Mapping\ClassDiscriminatorMapping;
+use Symfony\Component\Serializer\Mapping\ClassMetadata;
+use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface;
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
use Symfony\Component\Serializer\Normalizer\DenormalizerAwareInterface;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
@@ -23,6 +27,11 @@
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Normalizer\CustomNormalizer;
+use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummy;
+use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummyFirstChild;
+use Symfony\Component\Serializer\Tests\Fixtures\AbstractDummySecondChild;
+use Symfony\Component\Serializer\Tests\Fixtures\DummyMessageInterface;
+use Symfony\Component\Serializer\Tests\Fixtures\DummyMessageNumberOne;
use Symfony\Component\Serializer\Tests\Fixtures\TraversableDummy;
use Symfony\Component\Serializer\Tests\Fixtures\NormalizableTraversableDummy;
use Symfony\Component\Serializer\Tests\Normalizer\TestNormalizer;
@@ -346,6 +355,107 @@ public function testDeserializeObjectConstructorWithObjectTypeHint()
$this->assertEquals(new Foo(new Bar('baz')), $serializer->deserialize($jsonData, Foo::class, 'json'));
}
+
+ public function testDeserializeAndSerializeAbstractObjectsWithTheClassMetadataDiscriminatorResolver()
+ {
+ $example = new AbstractDummyFirstChild('foo-value', 'bar-value');
+
+ $loaderMock = $this->getMockBuilder(ClassMetadataFactoryInterface::class)->getMock();
+ $loaderMock->method('hasMetadataFor')->will($this->returnValueMap(array(
+ array(
+ AbstractDummy::class,
+ true,
+ ),
+ )));
+
+ $loaderMock->method('getMetadataFor')->will($this->returnValueMap(array(
+ array(
+ AbstractDummy::class,
+ new ClassMetadata(
+ AbstractDummy::class,
+ new ClassDiscriminatorMapping('type', array(
+ 'first' => AbstractDummyFirstChild::class,
+ 'second' => AbstractDummySecondChild::class,
+ ))
+ ),
+ ),
+ )));
+
+ $discriminatorResolver = new ClassDiscriminatorFromClassMetadata($loaderMock);
+ $serializer = new Serializer(array(new ObjectNormalizer(null, null, null, null, $discriminatorResolver)), array('json' => new JsonEncoder()));
+
+ $jsonData = '{"type":"first","bar":"bar-value","foo":"foo-value"}';
+
+ $deserialized = $serializer->deserialize($jsonData, AbstractDummy::class, 'json');
+ $this->assertEquals($example, $deserialized);
+
+ $serialized = $serializer->serialize($deserialized, 'json');
+ $this->assertEquals($jsonData, $serialized);
+ }
+
+ public function testDeserializeAndSerializeInterfacedObjectsWithTheClassMetadataDiscriminatorResolver()
+ {
+ $example = new DummyMessageNumberOne();
+ $example->one = 1;
+
+ $jsonData = '{"message-type":"one","one":1}';
+
+ $discriminatorResolver = new ClassDiscriminatorFromClassMetadata($this->metadataFactoryMockForDummyInterface());
+ $serializer = new Serializer(array(new ObjectNormalizer(null, null, null, null, $discriminatorResolver)), array('json' => new JsonEncoder()));
+
+ $deserialized = $serializer->deserialize($jsonData, DummyMessageInterface::class, 'json');
+ $this->assertEquals($example, $deserialized);
+
+ $serialized = $serializer->serialize($deserialized, 'json');
+ $this->assertEquals($jsonData, $serialized);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Serializer\Exception\RuntimeException
+ * @expectedExceptionMessage The type "second" has no mapped class for the abstract object "Symfony\Component\Serializer\Tests\Fixtures\DummyMessageInterface"
+ */
+ public function testExceptionWhenTypeIsNotKnownInDiscriminator()
+ {
+ $discriminatorResolver = new ClassDiscriminatorFromClassMetadata($this->metadataFactoryMockForDummyInterface());
+ $serializer = new Serializer(array(new ObjectNormalizer(null, null, null, null, $discriminatorResolver)), array('json' => new JsonEncoder()));
+ $serializer->deserialize('{"message-type":"second","one":1}', DummyMessageInterface::class, 'json');
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Serializer\Exception\RuntimeException
+ * @expectedExceptionMessage Type property "message-type" not found for the abstract object "Symfony\Component\Serializer\Tests\Fixtures\DummyMessageInterface"
+ */
+ public function testExceptionWhenTypeIsNotInTheBodyToDeserialiaze()
+ {
+ $discriminatorResolver = new ClassDiscriminatorFromClassMetadata($this->metadataFactoryMockForDummyInterface());
+ $serializer = new Serializer(array(new ObjectNormalizer(null, null, null, null, $discriminatorResolver)), array('json' => new JsonEncoder()));
+ $serializer->deserialize('{"one":1}', DummyMessageInterface::class, 'json');
+ }
+
+ private function metadataFactoryMockForDummyInterface()
+ {
+ $factoryMock = $this->getMockBuilder(ClassMetadataFactoryInterface::class)->getMock();
+ $factoryMock->method('hasMetadataFor')->will($this->returnValueMap(array(
+ array(
+ DummyMessageInterface::class,
+ true,
+ ),
+ )));
+
+ $factoryMock->method('getMetadataFor')->will($this->returnValueMap(array(
+ array(
+ DummyMessageInterface::class,
+ new ClassMetadata(
+ DummyMessageInterface::class,
+ new ClassDiscriminatorMapping('message-type', array(
+ 'one' => DummyMessageNumberOne::class,
+ ))
+ ),
+ ),
+ )));
+
+ return $factoryMock;
+ }
}
class Model
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy