package au.id.zancanaro.javacheck.statem; import au.id.zancanaro.javacheck.Generator; import au.id.zancanaro.javacheck.annotations.DataSource; import au.id.zancanaro.javacheck.annotations.Property; import au.id.zancanaro.javacheck.junit.Properties; import org.junit.runner.RunWith; import java.util.*; import static au.id.zancanaro.javacheck.Generator.pure; import static au.id.zancanaro.javacheck.Generators.integer; import static au.id.zancanaro.javacheck.Generators.oneOf; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @RunWith(Properties.class) public class QueueTest { private static final Queue queue = new LinkedList<>(); @DataSource public static Generator>> commandGenerator = new CommandListGenerator<>(state -> oneOf( pure(new QueuePushCommand()), pure(new QueuePopCommand()) )); @Property public void test(CommandList> commands) { queue.clear(); CommandResult> result = commands.run(null); assertFalse(result.isFailed()); } private static class QueuePushCommand extends Command, Integer, Void> { @Override public Generator argsGenerator(List integers) { return integer(); } @Override public Void runCommand(Integer integer) { queue.offer(integer); return null; } @Override public List nextState(List integers, Integer integer, CommandValue result) { List nextState = new ArrayList<>(integers == null ? new ArrayList<>() : integers); nextState.add(integer); return nextState; } @Override public String toString() { return "push"; } } private static class QueuePopCommand extends Command, Void, Integer> { @Override public boolean preCondition(List integers, Void aVoid) { return integers != null && !integers.isEmpty(); } @Override public Integer runCommand(Void aVoid) { return queue.poll(); } @Override public boolean postCondition(List oldState, List newState, Void aVoid, Integer integer) { return Objects.equals(integer, oldState.get(0)); } @Override public List nextState(List integers, Void aVoid, CommandValue result) { List nextState = new ArrayList<>(integers == null ? new ArrayList<>() : integers); nextState.remove(0); return nextState; } @Override public String toString() { return "pop"; } } }