/*
* Copyright 2010-2012 VMware and contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springsource.loaded.testgen;
import java.util.ArrayList;
import java.util.List;
public class SystematicChoiceGenerator implements IChoiceGenerator {
boolean firstChoice = true;
/**
* Record choices in here so they can be retrieved afterwards
*/
public List<Boolean> choices = new ArrayList<Boolean>();
public int next;
public SystematicChoiceGenerator() {
}
public SystematicChoiceGenerator(List<Boolean> replayChoices) {
replay(replayChoices);
}
public boolean nextBoolean() {
Boolean chosen = null;
if (next < choices.size()) {
chosen = choices.get(next++);
}
else {
chosen = firstChoice;
choices.add(chosen);
next++;
}
return chosen;
}
/**
* Should be called when reusing this choice generator. It will produce a test run that makes identical choices than
* the previous run.
*/
public void restart() {
}
/**
* Reinitialise the state of the choice generator to replay a given list of choices.
*/
private void replay(List<Boolean> replayChoices) {
this.choices = replayChoices;
this.next = 0;
}
/**
* Call this method to 'advance' the predetermined choices array by one (this will do a kind of backtracking
* starting by trying to change the last choice for which the alternative has not been tried yet.
* <p>
*
* @return true if backtracking was successful, false if all options where explored.
*/
public boolean backtrack() {
//First throw away any unused replayable choice bits beyond the 'next' pointer.
replay(new ArrayList<Boolean>(choices.subList(0, next))); //Note this must be a copy, not a view, to avoid mutation of
//'remembered' choices for replay.
//Backtrack to the last choice we can change:
int last = choices.size() - 1;
while (last >= 0) {
if (choices.get(last) == firstChoice) {
choices.set(last, !firstChoice);
return true; //Found another choice to explore
}
else {
choices.remove(last);
last--;
}
}
return false; //No more choices can be changed
}
@Override
public String toString() {
StringBuffer result = new StringBuffer();
for (int i = 0; i < choices.size(); i++) {
if (i == next)
result.append(" next-->");
result.append(choices.get(i) ? '1' : '0');
}
return result.toString();
}
}