ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
ilConditionalNodeTest.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2014 ILIAS open source, Extended GPL, see docs/LICENSE */
3
16{
17 public function setUp()
18 {
19 include_once("./Services/PHPUnit/classes/class.ilUnitUtil.php");
20 //ilUnitUtil::performInitialisation();
21
22 // Empty workflow.
23 require_once './Services/WorkflowEngine/classes/workflows/class.ilEmptyWorkflow.php';
24 $this->workflow = new ilEmptyWorkflow();
25 }
26
27 public function tearDown()
28 {
29 global $ilSetting;
30 if ($ilSetting != NULL)
31 {
32 $ilSetting->delete('IL_PHPUNIT_TEST_TIME');
33 $ilSetting->delete('IL_PHPUNIT_TEST_MICROTIME');
34 }
35 }
36
38 {
39 // Act
40 $node = new ilConditionalNode($this->workflow);
41
42 // Assert
43 // No exception - good
44 $this->assertTrue(
45 true,
46 'Construction failed with valid context passed to constructor.'
47 );
48 }
49
50 public function testGetContext()
51 {
52 // Arrange
53 $node = new ilConditionalNode($this->workflow);
54
55 // Act
56 $actual = $node->getContext();
57
58 // Assert
59 if ($actual === $this->workflow)
60 {
61 $this->assertEquals($actual, $this->workflow);
62 } else {
63 $this->assertTrue(false, 'Context not identical.');
64 }
65 }
66
67 public function testIsActiveAndActivate()
68 {
69 // Arrange
70 $node = new ilConditionalNode($this->workflow);
71 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
72 $detector = new ilSimpleDetector($node);
73 $node->addDetector($detector);
74 $evaluation_expression = 'return null;';
75 $node->setEvaluationExpression($evaluation_expression);
76
77 // Act
78 $node->activate();
79
80 // Assert
81 $actual = $node->isActive();
82 $this->assertTrue($actual);
83 }
84
85 public function testDeactivate()
86 {
87 // Arrange
88 $node = new ilConditionalNode($this->workflow);
89 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
90 $detector = new ilSimpleDetector($node);
91 $node->addDetector($detector);
92 $evaluation_expression = 'return null;';
93 $node->setEvaluationExpression($evaluation_expression);
94
95 // Act
96 $node->activate();
97 $was_activated = $node->isActive();
98 $node->deactivate();
99 $was_deactivated = !$node->isActive();
100
101 // Assert
102 $this->assertEquals($was_activated, $was_deactivated);
103 }
104
106 {
107 // Arrange
108 $node = new ilConditionalNode($this->workflow);
109 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
110 $detector1 = new ilSimpleDetector($node);
111 $node->addDetector($detector1);
112 $detector2 = new ilSimpleDetector($node);
113 $node->addDetector($detector2);
114
115 $evaluation_expression =
116 '
117 $retval = null;
118 if ($detectors[0]->getDetectorState() == false
119 && $detectors[1]->getDetectorState() == true)
120 {
121 $retval = false;
122 }
123
124 if ($detectors[0]->getDetectorState() == true
125 && $detectors[1]->getDetectorState() == false)
126 {
127 $retval = true;
128 }
129 return $retval;
130 ';
131
132 $node->setEvaluationExpression($evaluation_expression);
133 $detector1->trigger(null);
134
135 // Act
136 $preconditions = $node->checkTransitionPreconditions();
137
138 // Assert
139 $this->assertTrue($preconditions);
140 }
141
143 {
144 // Arrange
145 $node = new ilConditionalNode($this->workflow);
146 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
147 $detector1 = new ilSimpleDetector($node);
148 $node->addDetector($detector1);
149 $detector2 = new ilSimpleDetector($node);
150 $node->addDetector($detector2);
151
152 $evaluation_expression =
153 '
154 $retval = null;
155 if ($detectors[0]->getDetectorState() == false
156 && $detectors[1]->getDetectorState() == true)
157 {
158 $retval = false;
159 }
160
161 if ($detectors[0]->getDetectorState() == true
162 && $detectors[1]->getDetectorState() == false)
163 {
164 $retval = true;
165 }
166 return $retval;
167 ';
168
169 $node->setEvaluationExpression($evaluation_expression);
170 $detector2->trigger(null);
171
172 // Act
173 $preconditions = $node->checkTransitionPreconditions();
174
175 // Assert
176 $this->assertTrue($preconditions);
177 }
178
180 {
181 // Arrange
182 $node = new ilConditionalNode($this->workflow);
183 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
184 $detector1 = new ilSimpleDetector($node);
185 $node->addDetector($detector1);
186 $detector2 = new ilSimpleDetector($node);
187 $node->addDetector($detector2);
188
189 $evaluation_expression =
190 '
191 $retval = null;
192 if ($detectors[0]->getDetectorState() == false
193 && $detectors[1]->getDetectorState() == true)
194 {
195 $retval = false;
196 }
197
198 if ($detectors[0]->getDetectorState() == true
199 && $detectors[1]->getDetectorState() == false)
200 {
201 $retval = true;
202 }
203 return $retval;
204 ';
205
206 $node->setEvaluationExpression($evaluation_expression);
207
208 // Act
209 $preconditions = $node->checkTransitionPreconditions();
210
211 // Assert
212 $this->assertFalse($preconditions);
213 }
214
216 {
217 // Arrange
218 $node = new ilConditionalNode($this->workflow);
219 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
220 $detector = new ilSimpleDetector($node);
221 $node->addDetector($detector);
222 $node->activate();
223
224 // Act
225 $node->executeTransition();
226 $state = $node->isActive();
227
228 // Assert
229 $this->assertFalse($state);
230 }
231
233 { // This is test #100 of the WorkflowEngine, written on 9th of May, 2012
234 // @ 14:15
235
236 // Arrange
237 $node = new ilConditionalNode($this->workflow);
238 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
239 $detector = new ilSimpleDetector($node);
240 $node->addDetector($detector);
241 $node->activate();
242
243 // Act
244 $node->executeElseTransition();
245 $state = $node->isActive();
246
247 // Assert
248 $this->assertFalse($state);
249 }
250
252 {
253 // Arrange
254 $node = new ilConditionalNode($this->workflow);
255 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
256 $detector = new ilSimpleDetector($node);
257 $node->addDetector($detector);
258
259 require_once './Services/WorkflowEngine/classes/activities/class.ilLoggingActivity.php';
260 $activity = new ilLoggingActivity($node);
261 $activity->setLogFile('ilTransitionLog.txt');
262 $activity->setLogLevel('MESSAGE');
263 $activity->setLogMessage('TEST');
264 $node->addActivity($activity);
265
266 // Act
267 $node->activate();
268 $node->executeTransition();
269
270 // Assert
271 $expected = ' :: MESSAGE :: TEST';
272 $fp = fopen('ilTransitionLog.txt', 'r');
273 $line = fgets($fp);
274 $actual = substr($line, 25, strlen($line)-27);
275 @unlink('ilTransitionLog.txt'); // TODO: Use vfsStream
276 $this->assertEquals(
277 $actual,
278 $expected
279 );
280 }
281
283 {
284 // Arrange
285 $node = new ilConditionalNode($this->workflow);
286 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
287 $detector = new ilSimpleDetector($node);
288 $node->addDetector($detector);
289
290 require_once './Services/WorkflowEngine/classes/activities/class.ilLoggingActivity.php';
291 $activity = new ilLoggingActivity($node);
292 $activity->setLogFile('ilTransitionLog.txt');
293 $activity->setLogLevel('MESSAGE');
294 $activity->setLogMessage('TEST');
295 $node->addActivity($activity, true);
296
297 // Act
298 $node->activate();
299 $node->executeElseTransition();
300
301 // Assert
302 $expected = ' :: MESSAGE :: TEST';
303 $fp = fopen('ilTransitionLog.txt', 'r');
304 $line = fgets($fp);
305 $actual = substr($line, 25, strlen($line)-27);
306 @unlink('ilTransitionLog.txt'); // TODO: Use vfsStream
307 $this->assertEquals(
308 $actual,
309 $expected
310 );
311 }
312
314 {
315 // Arrange
316 $node = new ilConditionalNode($this->workflow);
317 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
318 $detector = new ilSimpleDetector($node);
319 $node->addDetector($detector);
320
321 require_once './Services/WorkflowEngine/classes/emitters/class.ilActivationEmitter.php';
322 $t_node = new ilBasicNode($this->workflow);
323 $t_detector = new ilSimpleDetector($t_node);
324 $t_node->addDetector($t_detector);
325 $foo_detector = new ilSimpleDetector($t_node);
326 $t_node->addDetector($foo_detector);
327 // again a foo_detector to keep the t_node from transitting
328
329 $emitter = new ilActivationEmitter($node);
330 $emitter->setTargetDetector($t_detector);
331 $node->addEmitter($emitter);
332
333 // Act
334 $node->activate();
335 $node->executeTransition();
336
337 // Assert
338 $this->assertTrue($t_node->isActive());
339 }
340
342 {
343 // Arrange
344 $node = new ilConditionalNode($this->workflow);
345 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
346 $detector = new ilSimpleDetector($node);
347 $node->addDetector($detector);
348
349 require_once './Services/WorkflowEngine/classes/emitters/class.ilActivationEmitter.php';
350 $t_node = new ilBasicNode($this->workflow);
351 $t_detector = new ilSimpleDetector($t_node);
352 $t_node->addDetector($t_detector);
353 $foo_detector = new ilSimpleDetector($t_node);
354 $t_node->addDetector($foo_detector);
355 // again a foo_detector to keep the t_node from transitting
356
357 $emitter = new ilActivationEmitter($node);
358 $emitter->setTargetDetector($t_detector);
359 $node->addEmitter($emitter,true);
360
361 // Act
362 $node->activate();
363 $node->executeElseTransition();
364
365 // Assert
366 $this->assertTrue($t_node->isActive());
367 }
368
370 {
371 // Arrange
372 $node = new ilConditionalNode($this->workflow);
373 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
374 $detector = new ilSimpleDetector($node);
375 $node->addDetector($detector);
376
377 require_once './Services/WorkflowEngine/classes/emitters/class.ilActivationEmitter.php';
378 $t_node = new ilBasicNode($this->workflow);
379 $t_detector = new ilSimpleDetector($t_node);
380 $t_node->addDetector($t_detector);
381 $foo_detector = new ilSimpleDetector($t_node);
382 $t_node->addDetector($foo_detector);
383 // again a foo_detector to keep the t_node from transitting
384
385 $emitter = new ilActivationEmitter($node);
386 $emitter->setTargetDetector($t_detector);
387 $node->addEmitter($emitter,true);
388 $node->setEvaluationExpression("return false;");
389 // Act
390 $node->activate();
391 $node->AttemptTransition();
392
393 // Assert
394 $this->assertTrue($t_node->isActive());
395 }
396
397 public function testAddDetectorFirst()
398 {
399 // Arrange
400 $node = new ilConditionalNode($this->workflow);
401 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
402 $detector = new ilSimpleDetector($node);
403
404 // Act
405 $node->addDetector($detector);
406 $detectors = $node->getDetectors();
407
408 // Assert
409 $this->assertEquals($detector, $detectors[0]);
410 }
411
412 public function testAddEmitterFirst()
413 {
414 // Arrange
415 $node = new ilConditionalNode($this->workflow);
416 require_once './Services/WorkflowEngine/classes/emitters/class.ilSimpleEmitter.php';
417 $emitter = new ilSimpleEmitter($node);
418
419 // Act
420 $node->addEmitter($emitter);
421 $emitters = $node->getEmitters();
422
423 // Assert
424 $this->assertEquals($emitter, $emitters[0]);
425 }
426
427 public function testAddElseEmitterFirst()
428 {
429 // Arrange
430 $node = new ilConditionalNode($this->workflow);
431 require_once './Services/WorkflowEngine/classes/emitters/class.ilSimpleEmitter.php';
432 $emitter = new ilSimpleEmitter($node);
433
434 // Act
435 $node->addEmitter($emitter, true);
436 $emitters = $node->getEmitters(true);
437
438 // Assert
439 $this->assertEquals($emitter, $emitters[0]);
440 }
441
442 public function testAddActivityFirst()
443 {
444 // Arrange
445 $node = new ilConditionalNode($this->workflow);
446 require_once './Services/WorkflowEngine/classes/activities/class.ilLoggingActivity.php';
447 $activity = new ilLoggingActivity($node);
448
449 // Act
450 $node->addActivity($activity);
451 $activities = $node->getActivities();
452
453 // Assert
454 $this->assertEquals($activity, $activities[0]);
455 }
456
457 public function testAddElseActivityFirst()
458 {
459 // Arrange
460 $node = new ilConditionalNode($this->workflow);
461 require_once './Services/WorkflowEngine/classes/activities/class.ilLoggingActivity.php';
462 $activity = new ilLoggingActivity($node);
463
464 // Act
465 $node->addActivity($activity, true);
466 $activities = $node->getActivities(true);
467
468 // Assert
469 $this->assertEquals($activity, $activities[0]);
470 }
471
473 {
474 // Arrange
475 $node = new ilConditionalNode($this->workflow);
476
477 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
478 $detector = new ilSimpleDetector($node);
479 $node->addDetector($detector);
480 $detector->setDetectorState(true);
481 $node->setEvaluationExpression('return true;');
482
483 $node->activate();
484 /* Setting the detector to true will actually be reported
485 * with notifyDetectorSatisfaction.
486 * To isolate this call, we need to reset the node back
487 * to active prior to evaluating if it successfully executes
488 * the transition and sets itself to inactive.
489 */
490
491 // Act
492 $node->notifyDetectorSatisfaction($detector);
493
494 // Assert
495 $this->assertFalse($node->isActive());
496 }
497
499 {
500 // Arrange
501 $node = new ilConditionalNode($this->workflow);
502 require_once './Services/WorkflowEngine/classes/detectors/class.ilSimpleDetector.php';
503 $detector1 = new ilSimpleDetector($node);
504 $node->addDetector($detector1);
505 $detector2 = new ilSimpleDetector($node);
506 $node->addDetector($detector2);
507 $node->setEvaluationExpression('return $GLOBALS["expr_retval"];');
508 $GLOBALS['expr_retval'] = null;
509
510 // Act
511 $node->activate();
512 $this->assertTrue($node->isActive());
513 $GLOBALS['expr_retval'] = true;
514
515 $detector1->trigger(null);
516 $detector2->trigger(null);
517 // TODO: Assert something more meaningful here.
518 $this->assertFalse($node->isActive());
519 }
520}
An exception for terminatinating execution or to throw for unit testing.
@noinspection PhpIncludeInspection
@noinspection PhpIncludeInspection
ilConditionalNodeTest is part of the petri net based workflow engine.
@noinspection PhpIncludeInspection
@noinspection PhpIncludeInspection
@noinspection PhpIncludeInspection
@noinspection PhpIncludeInspection
@noinspection PhpIncludeInspection
$GLOBALS['loaded']
Global hash that tracks already loaded includes.
global $ilSetting
Definition: privfeed.php:17