package jp.vmi.selenium.selenese.command;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
import org.apache.commons.lang3.ArrayUtils;
import org.junit.Test;
import jp.vmi.selenium.selenese.Context;
import jp.vmi.selenium.selenese.result.Result;
import static jp.vmi.selenium.selenese.result.Success.*;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.*;
@SuppressWarnings("javadoc")
public class CommandSequenceTest {
private static class DummyCommand extends AbstractCommand {
private static final ArgumentType[] EMPTY_ARGUMENT_TYPE = new ArgumentType[0];
public DummyCommand(int index, String name, StartLoop startLoop) {
super(index, name, ArrayUtils.EMPTY_STRING_ARRAY, EMPTY_ARGUMENT_TYPE);
setStartLoop(startLoop);
}
@Override
protected Result executeImpl(Context context, String... curArgs) {
return SUCCESS;
}
}
private static class DummyStartLoop extends DummyCommand implements StartLoop {
public DummyStartLoop(int index, String name, StartLoop startLoop) {
super(index, name, startLoop);
}
@Override
public void setEndLoop(EndLoop endLoop) {
}
}
private static final char C = 'c';
private static final char W = 'w';
private static final char E = 'e';
private static List<ICommand> build(char... cmds) {
List<ICommand> result = new ArrayList<>();
Deque<StartLoop> startLoopStack = new ArrayDeque<>();
startLoopStack.addFirst(StartLoop.NO_START_LOOP);
for (char cmd : cmds) {
switch (cmd) {
case C:
result.add(new DummyCommand(result.size(), String.valueOf(cmd), startLoopStack.peekFirst()));
break;
case W:
DummyStartLoop w = new DummyStartLoop(result.size(), String.valueOf(cmd), startLoopStack.peekFirst());
startLoopStack.addFirst(w);
result.add(w);
break;
case E:
DummyCommand e = new DummyCommand(result.size(), String.valueOf(cmd), startLoopStack.peekFirst());
startLoopStack.pollFirst();
result.add(e);
break;
default:
throw new IllegalArgumentException("Invalid command: " + cmd);
}
}
return result;
}
private static String[] RESULTS = {
"1",
"2-1",
"2-2",
"2-3",
"3",
"4-1",
"4-2-1",
"4-2-2",
"4-2-3",
"4-3-1",
"4-3-2",
"4-3-3",
"4-4",
"5"
};
@Test
public void test() {
CommandSequence sut = new CommandSequence(null);
List<ICommand> cl = build(C, W, C, E, C, W, W, C, E, W, C, E, E, C);
int i = 0;
for (ICommand c : cl) {
String r = RESULTS[i++];
sut.increment(c);
assertThat(sut.toString(), is(r));
}
sut.increment(cl.get(2));
assertThat(sut.toString(), is("6-1"));
sut.increment(cl.get(7));
assertThat(sut.toString(), is("7-1-1"));
sut.increment(cl.get(2));
assertThat(sut.toString(), is("8-1"));
}
}