/* * SmartGWT (GWT for SmartClient) * Copyright 2008 and beyond, Isomorphic Software, Inc. * * SmartGWT is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3 * as published by the Free Software Foundation. SmartGWT is also * available under typical commercial license terms - see * http://smartclient.com/license * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package com.smartgwt.client.util.workflow; import com.smartgwt.client.SmartGWTTestCase; import com.smartgwt.client.data.Record; /** * Test for basic workflow logic. */ public class WorkflowBaseTestCase extends SmartGWTTestCase { /** * Basic workflow logic test. Process based on elements. */ public void testBasicWorkflowLogicElements(){ ScriptTask incTask = new ScriptTask("inc", "add2") { public Object execute(Object input, Record inputRecord) { return ((Integer) input) + 1; }; }; incTask.setInputField("cnt"); incTask.setOutputField("cnt2"); ScriptTask add2Task = new ScriptTask("add2") { public Object execute(Object input, Record inputRecord) { return ((Integer) input) + 2; }; }; add2Task.setInputField("cnt2"); add2Task.setOutputField("cnt3"); com.smartgwt.client.util.workflow.Process process = new com.smartgwt.client.util.workflow.Process() { public void finished(Record state) { }; }; process.setElements(incTask, add2Task); Record state = new Record(); state.setAttribute("cnt", 0); process.setState(state); process.start(); assertEquals("3", state.getAttribute("cnt3")); } /** * Basic workflow logic test. Process based on sequences. */ public void testBasicWorkflowLogicSequences(){ ScriptTask incTask = new ScriptTask("inc") { public Object execute(Object input, Record inputRecord) { return ((Integer) input) + 1; }; }; incTask.setInputField("cnt"); incTask.setOutputField("cnt2"); ScriptTask add2Task = new ScriptTask("add2") { public Object execute(Object input, Record inputRecord) { return ((Integer) input) + 2; }; }; add2Task.setInputField("cnt2"); add2Task.setOutputField("cnt"); com.smartgwt.client.util.workflow.Process process = new com.smartgwt.client.util.workflow.Process() { public void finished(Record state) { }; }; ProcessSequence innerSequence = new ProcessSequence(incTask, add2Task, incTask); ProcessSequence mainSequence = new ProcessSequence(incTask, add2Task, innerSequence); process.setSequences(mainSequence); Record state = new Record(); state.setAttribute("cnt", 0); process.setState(state); process.start(); assertEquals("7", state.getAttribute("cnt2")); } /** * Basic workflow logic test. Test recursive sequences. */ public void testBasicWorkflowLogicRecursiveSequences(){ ScriptTask incTask = new ScriptTask("inc") { public Object execute(Object input, Record inputRecord) { return ((Integer) input) + 1; }; }; incTask.setInputField("cnt"); incTask.setOutputField("cnt2"); ScriptTask add2Task = new ScriptTask("add2") { public Object execute(Object input, Record inputRecord) { return ((Integer) input) + 2; }; }; add2Task.setInputField("cnt2"); add2Task.setOutputField("cnt"); com.smartgwt.client.util.workflow.Process process = new com.smartgwt.client.util.workflow.Process() { public void finished(Record state) { }; }; ProcessSequence firstSequence = new ProcessSequence(incTask, add2Task); ProcessSequence secondSequence = new ProcessSequence(add2Task, incTask); ProcessSequence mainSequence = new ProcessSequence(firstSequence, incTask, secondSequence); process.setSequences(mainSequence); Record state = new Record(); state.setAttribute("cnt", 0); process.setState(state); process.start(); assertEquals("7", state.getAttribute("cnt2")); } /** * Basic workflow logic test. Combine sequences with elements and using nextElement with * next by order. Check inputFields and outpupFields too */ public void testComplexWorkflowLogic(){ final com.smartgwt.client.util.workflow.Process process = new com.smartgwt.client.util.workflow.Process() { public void finished(Record state) { }; }; ScriptTask el1Task = new ScriptTask("el1", "el3") { public Object execute(Object input, Record inputRecord) { Record result = new Record(); result.setAttribute("cnt", 10); result.setAttribute("indx", ((Integer) input) + 1); return result; }; }; el1Task.setInputField("indx"); el1Task.setOutputFields("cnt", "indx"); ScriptTask el2Task = new ScriptTask("el2", el1Task) { public Object execute(Object input, Record inputRecord) { // should not affect anything inputRecord.setAttribute("cnt", inputRecord.getAttributeAsInt("cnt") + 1); return 1 + inputRecord.getAttributeAsInt("indx"); }; }; el2Task.setInputFields("cnt", "indx"); el2Task.setOutputField("indx"); ScriptTask el4Task = new ScriptTask("el4") { public Object execute(Object input, Record inputRecord) { if (inputRecord.getAttribute("indx") != null) { return 0; } return 1 + inputRecord.getAttributeAsInt("cnt"); }; }; el4Task.setInputFields("cnt"); el4Task.setOutputField("cnt"); ScriptTask el5Task = new ScriptTask("el5") { public Object execute(Object input, Record inputRecord) { Record result = new Record(); result.setAttribute("indx", ((Integer) input) + 1); return result; }; }; el5Task.setInputField("indx"); el5Task.setOutputFields("cnt"); ScriptTask el6Task = new ScriptTask("el6") { public Object execute(Object input, Record inputRecord) { inputRecord.setAttribute("indx", inputRecord.getAttributeAsInt("indx") * 2); inputRecord.setAttribute("cnt", inputRecord.getAttributeAsInt("cnt") * 2); return null; }; }; el6Task.setInputFields("indx", "cnt"); el6Task.setOutputFields("cnt", "indx"); ScriptTask el3Task = new ScriptTask("el3", "s1") { public Object execute(Object input, Record inputRecord) { Record result = new Record(); result.setAttribute("indx", inputRecord.getAttributeAsInt("indx") + 1); result.setAttribute("cnt", inputRecord.getAttributeAsInt("cnt") + 1); return result; }; }; el3Task.setInputField("cnt"); el3Task.setInputFields("indx"); el3Task.setOutputField("indx"); el3Task.setOutputFields("cnt"); ProcessSequence firstSequence = new ProcessSequence(el1Task, el2Task); ProcessSequence secondSequence = new ProcessSequence("s1", el4Task, el5Task, el6Task); ProcessSequence mainSequence = new ProcessSequence(firstSequence, secondSequence); process.setSequences(mainSequence); process.setElements(el3Task); Record state = new Record(); state.setAttribute("cnt", 0); state.setAttribute("indx", 0); process.setState(state); process.setStartElement(el2Task); process.start(); assertEquals("12", state.getAttribute("cnt")); assertEquals("3", state.getAttribute("indx")); } }