SmartObject.events.phpt 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <?php
  2. /**
  3. * Test: Nette\SmartObject event handlers.
  4. */
  5. declare(strict_types=1);
  6. use Tester\Assert;
  7. require __DIR__ . '/../bootstrap.php';
  8. class TestClass
  9. {
  10. use Nette\SmartObject;
  11. public $onPublic;
  12. public static $onPublicStatic;
  13. public array $onEvent;
  14. protected $onProtected;
  15. private $onPrivate;
  16. }
  17. function handler($obj)
  18. {
  19. $obj->counter++;
  20. }
  21. class Handler
  22. {
  23. public function __invoke($obj)
  24. {
  25. $obj->counter++;
  26. }
  27. }
  28. $obj = new TestClass;
  29. $obj->onPublic();
  30. $var = new stdClass;
  31. $var->counter = 0;
  32. $obj->onPublic[] = 'handler';
  33. $obj->onPublic($var);
  34. Assert::same(1, $var->counter);
  35. $obj->onPublic[] = new Handler;
  36. $obj->onPublic($var);
  37. Assert::same(3, $var->counter);
  38. Assert::exception(
  39. fn() => $obj->onPublicStatic(123),
  40. Nette\MemberAccessException::class,
  41. 'Call to undefined method TestClass::onPublicStatic().',
  42. );
  43. Assert::exception(
  44. fn() => $obj->onProtected(123),
  45. Nette\MemberAccessException::class,
  46. 'Call to undefined method TestClass::onProtected().',
  47. );
  48. Assert::exception(
  49. fn() => $obj->onPrivate(123),
  50. Nette\MemberAccessException::class,
  51. 'Call to undefined method TestClass::onPrivate().',
  52. );
  53. Assert::exception(
  54. fn() => $obj->onUndefined(123),
  55. Nette\MemberAccessException::class,
  56. 'Call to undefined method TestClass::onUndefined().',
  57. );
  58. Assert::exception(function () use ($obj) {
  59. $obj->onPublic = 'string';
  60. $obj->onPublic();
  61. }, Nette\UnexpectedValueException::class, 'Property TestClass::$onPublic must be iterable or null, string given.');
  62. $obj = new TestClass;
  63. Assert::noError(fn() => $obj->onEvent());