PropertyBasedNormalizerTest.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. namespace JMS\SerializerBundle\Tests\Serializer\Normalizer;
  3. use JMS\SerializerBundle\Metadata\MetadataFactory;
  4. use JMS\SerializerBundle\Metadata\Driver\AnnotationDriver;
  5. use Annotations\Reader;
  6. use JMS\SerializerBundle\Tests\Fixtures\AllExcludedObject;
  7. use JMS\SerializerBundle\Tests\Fixtures\VersionedObject;
  8. use JMS\SerializerBundle\Serializer\Exclusion\DisjunctExclusionStrategy;
  9. use JMS\SerializerBundle\Serializer\Exclusion\VersionExclusionStrategy;
  10. use JMS\SerializerBundle\Serializer\Exclusion\NoneExclusionStrategy;
  11. use JMS\SerializerBundle\Serializer\Exclusion\AllExclusionStrategy;
  12. use Symfony\Component\Serializer\Serializer;
  13. use JMS\SerializerBundle\Tests\Fixtures\CircularReferenceParent;
  14. use JMS\SerializerBundle\Tests\Fixtures\SimpleObject;
  15. use JMS\SerializerBundle\Serializer\Exclusion\ExclusionStrategyFactory;
  16. use JMS\SerializerBundle\Serializer\Naming\CamelCaseNamingStrategy;
  17. use JMS\SerializerBundle\Serializer\Naming\SerializedNameAnnotationStrategy;
  18. use Doctrine\Common\Annotations\AnnotationReader;
  19. use JMS\SerializerBundle\Serializer\Normalizer\PropertyBasedNormalizer;
  20. class PropertyBasedNormalizerTest extends \PHPUnit_Framework_TestCase
  21. {
  22. public function testNormalizeAllExcludedObject()
  23. {
  24. $object = new AllExcludedObject();
  25. $normalizer = $this->getNormalizer();
  26. $this->assertEquals(array('bar' => 'bar'), $normalizer->normalize($object));
  27. }
  28. public function testNormalizeVersionedObject()
  29. {
  30. $object = new VersionedObject('name1', 'name2');
  31. $normalizer = $this->getNormalizer();
  32. $this->assertEquals(array('name' => 'name2'), $normalizer->normalize($object, null));
  33. $normalizer = $this->getNormalizer('0.1.0');
  34. $this->assertEquals(array('name' => 'name1'), $normalizer->normalize($object, null));
  35. $normalizer = $this->getNormalizer('1.1.0');
  36. $this->assertEquals(array('name' => 'name2'), $normalizer->normalize($object, null));
  37. }
  38. public function testNormalizeCircularReference()
  39. {
  40. $normalizer = $this->getNormalizer();
  41. $object = new CircularReferenceParent();
  42. $this->assertEquals(array(
  43. 'collection' => array(
  44. array('name' => 'child1'),
  45. array('name' => 'child2'),
  46. ),
  47. 'another_collection' => array(
  48. array('name' => 'child1'),
  49. array('name' => 'child2'),
  50. ),
  51. ), $normalizer->normalize($object, null));
  52. }
  53. public function testNormalize()
  54. {
  55. $normalizer = $this->getNormalizer();
  56. $object = new SimpleObject('foo', 'bar');
  57. $this->assertEquals(array('foo' => 'foo', 'moo' => 'bar', 'camel_case' => 'boo'), $normalizer->normalize($object, null));
  58. }
  59. protected function getNormalizer($version = null)
  60. {
  61. $driver = new AnnotationDriver(new Reader());
  62. $propertyNamingStrategy = new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy('_'));
  63. if (null === $version) {
  64. $strategies = array(
  65. 'ALL' => new AllExclusionStrategy($reader),
  66. 'NONE' => new NoneExclusionStrategy($reader),
  67. );
  68. } else {
  69. $versionStrategy = new VersionExclusionStrategy($version);
  70. $strategies = array(
  71. 'ALL' => new DisjunctExclusionStrategy(array(
  72. $versionStrategy, new AllExclusionStrategy($reader)
  73. )),
  74. 'NONE' => new DisjunctExclusionStrategy(array(
  75. $versionStrategy, new NoneExclusionStrategy($reader),
  76. )),
  77. );
  78. }
  79. $exclusionStrategyFactory = new ExclusionStrategyFactory($strategies);
  80. $normalizer = new PropertyBasedNormalizer(new MetadataFactory($driver), $propertyNamingStrategy, $exclusionStrategyFactory);
  81. $serializer = new Serializer();
  82. $serializer->addNormalizer($normalizer);
  83. return $normalizer;
  84. }
  85. }