All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nl.praegus.fitnesse.slim.tables.ConditionalScriptTable Maven / Gradle / Ivy

There is a newer version: 2.0.24
Show newest version
package nl.praegus.fitnesse.slim.tables;

import fitnesse.slim.MethodExecutionResult;
import fitnesse.slim.SlimExpressionEvaluator;
import fitnesse.slim.instructions.Instruction;
import fitnesse.testsystems.TestExecutionException;
import fitnesse.testsystems.slim.SlimTestContext;
import fitnesse.testsystems.slim.Table;
import fitnesse.testsystems.slim.results.SlimTestResult;
import fitnesse.testsystems.slim.tables.ScriptTable;
import fitnesse.testsystems.slim.tables.SlimAssertion;
import fitnesse.testsystems.slim.tables.SlimExpectation;
import fitnesse.testsystems.slim.tables.SyntaxError;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ConditionalScriptTable extends ScriptTable {

    private boolean conditionResult;
    private boolean fromConditionalScenario;

    public ConditionalScriptTable(Table table, String tableId, SlimTestContext context) {
        super(table, tableId, context);
    }

    public ConditionalScriptTable(Table table, String tableId, SlimTestContext context, boolean fromConditionalScenario) {
        super(table, tableId, context);
        this.fromConditionalScenario = fromConditionalScenario;
    }

    @Override
    protected String getTableKeyword() {
        return "script if";
    }

    @Override
    // returns a list of statements
    protected List instructionsForRow(int row) throws TestExecutionException {
        List assertions;
        if ((null == getParent() || fromConditionalScenario) && row > 1 && !conditionResult) {
            assertions = skip(row);
        } else {
            assertions = super.instructionsForRow(row);
        }
        return assertions;
    }

    @Override
    protected List invokeAction(int startingCol, int endingCol, int row, SlimExpectation expectation) throws SyntaxError {
        List assertions = new ArrayList<>();
        if ((null == getParent() || fromConditionalScenario)  && row == 1) {

            if (this.table.getColumnCountInRow(row) > 1) {
                throw new SyntaxError("Conditional script tables can contain only the condition in the first row.");
            }
            String expr = this.table.getCellContents(0, row);
            try {
                SlimExpressionEvaluator evaluator = new SlimExpressionEvaluator();
                Map symbols = new HashMap<>();


                for(Map.Entry symbol: getTestContext().getSymbols().entrySet()) {
                    symbols.put(symbol.getKey(), new MethodExecutionResult(symbol.getValue(), String.class));
                }
                evaluator.setContext(expr, symbols);
                conditionResult = Boolean.parseBoolean(evaluator.evaluate(replaceSymbols(expr)).toString());

            } catch (IllegalArgumentException e) {
                throw new SyntaxError(e.getMessage());
            }
        } else {
            assertions.addAll(super.invokeAction(startingCol, endingCol, row, expectation));
        }
        return assertions;
    }

    private List skip(int row) {
        List assertions = new ArrayList<>();
        SlimAssertion skipAssertion = createSkipAssertion(row);
        assertions.add(skipAssertion);
        return assertions;
    }

    private SlimAssertion createSkipAssertion(int row) {
        Instruction instruction = Instruction.NOOP_INSTRUCTION;
        return makeAssertion(instruction, new SkipExpectation(0, row));
    }

    protected class SkipExpectation extends RowExpectation {
        SkipExpectation(int col, int row) {
            super(col, row);
        }

        @Override
        protected SlimTestResult createEvaluationMessage(String actual, String expected) {
            return SlimTestResult.testNotRun();
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy