Сократить lifecycle overhead ранних ботов
This commit is contained in:
@@ -17,30 +17,27 @@ import static org.junit.Assert.assertTrue;
|
|||||||
public final class EarlyLevelPlaythroughTest {
|
public final class EarlyLevelPlaythroughTest {
|
||||||
@Test
|
@Test
|
||||||
public void levelOneProvesMovementAndJumpWithoutDeaths() {
|
public void levelOneProvesMovementAndJumpWithoutDeaths() {
|
||||||
for (int pass = 1; pass <= 3; pass++) {
|
runThreeConsecutive(EarlyLevelScenarios.levelOne(), 20_000L, (pass, result) -> {
|
||||||
LevelPlaytestBot.Result result = run(EarlyLevelScenarios.levelOne(), 20_000L);
|
|
||||||
assertTrue(passDiagnostic(pass, result), result.completed());
|
assertTrue(passDiagnostic(pass, result), result.completed());
|
||||||
assertEquals("Pass " + pass + ": level 1 must not require a volunteer",
|
assertEquals("Pass " + pass + ": level 1 must not require a volunteer",
|
||||||
0, result.deaths());
|
0, result.deaths());
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void levelTwoBuildsTheIntendedThreeCorpseBridge() {
|
public void levelTwoBuildsTheIntendedThreeCorpseBridge() {
|
||||||
for (int pass = 1; pass <= 3; pass++) {
|
runThreeConsecutive(EarlyLevelScenarios.levelTwo(), 30_000L, (pass, result) -> {
|
||||||
LevelPlaytestBot.Result result = run(EarlyLevelScenarios.levelTwo(), 30_000L);
|
|
||||||
assertTrue(passDiagnostic(pass, result), result.completed());
|
assertTrue(passDiagnostic(pass, result), result.completed());
|
||||||
assertEquals("Pass " + pass + ": the intended bridge uses three volunteers",
|
assertEquals("Pass " + pass + ": the intended bridge uses three volunteers",
|
||||||
3, result.deaths());
|
3, result.deaths());
|
||||||
assertEquals("Pass " + pass + ": all three bridge bodies must remain",
|
assertEquals("Pass " + pass + ": all three bridge bodies must remain",
|
||||||
3, result.corpseCount());
|
3, result.corpseCount());
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void levelThreeLeavesASawCorpseOnThePlateAndOpensTheDoor() {
|
public void levelThreeLeavesASawCorpseOnThePlateAndOpensTheDoor() {
|
||||||
for (int pass = 1; pass <= 3; pass++) {
|
runThreeConsecutive(EarlyLevelScenarios.levelThree(), 25_000L, (pass, result) -> {
|
||||||
LevelPlaytestBot.Result result = run(EarlyLevelScenarios.levelThree(), 25_000L);
|
|
||||||
assertTrue(passDiagnostic(pass, result), result.completed());
|
assertTrue(passDiagnostic(pass, result), result.completed());
|
||||||
assertEquals("Pass " + pass + ": the saw solution requires one volunteer",
|
assertEquals("Pass " + pass + ": the saw solution requires one volunteer",
|
||||||
1, result.deaths());
|
1, result.deaths());
|
||||||
@@ -48,34 +45,40 @@ public final class EarlyLevelPlaythroughTest {
|
|||||||
1, result.corpseCount());
|
1, result.corpseCount());
|
||||||
assertTrue("Pass " + pass + ": the corpse must keep the pressure door open",
|
assertTrue("Pass " + pass + ": the corpse must keep the pressure door open",
|
||||||
result.doorOpened());
|
result.doorOpened());
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void levelFourTogglesAndRidesTheLiftToTheUpperGallery() {
|
public void levelFourTogglesAndRidesTheLiftToTheUpperGallery() {
|
||||||
for (int pass = 1; pass <= 3; pass++) {
|
runThreeConsecutive(EarlyLevelScenarios.levelFour(), 30_000L, (pass, result) -> {
|
||||||
LevelPlaytestBot.Result result = run(EarlyLevelScenarios.levelFour(), 30_000L);
|
|
||||||
assertTrue(passDiagnostic(pass, result), result.completed());
|
assertTrue(passDiagnostic(pass, result), result.completed());
|
||||||
assertEquals("Pass " + pass + ": the lift route must not require a volunteer",
|
assertEquals("Pass " + pass + ": the lift route must not require a volunteer",
|
||||||
0, result.deaths());
|
0, result.deaths());
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String passDiagnostic(int pass, LevelPlaytestBot.Result result) {
|
private static String passDiagnostic(int pass, LevelPlaytestBot.Result result) {
|
||||||
return "Consecutive pass " + pass + ": " + result.diagnostic();
|
return "Consecutive pass " + pass + ": " + result.diagnostic();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static LevelPlaytestBot.Result run(LevelPlaytestBot.Scenario scenario, long timeoutMillis) {
|
private static void runThreeConsecutive(LevelPlaytestBot.Scenario scenario, long timeoutMillis,
|
||||||
|
ResultAssertion assertion) {
|
||||||
try (ActivityScenario<MainActivity> activity = ActivityScenario.launch(MainActivity.class)) {
|
try (ActivityScenario<MainActivity> activity = ActivityScenario.launch(MainActivity.class)) {
|
||||||
final GameView[] view = new GameView[1];
|
final GameView[] view = new GameView[1];
|
||||||
activity.onActivity(mainActivity -> view[0] = mainActivity.gameViewForAutomation());
|
activity.onActivity(mainActivity -> view[0] = mainActivity.gameViewForAutomation());
|
||||||
return new LevelPlaytestBot().run(
|
AndroidDriver driver = new AndroidDriver(
|
||||||
new AndroidDriver(InstrumentationRegistry.getInstrumentation(), view[0]),
|
InstrumentationRegistry.getInstrumentation(), view[0]);
|
||||||
scenario,
|
LevelPlaytestBot bot = new LevelPlaytestBot();
|
||||||
timeoutMillis
|
for (int pass = 1; pass <= 3; pass++) {
|
||||||
);
|
assertion.verify(pass, bot.run(driver, scenario, timeoutMillis));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
private interface ResultAssertion {
|
||||||
|
void verify(int pass, LevelPlaytestBot.Result result);
|
||||||
|
}
|
||||||
|
|
||||||
private static final class AndroidDriver implements LevelPlaytestBot.Driver {
|
private static final class AndroidDriver implements LevelPlaytestBot.Driver {
|
||||||
private final Instrumentation instrumentation;
|
private final Instrumentation instrumentation;
|
||||||
|
|||||||
@@ -25,6 +25,25 @@ public final class LevelPlaytestBotTest {
|
|||||||
assertEquals("Reach the goal", result.lastStep());
|
assertEquals("Reach the goal", result.lastStep());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sameDriverCanRestartTheCompleteScenarioThreeTimes() {
|
||||||
|
ScriptedDriver driver = new ScriptedDriver();
|
||||||
|
LevelPlaytestBot.Scenario scenario = LevelPlaytestBot.Scenario
|
||||||
|
.builder(7, "Repeated scenario")
|
||||||
|
.step("Create a corpse", 1_000L, LevelPlaytestBot.Input.right(),
|
||||||
|
snapshot -> snapshot.deaths() >= 1)
|
||||||
|
.step("Reach the goal", 1_000L, LevelPlaytestBot.Input.left(),
|
||||||
|
GameView.AutomationSnapshot::completed)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
for (int pass = 1; pass <= 3; pass++) {
|
||||||
|
LevelPlaytestBot.Result result = new LevelPlaytestBot().run(driver, scenario, 5_000L);
|
||||||
|
assertTrue("Pass " + pass + ": " + result.diagnostic(), result.completed());
|
||||||
|
assertEquals("Pass " + pass, "Reach the goal", result.lastStep());
|
||||||
|
assertEquals("Pass " + pass, 1, result.deaths());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void stepTimeoutReportsItsNameAndObservableSnapshot() {
|
public void stepTimeoutReportsItsNameAndObservableSnapshot() {
|
||||||
ScriptedDriver driver = new ScriptedDriver(false);
|
ScriptedDriver driver = new ScriptedDriver(false);
|
||||||
@@ -81,6 +100,11 @@ public final class LevelPlaytestBotTest {
|
|||||||
@Override
|
@Override
|
||||||
public void startLevel(int oneBasedLevelNumber) {
|
public void startLevel(int oneBasedLevelNumber) {
|
||||||
startedLevel = oneBasedLevelNumber;
|
startedLevel = oneBasedLevelNumber;
|
||||||
|
nowMillis = 0L;
|
||||||
|
moveLeft = false;
|
||||||
|
moveRight = false;
|
||||||
|
deaths = 0;
|
||||||
|
completed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user