PropertyBasedNormalizerTest.php 4.1 KB

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