package com.plectix.simulator.commandline;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import junit.framework.Assert;
import org.apache.commons.cli.ParseException;
import org.junit.Test;
import com.plectix.simulator.simulator.SimulationArguments;
import com.plectix.simulator.simulator.SimulatorCommandLine;
import com.plectix.simulator.simulator.options.SimulatorFlagOption;
import com.plectix.simulator.simulator.options.SimulatorOption;
import com.plectix.simulator.simulator.options.SimulatorParameterizedOption;
public class TestCommandLineOptionsToBeSet {
private final int setAllNumberParametersTo = 10;
private final String setAllStringParametersTo = "parameter";
@Test
public void test() throws Exception {
List<String> options = this.prepareListOfOptions();
// if you want to check more cases, just reduce this variable
long step = 1136416724988959L;
long prev = 0;
BitSet bitSet;
for (long t = 1; t < Long.MAX_VALUE && prev < t; t += step) {
bitSet = this.longToBitSet(t);
Set<String> set = this.getSubset(options, bitSet);
this.testCommandLine(normalize(set), set);
prev = t;
}
}
private void testCommandLine(String[] commandLine, Set<String> helpSet) throws Exception {
// this.getResult(commandLine);
try {
SimulatorCommandLine simCommandLine = new SimulatorCommandLine(commandLine);
SimulationArguments arguments = simCommandLine.getSimulationArguments();
boolean fileNameWasSet = false;
int parametersCounter = 0;
for(String commandLineArgument : commandLine) {
if (commandLineArgument.equals("filename") && !fileNameWasSet) {
fileNameWasSet = true;
} else if (commandLineArgument.equals(setAllStringParametersTo)
|| commandLineArgument.equals(setAllNumberParametersTo + "")) {
parametersCounter++;
}
}
Assert.assertTrue("failed on " + helpSet,
arguments.allParametersAreDefaultOrEqualTo(
setAllNumberParametersTo, setAllStringParametersTo,
parametersCounter,
fileNameWasSet));
} catch (ParseException e) {
if (!e.getMessage().equals("two input files!")) {
Assert.fail(e.getMessage());
}
}
}
private String[] normalize(Set<String> options) {
ArrayList<String> list = new ArrayList<String>();
int i = 0;
for (String option : options) {
String[] words = option.split(" ");
list.add(words[0]);
if (words.length > 1) {
list.add(words[1]);
}
i++;
}
return list.toArray(new String[list.size()]);
}
private Set<SimulatorParameterizedOption> exceptions() {
Set<SimulatorParameterizedOption> options = new HashSet<SimulatorParameterizedOption>();
options.add(SimulatorParameterizedOption.COMPILE);
options.add(SimulatorParameterizedOption.STORIFY);
options.add(SimulatorParameterizedOption.SIMULATIONFILE);
options.add(SimulatorParameterizedOption.QUALITATIVE_COMPRESSION);
options.add(SimulatorParameterizedOption.QUANTITATIVE_COMPRESSION);
options.add(SimulatorParameterizedOption.GENERATE_INFLUENCE_MAP);
options.add(SimulatorParameterizedOption.CONTACT_MAP);
options.add(SimulatorParameterizedOption.INPUT);
return options;
}
private List<String> prepareListOfOptions() {
List<String> list = new ArrayList<String>();
for (SimulatorFlagOption flag : SimulatorFlagOption.values()) {
list.add(optionToCommandLineArgument(flag));
}
for (SimulatorParameterizedOption parameter : SimulatorParameterizedOption
.values()) {
if (parameter.getParameterType().equals(String.class)) {
if (this.exceptions().contains(parameter)) {
list.add(optionToCommandLineArgument(parameter) + " filename");
} else {
list.add(optionToCommandLineArgument(parameter) + " " + setAllStringParametersTo);
}
} else {
list.add(optionToCommandLineArgument(parameter) + " " + setAllNumberParametersTo);
}
}
return list;
}
private String optionToCommandLineArgument(SimulatorOption option) {
return "--" + option.getLongName().replace("_", "-");
}
private <E> Set<E> getSubset(List<E> source, BitSet bitSet) {
Set<E> set = new HashSet<E>();
for (int i = 0; i < source.size(); i++) {
if (bitSet.get(i)) {
set.add(source.get(i));
}
}
return set;
}
private BitSet longToBitSet(long argument) {
BitSet bitSet = new BitSet();
char[] chars = Long.toString(argument, 2).toCharArray();
for (int i = 0; i < chars.length; i++) {
if (chars[i] == '1') {
bitSet.set(i);
}
}
return bitSet;
}
}