Выделить CorpseManager

This commit is contained in:
2026-08-19 03:43:20 +03:00
parent 62ee6877f9
commit cc3b5902cc
8 changed files with 436 additions and 69 deletions
@@ -0,0 +1,74 @@
package com.projectsacrifice.game;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.app.Instrumentation;
import androidx.test.core.app.ActivityScenario;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public final class CorpseManagerIntegrationTest {
@Test
public void deathRegistersAndRestartResetsTheOwnedBodyLifecycle() throws Exception {
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
try (ActivityScenario<MainActivity> activity =
ActivityScenario.launch(MainActivity.class)) {
GameView[] view = new GameView[1];
activity.onActivity(current -> view[0] = current.gameViewForAutomation());
instrumentation.runOnMainSync(() -> {
view[0].startLevelForAutomation(10);
view[0].setAutomationInput(false, true, false);
});
GameView.AutomationSnapshot died = awaitBody(instrumentation, view[0], 8_000L);
CorpseManager.Diagnostics before = diagnostics(instrumentation, view[0]);
assertEquals(1, died.corpseCount());
assertEquals(1L, before.registered());
assertEquals(0L, before.evicted());
instrumentation.runOnMainSync(view[0]::restartLevelForAutomation);
GameView.AutomationSnapshot restarted = snapshot(instrumentation, view[0]);
CorpseManager.Diagnostics after = diagnostics(instrumentation, view[0]);
assertEquals(0, restarted.corpseCount());
assertEquals(before.resets() + 1L, after.resets());
assertEquals(before.clearedByReset() + 1L, after.clearedByReset());
assertTrue(restarted.playerAlive());
}
}
private static GameView.AutomationSnapshot awaitBody(
Instrumentation instrumentation, GameView view, long timeoutMillis)
throws Exception {
long deadline = System.currentTimeMillis() + timeoutMillis;
GameView.AutomationSnapshot current = snapshot(instrumentation, view);
while (System.currentTimeMillis() < deadline) {
current = snapshot(instrumentation, view);
if (current.corpseCount() == 1) return current;
Thread.sleep(24L);
}
throw new AssertionError("Body was not registered; deaths=" + current.deaths()
+ ", corpses=" + current.corpseCount());
}
private static GameView.AutomationSnapshot snapshot(
Instrumentation instrumentation, GameView view) {
GameView.AutomationSnapshot[] result = new GameView.AutomationSnapshot[1];
instrumentation.runOnMainSync(() -> result[0] = view.automationSnapshot());
return result[0];
}
private static CorpseManager.Diagnostics diagnostics(
Instrumentation instrumentation, GameView view) {
CorpseManager.Diagnostics[] result = new CorpseManager.Diagnostics[1];
instrumentation.runOnMainSync(
() -> result[0] = view.corpseDiagnosticsForAutomation());
return result[0];
}
}