package com.github.fge.grappa.run;
import com.github.fge.grappa.Grappa;
import com.github.fge.grappa.parsers.BaseParser;
import com.github.fge.grappa.rules.Rule;
import com.github.fge.grappa.stack.ValueStack;
import org.testng.annotations.Test;
import java.util.function.Supplier;
import static org.assertj.core.api.Assertions.assertThat;
public final class ValueStackResetTest
{
private static final Object VALUE1 = new Object();
private static final Object VALUE2 = new Object();
private static final Supplier<Object> SUPPLIER = new Supplier<Object>()
{
private boolean firstConsumed = false;
@Override
public Object get()
{
if (firstConsumed)
return VALUE2;
firstConsumed = true;
return VALUE1;
}
};
@SuppressWarnings("AutoBoxing")
static class TestParser
extends BaseParser<Object>
{
public Rule rule()
{
return sequence(ANY, push(SUPPLIER.get()));
}
}
@Test
public void stackIsClearedBetweenParsingRuns()
{
final TestParser parser = Grappa.createParser(TestParser.class);
final ParseRunner<Object> runner = new ParseRunner<>(parser.rule());
ParsingResult<Object> result;
ValueStack<Object> stack;
Object actual;
Object expected;
result = runner.run("a");
stack = result.getValueStack();
assertThat(stack).hasSize(1);
expected = VALUE1;
actual = stack.peek();
assertThat(actual).isSameAs(expected);
result = runner.run("a");
stack = result.getValueStack();
assertThat(stack).hasSize(1);
expected = VALUE2;
actual = stack.peek();
assertThat(actual).isSameAs(expected);
}
}