ContextTest.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <?php
  2. namespace JMS\Serializer\Tests\Serializer;
  3. use JMS\Serializer\Metadata\ClassMetadata;
  4. use JMS\Serializer\Metadata\PropertyMetadata;
  5. use JMS\Serializer\SerializationContext;
  6. use JMS\Serializer\SerializerBuilder;
  7. use JMS\Serializer\Tests\Fixtures\InlineChild;
  8. use JMS\Serializer\Tests\Fixtures\Node;
  9. class ContextTest extends \PHPUnit_Framework_TestCase
  10. {
  11. public function testSerializationContextPathAndDepth()
  12. {
  13. $object = new Node(array(
  14. new Node(),
  15. new Node(array(
  16. new Node()
  17. )),
  18. ));
  19. $objects = array($object, $object->children[0], $object->children[1], $object->children[1]->children[0]);
  20. $self = $this;
  21. $exclusionStrategy = $this->getMockBuilder('JMS\Serializer\Exclusion\ExclusionStrategyInterface')->getMock();
  22. $exclusionStrategy->expects($this->any())
  23. ->method('shouldSkipClass')
  24. ->with($this->anything(), $this->callback(function (SerializationContext $context) use ($self, $objects) {
  25. $expectedDepth = $expectedPath = null;
  26. if ($context->getObject() === $objects[0]) {
  27. $expectedDepth = 1;
  28. $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node';
  29. } elseif ($context->getObject() === $objects[1]) {
  30. $expectedDepth = 2;
  31. $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node';
  32. } elseif ($context->getObject() === $objects[2]) {
  33. $expectedDepth = 2;
  34. $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node';
  35. } elseif ($context->getObject() === $objects[3]) {
  36. $expectedDepth = 3;
  37. $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node';
  38. }
  39. $self->assertEquals($expectedDepth, $context->getDepth(), 'shouldSkipClass depth');
  40. $self->assertEquals($expectedPath, $context->getPath(), 'shouldSkipClass path');
  41. return true;
  42. }))
  43. ->will($this->returnValue(false));
  44. $exclusionStrategy->expects($this->any())
  45. ->method('shouldSkipProperty')
  46. ->with($this->anything(), $this->callback(function (SerializationContext $context) use ($self, $objects) {
  47. $expectedDepth = $expectedPath = null;
  48. if ($context->getObject() === $objects[0]) {
  49. $expectedDepth = 1;
  50. $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node';
  51. } elseif ($context->getObject() === $objects[1]) {
  52. $expectedDepth = 2;
  53. $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node';
  54. } elseif ($context->getObject() === $objects[2]) {
  55. $expectedDepth = 2;
  56. $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node';
  57. } elseif ($context->getObject() === $objects[3]) {
  58. $expectedDepth = 3;
  59. $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node';
  60. }
  61. $self->assertEquals($expectedDepth, $context->getDepth(), 'shouldSkipProperty depth');
  62. $self->assertEquals($expectedPath, $context->getPath(), 'shouldSkipProperty path');
  63. return true;
  64. }))
  65. ->will($this->returnValue(false));
  66. $serializer = SerializerBuilder::create()->build();
  67. $serializer->serialize($object, 'json', SerializationContext::create()->addExclusionStrategy($exclusionStrategy));
  68. }
  69. public function testSerializationMetadataStack()
  70. {
  71. $object = new Node(array(
  72. $child = new InlineChild(),
  73. ));
  74. $self = $this;
  75. $exclusionStrategy = $this->getMockBuilder('JMS\Serializer\Exclusion\ExclusionStrategyInterface')->getMock();
  76. $exclusionStrategy->expects($this->any())
  77. ->method('shouldSkipClass')
  78. ->will($this->returnCallback(function (ClassMetadata $classMetadata, SerializationContext $context) use ($self, $object, $child) {
  79. $stack = $context->getMetadataStack();
  80. if ($object === $context->getObject()) {
  81. $self->assertEquals(0, $stack->count());
  82. }
  83. if ($child === $context->getObject()) {
  84. $self->assertEquals(2, $stack->count());
  85. $self->assertEquals('JMS\Serializer\Tests\Fixtures\Node', $stack[1]->name);
  86. $self->assertEquals('children', $stack[0]->name);
  87. }
  88. return false;
  89. }));
  90. $exclusionStrategy->expects($this->any())
  91. ->method('shouldSkipProperty')
  92. ->will($this->returnCallback(function (PropertyMetadata $propertyMetadata, SerializationContext $context) use ($self, $object, $child) {
  93. $stack = $context->getMetadataStack();
  94. if ('JMS\Serializer\Tests\Fixtures\Node' === $propertyMetadata->class && $propertyMetadata->name === 'children') {
  95. $self->assertEquals(1, $stack->count());
  96. $self->assertEquals('JMS\Serializer\Tests\Fixtures\Node', $stack[0]->name);
  97. }
  98. if ('JMS\Serializer\Tests\Fixtures\InlineChild' === $propertyMetadata->class) {
  99. $self->assertEquals(3, $stack->count());
  100. $self->assertEquals('JMS\Serializer\Tests\Fixtures\Node', $stack[2]->name);
  101. $self->assertEquals('children', $stack[1]->name);
  102. $self->assertEquals('JMS\Serializer\Tests\Fixtures\InlineChild', $stack[0]->name);
  103. }
  104. return false;
  105. }));
  106. $serializer = SerializerBuilder::create()->build();
  107. $serializer->serialize($object, 'json', SerializationContext::create()->addExclusionStrategy($exclusionStrategy));
  108. }
  109. public function getScalars()
  110. {
  111. return array(
  112. array("string"),
  113. array(5),
  114. array(5.5),
  115. array(array())
  116. );
  117. }
  118. /**
  119. * @dataProvider getScalars
  120. */
  121. public function testCanVisitScalars($scalar)
  122. {
  123. $context = SerializationContext::create();
  124. $context->startVisiting($scalar);
  125. $this->assertFalse($context->isVisiting($scalar));
  126. $context->stopVisiting($scalar);
  127. }
  128. public function testInitialTypeCompatibility()
  129. {
  130. $context = SerializationContext::create();
  131. $context->setInitialType('foo');
  132. $this->assertEquals('foo', $context->getInitialType());
  133. $this->assertEquals('foo', $context->attributes->get('initial_type')->get());
  134. $context = SerializationContext::create();
  135. $context->attributes->set('initial_type', 'foo');
  136. $this->assertEquals('foo', $context->getInitialType());
  137. }
  138. public function testSerializeNullOption()
  139. {
  140. $context = SerializationContext::create();
  141. $this->assertNull($context->shouldSerializeNull());
  142. $context->setSerializeNull(false);
  143. $this->assertFalse($context->shouldSerializeNull());
  144. $context->setSerializeNull(true);
  145. $this->assertTrue($context->shouldSerializeNull());
  146. $context->setSerializeNull("foo");
  147. $this->assertTrue($context->shouldSerializeNull());
  148. $context->setSerializeNull("0");
  149. $this->assertFalse($context->shouldSerializeNull());
  150. }
  151. }