// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the CPL Common Public License version 1.0.
package fitnesse.testsystems.slim;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import fitnesse.testsystems.ExecutionResult;
import fitnesse.testsystems.TestPage;
import fitnesse.testsystems.TestSummary;
import fitnesse.testsystems.slim.tables.ScenarioTable;
public class SlimTestContextImpl implements SlimTestContext {
private final Map<String, String> symbols = new HashMap<>();
private final Map<String, ScenarioTable> scenarios = new HashMap<>(512);
private final TestSummary testSummary = new TestSummary();
private final TestPage pageToTest;
private List<ScenarioTable> scenariosWithInputs = null;
private boolean isSorted = true;
public SlimTestContextImpl(TestPage pageToTest) {
this.pageToTest = pageToTest;
}
@Override
public String getSymbol(String symbolName) {
return symbols.get(symbolName);
}
@Override
public void setSymbol(String symbolName, String value) {
symbols.put(symbolName, value);
}
@Override
public void addScenario(String scenarioName, ScenarioTable scenarioTable) {
ScenarioTable oldValue = scenarios.put(scenarioName, scenarioTable);
if (scenariosWithInputs != null) {
maintainScenariosWithInputs(oldValue, scenarioTable);
}
}
@Override
public ScenarioTable getScenario(String scenarioName) {
return scenarios.get(scenarioName);
}
@Override
public ScenarioTable getScenarioByPattern(String invokingString) {
ScenarioTable result = null;
for (ScenarioTable s : getScenariosWithMostArgumentsFirst()) {
if (s.canMatchParameters(invokingString)) {
result = s;
break;
}
}
return result;
}
private List<ScenarioTable> getScenariosWithMostArgumentsFirst() {
if (scenariosWithInputs == null) {
initializeScenariosWithInputs();
}
if (!isSorted) {
Collections.sort(scenariosWithInputs, new ScenarioTableLengthComparator());
isSorted = true;
}
return scenariosWithInputs;
}
private static class ScenarioTableLengthComparator implements Comparator<ScenarioTable> {
@Override
public int compare(ScenarioTable st1, ScenarioTable st2) {
int size1 = st1.getInputs().size();
int size2 = st2.getInputs().size();
return size2 - size1;
}
}
private void initializeScenariosWithInputs() {
int initialCapacity = scenarios.size();
scenariosWithInputs = new ArrayList<>(initialCapacity);
isSorted = true;
for (ScenarioTable table : scenarios.values()) {
addToScenariosWithInputsIfNeeded(table);
}
}
private void maintainScenariosWithInputs(ScenarioTable oldTable, ScenarioTable newTable) {
if (oldTable != null && !oldTable.getInputs().isEmpty()) {
scenariosWithInputs.remove(oldTable);
}
addToScenariosWithInputsIfNeeded(newTable);
}
private void addToScenariosWithInputsIfNeeded(ScenarioTable newTable) {
if (!newTable.getInputs().isEmpty()) {
scenariosWithInputs.add(newTable);
isSorted = false;
}
}
@Override
public Collection<ScenarioTable> getScenarios() {
return scenarios.values();
}
@Override
public void incrementPassedTestsCount() {
increment(ExecutionResult.PASS);
}
@Override
public void incrementFailedTestsCount() {
increment(ExecutionResult.FAIL);
}
@Override
public void incrementErroredTestsCount() {
increment(ExecutionResult.ERROR);
}
@Override
public void incrementIgnoredTestsCount() {
increment(ExecutionResult.IGNORE);
}
@Override
public void increment(ExecutionResult result) {
this.testSummary.add(result);
}
@Override
public void increment(TestSummary testSummary) {
this.testSummary.add(testSummary);
}
public TestSummary getTestSummary() {
return testSummary;
}
@Override
public TestPage getPageToTest() {
return pageToTest;
}
}