ClassMetadataTest.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. /*
  3. * Copyright 2013 Johannes M. Schmitt <schmittjoh@gmail.com>
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. namespace JMS\Serializer\Tests\Metadata;
  18. use JMS\Serializer\Metadata\PropertyMetadata;
  19. use JMS\Serializer\Metadata\ClassMetadata;
  20. class ClassMetadataTest extends \PHPUnit_Framework_TestCase
  21. {
  22. public function testSetAccessorOrder()
  23. {
  24. $metadata = new ClassMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder');
  25. $metadata->addPropertyMetadata(new PropertyMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder', 'b'));
  26. $metadata->addPropertyMetadata(new PropertyMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder', 'a'));
  27. $this->assertEquals(array('b', 'a'), array_keys($metadata->propertyMetadata));
  28. $metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_ALPHABETICAL);
  29. $this->assertEquals(array('a', 'b'), array_keys($metadata->propertyMetadata));
  30. $metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_CUSTOM, array('b', 'a'));
  31. $this->assertEquals(array('b', 'a'), array_keys($metadata->propertyMetadata));
  32. $metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_CUSTOM, array('a', 'b'));
  33. $this->assertEquals(array('a', 'b'), array_keys($metadata->propertyMetadata));
  34. $metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_CUSTOM, array('b'));
  35. $this->assertEquals(array('b', 'a'), array_keys($metadata->propertyMetadata));
  36. $metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_CUSTOM, array('a'));
  37. $this->assertEquals(array('a', 'b'), array_keys($metadata->propertyMetadata));
  38. $metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_CUSTOM, array('foo', 'bar'));
  39. $this->assertEquals(array('b', 'a'), array_keys($metadata->propertyMetadata));
  40. }
  41. /**
  42. * @dataProvider providerPublicMethodData
  43. */
  44. public function testAccessorTypePublicMethod($property, $getterInit, $setterInit, $getterName, $setterName)
  45. {
  46. $object = new PropertyMetadataPublicMethod();
  47. $metadata = new PropertyMetadata(get_class($object), $property);
  48. $metadata->setAccessor(PropertyMetadata::ACCESS_TYPE_PUBLIC_METHOD, $getterInit, $setterInit);
  49. $this->assertEquals($getterName, $metadata->getter);
  50. $this->assertEquals($setterName, $metadata->setter);
  51. // setter is not supported by setValue(), any idea?
  52. $object->{$metadata->setter}('x');
  53. $this->assertEquals(sprintf('%1$s:%1$s:x', strtoupper($property)), $metadata->getValue($object));
  54. }
  55. /**
  56. * @dataProvider providerPublicMethodException
  57. */
  58. public function testAccessorTypePublicMethodException($getter, $setter, $message)
  59. {
  60. $this->setExpectedException('\JMS\Serializer\Exception\RuntimeException', $message);
  61. $object = new PropertyMetadataPublicMethod();
  62. $metadata = new PropertyMetadata(get_class($object), 'e');
  63. $metadata->setAccessor(PropertyMetadata::ACCESS_TYPE_PUBLIC_METHOD, $getter, $setter);
  64. }
  65. public function providerPublicMethodData()
  66. {
  67. return array(
  68. array('a', null, null, 'geta', 'seta'),
  69. array('b', null, null, 'isb', 'setb'),
  70. array('c', null, null, 'hasc', 'setc'),
  71. array('d', 'fetchd', 'saved', 'fetchd', 'saved')
  72. );
  73. }
  74. public function providerPublicMethodException()
  75. {
  76. return array(
  77. array(null, null, 'a public getE method, nor a public isE method, nor a public hasE method in class'),
  78. array(null, 'setx', 'a public getE method, nor a public isE method, nor a public hasE method in class'),
  79. array('getx', null, 'no public setE method in class'),
  80. );
  81. }
  82. }
  83. class PropertyMetadataOrder
  84. {
  85. private $b, $a;
  86. }
  87. class PropertyMetadataPublicMethod
  88. {
  89. private $a, $b, $c, $d, $e;
  90. public function getA()
  91. {
  92. return 'A:' . $this->a;
  93. }
  94. public function setA($a)
  95. {
  96. $this->a = 'A:' . $a;
  97. }
  98. public function isB()
  99. {
  100. return 'B:' . $this->b;
  101. }
  102. public function setB($b)
  103. {
  104. $this->b = 'B:' . $b;
  105. }
  106. public function hasC()
  107. {
  108. return 'C:' . $this->c;
  109. }
  110. public function setC($c)
  111. {
  112. $this->c = 'C:' . $c;
  113. }
  114. public function fetchD()
  115. {
  116. return 'D:' . $this->d;
  117. }
  118. public function saveD($d)
  119. {
  120. $this->d = 'D:' . $d;
  121. }
  122. }