actions.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <?php
  2. /**
  3. * Test do_action() and related functions
  4. *
  5. * @group hooks
  6. */
  7. class Tests_Actions extends WP_UnitTestCase {
  8. function test_simple_action() {
  9. $a = new MockAction();
  10. $tag = 'test_action';
  11. add_action($tag, array(&$a, 'action'));
  12. do_action($tag);
  13. // only one event occurred for the hook, with empty args
  14. $this->assertEquals(1, $a->get_call_count());
  15. // only our hook was called
  16. $this->assertEquals(array($tag), $a->get_tags());
  17. $argsvar = $a->get_args();
  18. $args = array_pop( $argsvar );
  19. $this->assertEquals(array(''), $args);
  20. }
  21. function test_remove_action() {
  22. $a = new MockAction();
  23. $tag = rand_str();
  24. add_action($tag, array(&$a, 'action'));
  25. do_action($tag);
  26. // make sure our hook was called correctly
  27. $this->assertEquals(1, $a->get_call_count());
  28. $this->assertEquals(array($tag), $a->get_tags());
  29. // now remove the action, do it again, and make sure it's not called this time
  30. remove_action($tag, array(&$a, 'action'));
  31. do_action($tag);
  32. $this->assertEquals(1, $a->get_call_count());
  33. $this->assertEquals(array($tag), $a->get_tags());
  34. }
  35. function test_has_action() {
  36. $tag = rand_str();
  37. $func = rand_str();
  38. $this->assertFalse( has_action($tag, $func) );
  39. $this->assertFalse( has_action($tag) );
  40. add_action($tag, $func);
  41. $this->assertEquals( 10, has_action($tag, $func) );
  42. $this->assertTrue( has_action($tag) );
  43. remove_action($tag, $func);
  44. $this->assertFalse( has_action($tag, $func) );
  45. $this->assertFalse( has_action($tag) );
  46. }
  47. // one tag with multiple actions
  48. function test_multiple_actions() {
  49. $a1 = new MockAction();
  50. $a2 = new MockAction();
  51. $tag = rand_str();
  52. // add both actions to the hook
  53. add_action($tag, array(&$a1, 'action'));
  54. add_action($tag, array(&$a2, 'action'));
  55. do_action($tag);
  56. // both actions called once each
  57. $this->assertEquals(1, $a1->get_call_count());
  58. $this->assertEquals(1, $a2->get_call_count());
  59. }
  60. function test_action_args_1() {
  61. $a = new MockAction();
  62. $tag = rand_str();
  63. $val = rand_str();
  64. add_action($tag, array(&$a, 'action'));
  65. // call the action with a single argument
  66. do_action($tag, $val);
  67. $call_count = $a->get_call_count();
  68. $this->assertEquals(1, $call_count);
  69. $argsvar = $a->get_args();
  70. $this->assertEquals( array( $val ), array_pop( $argsvar ) );
  71. }
  72. function test_action_args_2() {
  73. $a1 = new MockAction();
  74. $a2 = new MockAction();
  75. $tag = rand_str();
  76. $val1 = rand_str();
  77. $val2 = rand_str();
  78. // a1 accepts two arguments, a2 doesn't
  79. add_action($tag, array(&$a1, 'action'), 10, 2);
  80. add_action($tag, array(&$a2, 'action'));
  81. // call the action with two arguments
  82. do_action($tag, $val1, $val2);
  83. $call_count = $a1->get_call_count();
  84. // a1 should be called with both args
  85. $this->assertEquals(1, $call_count);
  86. $argsvar1 = $a1->get_args();
  87. $this->assertEquals( array( $val1, $val2 ), array_pop( $argsvar1 ) );
  88. // a2 should be called with one only
  89. $this->assertEquals(1, $a2->get_call_count());
  90. $argsvar2 = $a2->get_args();
  91. $this->assertEquals( array( $val1 ), array_pop( $argsvar2 ) );
  92. }
  93. function test_action_priority() {
  94. $a = new MockAction();
  95. $tag = rand_str();
  96. add_action($tag, array(&$a, 'action'), 10);
  97. add_action($tag, array(&$a, 'action2'), 9);
  98. do_action($tag);
  99. // two events, one per action
  100. $this->assertEquals(2, $a->get_call_count());
  101. $expected = array (
  102. // action2 is called first because it has priority 9
  103. array (
  104. 'action' => 'action2',
  105. 'tag' => $tag,
  106. 'args' => array('')
  107. ),
  108. // action 1 is called second
  109. array (
  110. 'action' => 'action',
  111. 'tag' => $tag,
  112. 'args' => array('')
  113. ),
  114. );
  115. $this->assertEquals($expected, $a->get_events());
  116. }
  117. function test_did_action() {
  118. $tag1 = rand_str();
  119. $tag2 = rand_str();
  120. // do action tag1 but not tag2
  121. do_action($tag1);
  122. $this->assertEquals(1, did_action($tag1));
  123. $this->assertEquals(0, did_action($tag2));
  124. // do action tag2 a random number of times
  125. $count = rand(0, 10);
  126. for ($i=0; $i<$count; $i++)
  127. do_action($tag2);
  128. // tag1's count hasn't changed, tag2 should be correct
  129. $this->assertEquals(1, did_action($tag1));
  130. $this->assertEquals($count, did_action($tag2));
  131. }
  132. function test_all_action() {
  133. $a = new MockAction();
  134. $tag1 = rand_str();
  135. $tag2 = rand_str();
  136. // add an 'all' action
  137. add_action('all', array(&$a, 'action'));
  138. $this->assertEquals(10, has_filter('all', array(&$a, 'action')));
  139. // do some actions
  140. do_action($tag1);
  141. do_action($tag2);
  142. do_action($tag1);
  143. do_action($tag1);
  144. // our action should have been called once for each tag
  145. $this->assertEquals(4, $a->get_call_count());
  146. // only our hook was called
  147. $this->assertEquals(array($tag1, $tag2, $tag1, $tag1), $a->get_tags());
  148. remove_action('all', array(&$a, 'action'));
  149. $this->assertFalse(has_filter('all', array(&$a, 'action')));
  150. }
  151. function test_remove_all_action() {
  152. $a = new MockAction();
  153. $tag = rand_str();
  154. add_action('all', array(&$a, 'action'));
  155. $this->assertEquals(10, has_filter('all', array(&$a, 'action')));
  156. do_action($tag);
  157. // make sure our hook was called correctly
  158. $this->assertEquals(1, $a->get_call_count());
  159. $this->assertEquals(array($tag), $a->get_tags());
  160. // now remove the action, do it again, and make sure it's not called this time
  161. remove_action('all', array(&$a, 'action'));
  162. $this->assertFalse(has_filter('all', array(&$a, 'action')));
  163. do_action($tag);
  164. $this->assertEquals(1, $a->get_call_count());
  165. $this->assertEquals(array($tag), $a->get_tags());
  166. }
  167. function test_action_ref_array() {
  168. $obj = new stdClass();
  169. $a = new MockAction();
  170. $tag = rand_str();
  171. add_action($tag, array(&$a, 'action'));
  172. do_action_ref_array($tag, array(&$obj));
  173. $args = $a->get_args();
  174. $this->assertSame($args[0][0], $obj);
  175. // just in case we don't trust assertSame
  176. $obj->foo = true;
  177. $this->assertFalse( empty($args[0][0]->foo) );
  178. }
  179. /**
  180. * @ticket 11241
  181. */
  182. function test_action_keyed_array() {
  183. $a = new MockAction();
  184. $tag = rand_str();
  185. add_action($tag, array(&$a, 'action'));
  186. $context = array( rand_str() => rand_str() );
  187. do_action($tag, $context);
  188. $args = $a->get_args();
  189. $this->assertSame($args[0][0], $context);
  190. $context2 = array( rand_str() => rand_str(), rand_str() => rand_str() );
  191. do_action($tag, $context2);
  192. $args = $a->get_args();
  193. $this->assertSame($args[1][0], $context2);
  194. }
  195. function test_action_self_removal() {
  196. add_action( 'test_action_self_removal', array( $this, 'action_self_removal' ) );
  197. do_action( 'test_action_self_removal' );
  198. $this->assertEquals( 1, did_action( 'test_action_self_removal' ) );
  199. }
  200. function action_self_removal() {
  201. remove_action( 'test_action_self_removal', array( $this, 'action_self_removal' ) );
  202. }
  203. }