@@ -17,7 +17,7 @@ Feature('Resume execution', () => {
1717 } ) ;
1818
1919 Given ( 'an engine with source' , ( ) => {
20- engine = Engine ( {
20+ engine = new Engine ( {
2121 name : 'Engine feature' ,
2222 source,
2323 settings : {
@@ -63,7 +63,7 @@ Feature('Resume execution', () => {
6363
6464 let recovered ;
6565 When ( 'engine is recovered with a new setting and one overridden setting' , ( ) => {
66- recovered = Engine ( {
66+ recovered = new Engine ( {
6767 name : 'Recovered engine' ,
6868 } ) . recover ( state , {
6969 settings : {
@@ -231,7 +231,7 @@ Feature('Resume execution', () => {
231231 } ) ;
232232
233233 When ( 'engine is recovered with a the slimmer state and sourceContext' , async ( ) => {
234- recovered = Engine ( {
234+ recovered = new Engine ( {
235235 sourceContext : await testHelpers . context ( source ) ,
236236 } ) . recover ( slimmerState ) ;
237237 } ) ;
@@ -266,7 +266,7 @@ Feature('Resume execution', () => {
266266 </process>
267267 </definitions>` ;
268268
269- recovered = Engine ( {
269+ recovered = new Engine ( {
270270 name : 'Recovered engine' ,
271271 sourceContext : await testHelpers . context ( otherSource ) ,
272272 } ) ;
@@ -278,4 +278,155 @@ Feature('Resume execution', () => {
278278 } ) . to . throw ( Error ) ;
279279 } ) ;
280280 } ) ;
281+
282+ Scenario ( 'recover with options' , ( ) => {
283+ let engine , listener , source ;
284+ Given ( 'a bpmn source with user task, timer and script' , ( ) => {
285+ source = `
286+ <definitions id="Def_1" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
287+ <process id="theProcess" isExecutable="true">
288+ <task id="task" />
289+ <sequenceFlow id="to-timer" sourceRef="task" targetRef="timer" />
290+ <intermediateCatchEvent id="timer">
291+ <timerEventDefinition>
292+ <timeDuration xsi:type="tFormalExpression">PT1S</timeDuration>
293+ </timerEventDefinition>
294+ </intermediateCatchEvent>
295+ <sequenceFlow id="to-script" sourceRef="timer" targetRef="script" />
296+ <scriptTask id="script" scriptFormat="js">
297+ <script>this.environment.services.serviceFn(next)</script>
298+ </scriptTask>
299+ </process>
300+ </definitions>` ;
301+ } ) ;
302+
303+ const events = [ ] ;
304+ Given ( 'an engine with source' , ( ) => {
305+ listener = new EventEmitter ( ) ;
306+
307+ listener . on ( 'activity.end' , ( api ) => {
308+ events . push ( api . id ) ;
309+ } ) ;
310+
311+ engine = new Engine ( {
312+ name : 'Resume feature' ,
313+ source,
314+ listener,
315+ services : {
316+ serviceFn ( ...args ) {
317+ args . pop ( ) ( ) ;
318+ } ,
319+ } ,
320+ } ) ;
321+ } ) ;
322+
323+ let execution1 ;
324+ When ( 'engine is executed' , async ( ) => {
325+ execution1 = await engine . execute ( ) ;
326+ } ) ;
327+
328+ Then ( 'timer is waiting' , ( ) => {
329+ expect ( execution1 . activityStatus ) . to . equal ( 'timer' ) ;
330+ } ) ;
331+
332+ let execution2 ;
333+ When ( 'same instance is recovered options and resumed' , async ( ) => {
334+ engine . recover ( execution1 . getState ( ) , {
335+ settings : {
336+ mySetting : 1 ,
337+ } ,
338+ } ) ;
339+
340+ execution2 = await engine . resume ( ) ;
341+ } ) ;
342+
343+ Then ( 'first execution is stopped' , ( ) => {
344+ expect ( execution1 . state ) . to . equal ( 'stopped' ) ;
345+ } ) ;
346+
347+ And ( 'only one timer is running' , ( ) => {
348+ expect ( engine . environment . timers . executing ) . to . have . length ( 1 ) ;
349+ } ) ;
350+
351+ And ( 'a new timer is waiting' , ( ) => {
352+ expect ( execution2 . activityStatus ) . to . equal ( 'timer' ) ;
353+ } ) ;
354+
355+ let end ;
356+ When ( 'resumed timer times out' , ( ) => {
357+ end = engine . waitFor ( 'end' ) ;
358+ engine . environment . timers . executing . pop ( ) . callback ( ) ;
359+ } ) ;
360+
361+ Then ( 'run completes' , ( ) => {
362+ return end ;
363+ } ) ;
364+
365+ And ( 'listener has captured events' , ( ) => {
366+ expect ( events ) . to . deep . equal ( [ 'task' , 'timer' , 'script' ] ) ;
367+ } ) ;
368+
369+ Given ( 'a new engine instance with same source' , ( ) => {
370+ events . splice ( 0 ) ;
371+
372+ engine = new Engine ( {
373+ name : 'Proper resume' ,
374+ source,
375+ listener,
376+ services : {
377+ serviceFn ( ...args ) {
378+ args . pop ( ) ( ) ;
379+ } ,
380+ } ,
381+ } ) ;
382+ } ) ;
383+
384+ When ( 'engine is executed' , async ( ) => {
385+ execution1 = await engine . execute ( ) ;
386+ } ) ;
387+
388+ Then ( 'timer is waiting' , ( ) => {
389+ expect ( execution1 . activityStatus ) . to . equal ( 'timer' ) ;
390+ } ) ;
391+
392+ let state ;
393+ Given ( 'run is stopped and state is saved' , async ( ) => {
394+ await engine . stop ( ) ;
395+ state = execution1 . getState ( ) ;
396+ } ) ;
397+
398+ When ( 'a new instance is recovered with listener and service options and resumed' , async ( ) => {
399+ engine = new Engine ( {
400+ name : 'Proper recover' ,
401+ } ) ;
402+
403+ engine . recover ( state , {
404+ listener,
405+ services : {
406+ serviceFn ( ...args ) {
407+ args . pop ( ) ( ) ;
408+ } ,
409+ } ,
410+ } ) ;
411+
412+ execution2 = await engine . resume ( ) ;
413+ } ) ;
414+
415+ Then ( 'a timer is running' , ( ) => {
416+ expect ( engine . environment . timers . executing ) . to . have . length ( 1 ) ;
417+ } ) ;
418+
419+ When ( 'recovered and resumed timer times out' , ( ) => {
420+ end = engine . waitFor ( 'end' ) ;
421+ engine . environment . timers . executing . pop ( ) . callback ( ) ;
422+ } ) ;
423+
424+ Then ( 'run completes' , ( ) => {
425+ return end ;
426+ } ) ;
427+
428+ And ( 'listener has captured events' , ( ) => {
429+ expect ( events ) . to . deep . equal ( [ 'task' , 'timer' , 'script' ] ) ;
430+ } ) ;
431+ } ) ;
281432} ) ;
0 commit comments