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 
37  public function testConstructorValidContext()
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 
215  public function testExecuteTransitionThen()
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 
232  public function testExecuteTransitionElse()
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 }
PhpIncludeInspection
ilConditionalNodeTest is part of the petri net based workflow engine.
$GLOBALS['loaded']
Global hash that tracks already loaded includes.
PhpIncludeInspection
PhpIncludeInspection
PhpIncludeInspection
global $ilSetting
Definition: privfeed.php:17
PhpIncludeInspection
PhpIncludeInspection