PropertyBasedNormalizerTest.php 4.1 KB

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