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_CustomizerTest extends PHPUnit_Framework_TestCase
9{
10	private $manager;
11	private $runner;
12	private $called;
13	private $lastEvent;
14	private $lastArguments;
15
16	function setUp()
17	{
18		$this->called = 0;
19		$manager = $this->manager = new Tiki_Event_Manager;
20		$self = $this;
21		$this->runner = new Math_Formula_Runner(
22			[
23				function ($verb) use ($manager, $self) {
24					switch ($verb) {
25						case 'event-trigger':
26							return new Tiki_Event_Function_EventTrigger($manager);
27						case 'event-record':
28							return new Tiki_Event_Function_EventRecord($self);
29					}
30				},
31				'Math_Formula_Function_' => '',
32				'Tiki_Event_Function_' => '',
33			]
34		);
35	}
36
37	function testBindThroughCustomizedEventFilter()
38	{
39		$this->manager->bind('custom.event', [$this, 'callbackAdd']);
40
41		$customizer = new Tiki_Event_Customizer;
42		$customizer->addRule('tiki.trackeritem.save', '(event-trigger custom.event)');
43		$customizer->bind($this->manager, $this->runner);
44
45		$this->manager->trigger('tiki.trackeritem.save');
46
47		$this->assertEquals(1, $this->called);
48	}
49
50	function testPassCustomArguments()
51	{
52		$this->manager->bind('custom.event', [$this, 'callbackAdd']);
53
54		$customizer = new Tiki_Event_Customizer;
55		$customizer->addRule(
56			'tiki.trackeritem.save',
57			'(event-trigger custom.event
58			(map
59				(amount (add args.a args.b))
60				(test args.c)
61			))'
62		);
63		$customizer->bind($this->manager, $this->runner);
64
65		$this->manager->trigger(
66			'tiki.trackeritem.save',
67			[
68				'a' => 2,
69				'b' => 3,
70				'c' => 4,
71			]
72		);
73
74		$this->assertEquals(5, $this->called);
75	}
76
77	function testDirectArgumentRecording()
78	{
79		$customizer = new Tiki_Event_Customizer;
80		$customizer->addRule('tiki.trackeritem.save', '(event-record event args)');
81		$customizer->bind($this->manager, $this->runner);
82
83		$args = [
84			'a' => 2,
85			'b' => 3,
86			'c' => 4,
87			'EVENT_ID' => 1,
88		];
89
90		$this->manager->trigger('tiki.trackeritem.save', $args);
91
92		$this->assertEquals('tiki.trackeritem.save', $this->lastEvent);
93		$this->assertEquals($args, $this->lastArguments);
94	}
95
96	function testChainedArgumentRecording()
97	{
98		$customizer = new Tiki_Event_Customizer;
99		$customizer->addRule('tiki.trackeritem.save', '(event-record event args)');
100		$customizer->bind($this->manager, $this->runner);
101
102		$args = [
103			'a' => 2,
104			'b' => 3,
105			'c' => 4,
106			'EVENT_ID' => 1,
107		];
108
109		$this->manager->bind('tiki.trackeritem.update', 'tiki.trackeritem.save');
110		$this->manager->trigger('tiki.trackeritem.update', $args);
111
112		$this->assertEquals('tiki.trackeritem.update', $this->lastEvent);
113		$this->assertEquals($args, $this->lastArguments);
114	}
115
116	function testCustomEventRecording()
117	{
118
119		$customizer = new Tiki_Event_Customizer;
120		$customizer->addRule('custom.event', '(event-record event args)');
121		$customizer->addRule(
122			'tiki.trackeritem.save',
123			'(event-trigger custom.event
124			(map
125				(amount (add args.a args.b))
126				(test args.c)
127			))'
128		);
129		$customizer->bind($this->manager, $this->runner);
130
131		$this->manager->trigger(
132			'tiki.trackeritem.save',
133			[
134				'a' => 2,
135				'b' => 3,
136				'c' => 4,
137			]
138		);
139
140		$this->assertEquals('custom.event', $this->lastEvent);
141		$this->assertEquals(
142			[
143				'amount' => 5,
144				'test' => 4,
145				'EVENT_ID' => 2,
146			],
147			$this->lastArguments
148		);
149	}
150
151	function callbackAdd($arguments)
152	{
153		$this->called += isset($arguments['amount']) ? $arguments['amount'] : 1;
154	}
155
156	function callbackMultiply($arguments)
157	{
158		$this->called *= isset($arguments['amount']) ? $arguments['amount'] : 2;
159	}
160
161	function recordEvent($event, $arguments)
162	{
163		$this->lastEvent = $event;
164		$this->lastArguments = $arguments;
165	}
166}
167