SmartObject.property.inheritance.phpt 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <?php
  2. /**
  3. * Test: Nette\SmartObject properties and inheritance.
  4. */
  5. declare(strict_types=1);
  6. use Tester\Assert;
  7. require __DIR__ . '/../bootstrap.php';
  8. /**
  9. * @property int $traitA
  10. */
  11. trait TraitA
  12. {
  13. public function getTraitA()
  14. {
  15. return __FUNCTION__;
  16. }
  17. }
  18. /**
  19. * @property int $traitB
  20. */
  21. trait TraitB
  22. {
  23. public function getTraitB()
  24. {
  25. return __FUNCTION__;
  26. }
  27. }
  28. /**
  29. * @property int $traitC
  30. */
  31. trait TraitC
  32. {
  33. use TraitB;
  34. public function getTraitC()
  35. {
  36. return __FUNCTION__;
  37. }
  38. }
  39. /**
  40. * @property int $classA
  41. */
  42. class ParentClass
  43. {
  44. use Nette\SmartObject;
  45. use TraitA;
  46. public function getClassA()
  47. {
  48. return __FUNCTION__;
  49. }
  50. }
  51. /**
  52. * @property int $classB
  53. */
  54. class ChildClass extends ParentClass
  55. {
  56. use TraitC;
  57. public function getClassB()
  58. {
  59. return __FUNCTION__;
  60. }
  61. }
  62. $obj = new ChildClass;
  63. Assert::same('getTraitA', $obj->traitA);
  64. Assert::same('getTraitB', $obj->traitB);
  65. Assert::same('getTraitC', $obj->traitC);
  66. Assert::same('getClassA', $obj->classA);
  67. Assert::same('getClassB', $obj->classB);
  68. Assert::exception(
  69. fn() => $obj->classBX,
  70. Nette\MemberAccessException::class,
  71. 'Cannot read an undeclared property ChildClass::$classBX, did you mean $classB?',
  72. );
  73. Assert::exception(
  74. fn() => $obj->classAX,
  75. Nette\MemberAccessException::class,
  76. 'Cannot read an undeclared property ChildClass::$classAX, did you mean $classA?',
  77. );
  78. Assert::exception(
  79. fn() => $obj->traitCX,
  80. Nette\MemberAccessException::class,
  81. 'Cannot read an undeclared property ChildClass::$traitCX, did you mean $traitC?',
  82. );
  83. Assert::exception(
  84. fn() => $obj->traitBX,
  85. Nette\MemberAccessException::class,
  86. 'Cannot read an undeclared property ChildClass::$traitBX, did you mean $traitB?',
  87. );
  88. Assert::exception(
  89. fn() => $obj->traitAX,
  90. Nette\MemberAccessException::class,
  91. 'Cannot read an undeclared property ChildClass::$traitAX, did you mean $traitA?',
  92. );