1<?php
2// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
3//
4// All Rights Reserved. See copyright.txt for details and a complete list of authors.
5// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
6// $Id$
7
8class Tiki_Event_ManagerTest extends PHPUnit_Framework_TestCase
9{
10	private $called;
11
12	function setUp()
13	{
14		$this->called = 0;
15	}
16
17	function testTriggerUnknown()
18	{
19		$manager = new Tiki_Event_Manager;
20		$manager->trigger('tiki.wiki.update');
21
22		$this->assertEquals(0, $this->called);
23	}
24
25	function testBindAndTrigger()
26	{
27		$manager = new Tiki_Event_Manager;
28		$manager->bind('tiki.wiki.update', [$this, 'callbackAdd']);
29
30		$manager->trigger('tiki.wiki.update');
31
32		$this->assertEquals(1, $this->called);
33	}
34
35	function testChaining()
36	{
37		$manager = new Tiki_Event_Manager;
38
39		$manager->bind('tiki.wiki.update', 'tiki.wiki.save');
40		$manager->bind('tiki.wiki.save', 'tiki.save');
41
42		$manager->bind('tiki.save', [$this, 'callbackAdd']);
43		$manager->bind('tiki.wiki.save', [$this, 'callbackMultiply']);
44		$manager->bind('tiki.wiki.update', [$this, 'callbackMultiply']);
45
46		$manager->trigger('tiki.wiki.update');
47
48		$this->assertEquals(4, $this->called);
49	}
50
51	function testProvideBindingArguments()
52	{
53		$manager = new Tiki_Event_Manager;
54		$manager->bind(
55			'tiki.wiki.update',
56			[$this, 'callbackAdd'],
57			['amount' => 4,]
58		);
59
60		$manager->bind(
61			'tiki.wiki.update',
62			[$this, 'callbackAdd'],
63			['amount' => 5,]
64		);
65
66		$manager->trigger('tiki.wiki.update');
67
68		$this->assertEquals(9, $this->called);
69	}
70
71	function testCalltimeArgumentsOverrideBinding()
72	{
73		$manager = new Tiki_Event_Manager;
74
75		$manager->bind('tiki.wiki.update', 'tiki.wiki.save');
76
77		$manager->bind('tiki.save', [$this, 'callbackAdd']);
78		$manager->bind('tiki.wiki.save', [$this, 'callbackAdd'], ['amount' => 3]);
79		$manager->bind('tiki.wiki.update', [$this, 'callbackMultiply']);
80
81		$manager->trigger('tiki.wiki.update', ['amount' => 4]);
82
83		$this->assertEquals(16, $this->called);
84	}
85
86	function testGenerateInheritenceGraph()
87	{
88		$manager = new Tiki_Event_Manager;
89
90		$manager->bind('tiki.wiki.update', 'tiki.wiki.save');
91		$manager->bind('tiki.wiki.save', 'tiki.save');
92		$manager->bind('tiki.file.save', 'tiki.save');
93
94		$manager->bind('tiki.wiki.save', [$this, 'callbackMultiply']);
95		$manager->bind('tiki.wiki.update', [$this, 'callbackMultiply']);
96		$manager->bind('tiki.pageload', [$this, 'callbackMultiply']);
97
98		$this->assertEquals(
99			[
100				'nodes' => [
101					'tiki.wiki.update',
102					'tiki.wiki.save',
103					'tiki.file.save',
104					'tiki.pageload',
105					'tiki.save',
106				],
107				'edges' => [
108					['from' => 'tiki.wiki.update', 'to' => 'tiki.wiki.save'],
109					['from' => 'tiki.wiki.save', 'to' => 'tiki.save'],
110					['from' => 'tiki.file.save', 'to' => 'tiki.save'],
111				],
112			],
113			$manager->getEventGraph()
114		);
115	}
116
117	function testBindWithPriority()
118	{
119		$manager = new Tiki_Event_Manager;
120
121		$manager->bind('tiki.wiki.update', 'tiki.wiki.save');
122		$manager->bind('tiki.wiki.save', 'tiki.save');
123
124		$manager->bindPriority(10, 'tiki.save', [$this, 'callbackAdd']);
125		$manager->bind('tiki.wiki.save', [$this, 'callbackMultiply']);
126		$manager->bind('tiki.wiki.update', [$this, 'callbackMultiply']);
127
128		$manager->trigger('tiki.wiki.update');
129
130		$this->assertEquals(1, $this->called);
131	}
132
133	function testIndependentTriggers()
134	{
135		$manager = new Tiki_Event_Manager;
136
137		$manager->bind('tiki.wiki.update', 'tiki.wiki.save');
138		$manager->bind('tiki.wiki.save', 'tiki.save');
139
140		$manager->bindPriority(10, 'tiki.save', [$this, 'callbackAdd']);
141		$manager->bind('tiki.wiki.save', [$this, 'callbackMultiply']);
142		$manager->bind('tiki.wiki.update', [$this, 'callbackMultiply']);
143
144		$manager->bindPriority(
145			5,
146			'tiki.test.foo',
147			function () use ($manager) {
148				$manager->trigger('tiki.wiki.update');
149			}
150		);
151
152		$manager->trigger('tiki.test.foo');
153
154		$this->assertEquals(1, $this->called);
155	}
156
157	function callbackAdd($arguments)
158	{
159		$this->called += isset($arguments['amount']) ? $arguments['amount'] : 1;
160	}
161
162	function callbackMultiply($arguments)
163	{
164		$this->called *= isset($arguments['amount']) ? $arguments['amount'] : 2;
165	}
166}
167