123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- <?php
- /**
- * Test apply_filters() and related functions
- *
- * @group hooks
- */
- class Tests_Filters extends WP_UnitTestCase {
- function test_simple_filter() {
- $a = new MockAction();
- $tag = rand_str();
- $val = rand_str();
- add_filter($tag, array($a, 'filter'));
- $this->assertEquals($val, apply_filters($tag, $val));
- // only one event occurred for the hook, with empty args
- $this->assertEquals(1, $a->get_call_count());
- // only our hook was called
- $this->assertEquals(array($tag), $a->get_tags());
- $argsvar = $a->get_args();
- $args = array_pop( $argsvar );
- $this->assertEquals(array($val), $args);
- }
- function test_remove_filter() {
- $a = new MockAction();
- $tag = rand_str();
- $val = rand_str();
- add_filter($tag, array($a, 'filter'));
- $this->assertEquals($val, apply_filters($tag, $val));
- // make sure our hook was called correctly
- $this->assertEquals(1, $a->get_call_count());
- $this->assertEquals(array($tag), $a->get_tags());
- // now remove the filter, do it again, and make sure it's not called this time
- remove_filter($tag, array($a, 'filter'));
- $this->assertEquals($val, apply_filters($tag, $val));
- $this->assertEquals(1, $a->get_call_count());
- $this->assertEquals(array($tag), $a->get_tags());
- }
- function test_has_filter() {
- $tag = rand_str();
- $func = rand_str();
- $this->assertFalse( has_filter($tag, $func) );
- $this->assertFalse( has_filter($tag) );
- add_filter($tag, $func);
- $this->assertEquals( 10, has_filter($tag, $func) );
- $this->assertTrue( has_filter($tag) );
- remove_filter($tag, $func);
- $this->assertFalse( has_filter($tag, $func) );
- $this->assertFalse( has_filter($tag) );
- }
- // one tag with multiple filters
- function test_multiple_filters() {
- $a1 = new MockAction();
- $a2 = new MockAction();
- $tag = rand_str();
- $val = rand_str();
- // add both filters to the hook
- add_filter($tag, array($a1, 'filter'));
- add_filter($tag, array($a2, 'filter'));
- $this->assertEquals($val, apply_filters($tag, $val));
- // both filters called once each
- $this->assertEquals(1, $a1->get_call_count());
- $this->assertEquals(1, $a2->get_call_count());
- }
- function test_filter_args_1() {
- $a = new MockAction();
- $tag = rand_str();
- $val = rand_str();
- $arg1 = rand_str();
- add_filter($tag, array($a, 'filter'), 10, 2);
- // call the filter with a single argument
- $this->assertEquals($val, apply_filters($tag, $val, $arg1));
- $this->assertEquals(1, $a->get_call_count());
- $argsvar = $a->get_args();
- $this->assertEquals( array( $val, $arg1 ), array_pop( $argsvar ) );
- }
- function test_filter_args_2() {
- $a1 = new MockAction();
- $a2 = new MockAction();
- $tag = rand_str();
- $val = rand_str();
- $arg1 = rand_str();
- $arg2 = rand_str();
- // a1 accepts two arguments, a2 doesn't
- add_filter($tag, array($a1, 'filter'), 10, 3);
- add_filter($tag, array($a2, 'filter'));
- // call the filter with two arguments
- $this->assertEquals($val, apply_filters($tag, $val, $arg1, $arg2));
- // a1 should be called with both args
- $this->assertEquals(1, $a1->get_call_count());
- $argsvar1 = $a1->get_args();
- $this->assertEquals( array( $val, $arg1, $arg2 ), array_pop( $argsvar1 ) );
- // a2 should be called with one only
- $this->assertEquals(1, $a2->get_call_count());
- $argsvar2 = $a2->get_args();
- $this->assertEquals( array( $val ), array_pop( $argsvar2 ) );
- }
- function test_filter_priority() {
- $a = new MockAction();
- $tag = rand_str();
- $val = rand_str();
- // make two filters with different priorities
- add_filter($tag, array($a, 'filter'), 10);
- add_filter($tag, array($a, 'filter2'), 9);
- $this->assertEquals($val, apply_filters($tag, $val));
- // there should be two events, one per filter
- $this->assertEquals(2, $a->get_call_count());
- $expected = array (
- // filter2 is called first because it has priority 9
- array (
- 'filter' => 'filter2',
- 'tag' => $tag,
- 'args' => array($val)
- ),
- // filter 1 is called second
- array (
- 'filter' => 'filter',
- 'tag' => $tag,
- 'args' => array($val)
- ),
- );
- $this->assertEquals($expected, $a->get_events());
- }
- function test_all_filter() {
- $a = new MockAction();
- $tag1 = rand_str();
- $tag2 = rand_str();
- $val = rand_str();
- // add an 'all' filter
- add_filter('all', array($a, 'filterall'));
- // do some filters
- $this->assertEquals($val, apply_filters($tag1, $val));
- $this->assertEquals($val, apply_filters($tag2, $val));
- $this->assertEquals($val, apply_filters($tag1, $val));
- $this->assertEquals($val, apply_filters($tag1, $val));
- // our filter should have been called once for each apply_filters call
- $this->assertEquals(4, $a->get_call_count());
- // the right hooks should have been called in order
- $this->assertEquals(array($tag1, $tag2, $tag1, $tag1), $a->get_tags());
- remove_filter('all', array($a, 'filterall'));
- $this->assertFalse( has_filter('all', array($a, 'filterall')) );
- }
- function test_remove_all_filter() {
- $a = new MockAction();
- $tag = rand_str();
- $val = rand_str();
- add_filter('all', array($a, 'filterall'));
- $this->assertTrue( has_filter('all') );
- $this->assertEquals( 10, has_filter('all', array($a, 'filterall')) );
- $this->assertEquals($val, apply_filters($tag, $val));
- // make sure our hook was called correctly
- $this->assertEquals(1, $a->get_call_count());
- $this->assertEquals(array($tag), $a->get_tags());
- // now remove the filter, do it again, and make sure it's not called this time
- remove_filter('all', array($a, 'filterall'));
- $this->assertFalse( has_filter('all', array($a, 'filterall')) );
- $this->assertFalse( has_filter('all') );
- $this->assertEquals($val, apply_filters($tag, $val));
- // call cound should remain at 1
- $this->assertEquals(1, $a->get_call_count());
- $this->assertEquals(array($tag), $a->get_tags());
- }
- /**
- * @ticket 9886
- */
- function test_filter_ref_array() {
- $obj = new stdClass();
- $a = new MockAction();
- $tag = rand_str();
- add_action($tag, array($a, 'filter'));
- apply_filters_ref_array($tag, array(&$obj));
- $args = $a->get_args();
- $this->assertSame($args[0][0], $obj);
- // just in case we don't trust assertSame
- $obj->foo = true;
- $this->assertFalse( empty($args[0][0]->foo) );
- }
- /**
- * @ticket 12723
- */
- function test_filter_ref_array_result() {
- $obj = new stdClass();
- $a = new MockAction();
- $b = new MockAction();
- $tag = rand_str();
- add_action($tag, array($a, 'filter_append'), 10, 2);
- add_action($tag, array($b, 'filter_append'), 10, 2);
- $result = apply_filters_ref_array($tag, array('string', &$obj));
- $this->assertEquals($result, 'string_append_append');
- $args = $a->get_args();
- $this->assertSame($args[0][1], $obj);
- // just in case we don't trust assertSame
- $obj->foo = true;
- $this->assertFalse( empty($args[0][1]->foo) );
- $args = $b->get_args();
- $this->assertSame($args[0][1], $obj);
- // just in case we don't trust assertSame
- $obj->foo = true;
- $this->assertFalse( empty($args[0][1]->foo) );
- }
- function _self_removal($tag) {
- remove_action( $tag, array($this, '_self_removal'), 10, 1 );
- return $tag;
- }
- /**
- * @ticket 21169
- */
- function test_filter_removal_during_filter() {
- $tag = rand_str();
- $a = new MockAction();
- $b = new MockAction();
- add_action( $tag, array($a, 'filter_append'), 11, 1 );
- add_action( $tag, array($b, 'filter_append'), 12, 1 );
- add_action( $tag, array($this, '_self_removal'), 10, 1 );
- $result = apply_filters($tag, $tag);
- $this->assertEquals( 1, $a->get_call_count(), 'priority 11 filters should run after priority 10 empties itself' );
- $this->assertEquals( 1, $b->get_call_count(), 'priority 12 filters should run after priority 10 empties itself and priority 11 runs' );
- $this->assertEquals( $result, $tag . '_append_append', 'priority 11 and 12 filters should run after priority 10 empties itself' );
- }
- }
|