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