PropertyBasedNormalizerTest.php 3.8 KB

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