SerializerTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. namespace JMS\SerializerBundle\Tests\Serializer;
  3. use Doctrine\Common\Annotations\AnnotationReader;
  4. use Metadata\MetadataFactory;
  5. use JMS\SerializerBundle\Serializer\UnserializeInstanceCreator;
  6. use JMS\SerializerBundle\Metadata\Driver\AnnotationDriver;
  7. use JMS\SerializerBundle\Serializer\Exclusion\AllExclusionStrategy;
  8. use JMS\SerializerBundle\Serializer\Normalizer\PropertyBasedNormalizer;
  9. use JMS\SerializerBundle\Tests\Fixtures\Comment;
  10. use JMS\SerializerBundle\Tests\Fixtures\Author;
  11. use JMS\SerializerBundle\Tests\Fixtures\AuthorList;
  12. use JMS\SerializerBundle\Tests\Fixtures\BlogPost;
  13. use JMS\SerializerBundle\Tests\Fixtures\NoopNormalizer;
  14. use JMS\SerializerBundle\Serializer\Normalizer\ArrayCollectionNormalizer;
  15. use JMS\SerializerBundle\Serializer\Naming\SerializedNameAnnotationStrategy;
  16. use JMS\SerializerBundle\Serializer\SerializerFactory;
  17. use JMS\SerializerBundle\Serializer\Exclusion\NoneExclusionStrategy;
  18. use JMS\SerializerBundle\Serializer\Exclusion\ExclusionStrategyFactory;
  19. use JMS\SerializerBundle\Serializer\Naming\CamelCaseNamingStrategy;
  20. use JMS\SerializerBundle\Serializer\Naming\AnnotatedNamingStrategy;
  21. use JMS\SerializerBundle\Serializer\Normalizer\NativePhpTypeNormalizer;
  22. use JMS\SerializerBundle\Serializer\Serializer;
  23. use JMS\SerializerBundle\Serializer\Encoder\JsonEncoder;
  24. use JMS\SerializerBundle\Serializer\Encoder\XmlEncoder;
  25. class SerializerTest extends \PHPUnit_Framework_TestCase
  26. {
  27. public function testNormalize()
  28. {
  29. $serializer = $this->getSerializer();
  30. $post = new BlogPost('Foo', new Author('Bar'));
  31. $normalized = $serializer->normalize($post);
  32. $this->assertTrue(isset($normalized['created_at']));
  33. unset($normalized['created_at']);
  34. $this->assertEquals(array(
  35. 'title' => 'Foo',
  36. 'published' => false,
  37. 'author' => array(
  38. 'full_name' => 'Bar',
  39. ),
  40. 'comments' => array(),
  41. ), $normalized);
  42. $noop = new NoopNormalizer();
  43. $serializer = $this->getSerializer(null, null, array($noop));
  44. $list = new AuthorList();
  45. $list->add(new Author('Bar'));
  46. $normalized = $serializer->normalize($list);
  47. $this->assertEquals(array(), $normalized);
  48. $normalized = $serializer->normalize(array('foo'));
  49. $this->assertEquals(array('foo'), $normalized);
  50. }
  51. public function testDenormalize()
  52. {
  53. $serializer = $this->getSerializer();
  54. $post = new BlogPost('Foo', new Author('Bar'));
  55. $post->addComment(new Comment(new Author('Johannes'), 'FooBar'));
  56. $normalized = $serializer->normalize($post);
  57. $post2 = $serializer->denormalize($normalized, 'JMS\SerializerBundle\Tests\Fixtures\BlogPost');
  58. $this->assertEquals($post, $post2);
  59. }
  60. public function testSerializeUnserialize()
  61. {
  62. $serializer = $this->getSerializer();
  63. $post = new BlogPost('foo', new Author('bar'));
  64. $post->setPublished();
  65. $post->addComment(new Comment(new Author('foo'), 'bar'));
  66. $post->addComment(new Comment(new Author('bar'), 'foo'));
  67. $serialized = $serializer->serialize($post, 'xml');
  68. $post2 = $serializer->deserialize($serialized, 'JMS\SerializerBundle\Tests\Fixtures\BlogPost', 'xml');
  69. $this->assertEquals($post, $post2);
  70. $serialized = $serializer->serialize($post, 'json');
  71. $post2 = $serializer->deserialize($serialized, 'JMS\SerializerBundle\Tests\Fixtures\BlogPost', 'json');
  72. $this->assertEquals($post, $post2);
  73. }
  74. private function getSerializer($propertyNamingStrategy = null, $encoders = null, $customNormalizers = null)
  75. {
  76. if (null === $propertyNamingStrategy) {
  77. $propertyNamingStrategy = new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy());
  78. }
  79. if (null === $encoders) {
  80. $encoders = array(
  81. 'xml' => new XmlEncoder(),
  82. 'json' => new JsonEncoder(),
  83. );
  84. }
  85. if (null === $customNormalizers) {
  86. $customNormalizers = array(
  87. new ArrayCollectionNormalizer(),
  88. );
  89. }
  90. $exclusionStrategyFactory = new ExclusionStrategyFactory(array(
  91. 'ALL' => new AllExclusionStrategy(),
  92. 'NONE' => new NoneExclusionStrategy(),
  93. ));
  94. return new Serializer(
  95. new NativePhpTypeNormalizer(),
  96. new PropertyBasedNormalizer(new MetadataFactory(new AnnotationDriver(new AnnotationReader())), $propertyNamingStrategy, new UnserializeInstanceCreator(), $exclusionStrategyFactory),
  97. $customNormalizers,
  98. $encoders
  99. );
  100. }
  101. }