summaryrefslogtreecommitdiff
path: root/tests/phpunit/includes/HooksTest.php
blob: 89e789b1b2bfdcb02ac6482e0e9da9edb165ed6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php

class HooksTest extends MediaWikiTestCase {

	public function testOldStyleHooks() {
		$foo = 'Foo';
		$bar = 'Bar';

		$i = new NothingClass();

		global $wgHooks;

		$wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someNonStatic' );

		wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );

		$this->assertEquals( 'fOO', $foo, 'Standard method' );
		$foo = 'Foo';

		$wgHooks['MediaWikiHooksTest001'][] = $i;

		wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );

		$this->assertEquals( 'foo', $foo, 'onEventName style' );
		$foo = 'Foo';

		$wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someNonStaticWithData', 'baz' );

		wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );

		$this->assertEquals( 'baz', $foo, 'Data included' );
		$foo = 'Foo';

		$wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someStatic' );

		wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );

		$this->assertEquals( 'bah', $foo, 'Standard static method' );
		//$foo = 'Foo';

		unset( $wgHooks['MediaWikiHooksTest001'] );

	}

	public function testNewStyleHooks() {
		$foo = 'Foo';
		$bar = 'Bar';

		$i = new NothingClass();

		Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someNonStatic' ) );

		Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );

		$this->assertEquals( 'fOO', $foo, 'Standard method' );
		$foo = 'Foo';

		Hooks::register( 'MediaWikiHooksTest001', $i );

		Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );

		$this->assertEquals( 'foo', $foo, 'onEventName style' );
		$foo = 'Foo';

		Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someNonStaticWithData', 'baz' ) );

		Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );

		$this->assertEquals( 'baz', $foo, 'Data included' );
		$foo = 'Foo';

		Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someStatic' ) );

		Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );

		$this->assertEquals( 'bah', $foo, 'Standard static method' );
		$foo = 'Foo';

		Hooks::clear( 'MediaWikiHooksTest001' );
	}

	public function testNewStyleHookInteraction() {
		global $wgHooks;

		$a = new NothingClass();
		$b = new NothingClass();

		// make sure to start with a clean slate
		Hooks::clear( 'MediaWikiHooksTest001' );
		unset( $wgHooks['MediaWikiHooksTest001'] );

		$wgHooks['MediaWikiHooksTest001'][] = $a;
		$this->assertTrue( Hooks::isRegistered( 'MediaWikiHooksTest001' ), 'Hook registered via $wgHooks should be noticed by Hooks::isRegistered' );

		Hooks::register( 'MediaWikiHooksTest001', $b );
		$this->assertEquals( 2, count( Hooks::getHandlers( 'MediaWikiHooksTest001' ) ), 'Hooks::getHandlers() should return hooks registered via wgHooks as well as Hooks::register' );

		$foo = 'quux';
		$bar = 'qaax';

		Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
		$this->assertEquals( 1, $a->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
		$this->assertEquals( 1, $b->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );

		// clean up
		Hooks::clear( 'MediaWikiHooksTest001' );
		unset( $wgHooks['MediaWikiHooksTest001'] );
	}
}

class NothingClass {
	public $calls = 0;

	public static function someStatic( &$foo, &$bar ) {
		$foo = 'bah';
		return true;
	}

	public function someNonStatic( &$foo, &$bar ) {
		$this->calls++;
		$foo = 'fOO';
		$bar = 'bAR';
		return true;
	}

	public function onMediaWikiHooksTest001( &$foo, &$bar ) {
		$this->calls++;
		$foo = 'foo';
		return true;
	}

	public function someNonStaticWithData( $foo, &$bar ) {
		$this->calls++;
		$bar = $foo;
		return true;
	}
}