refactor(engine-ambient): GameMgr.GetIns throws Require; wrap SessionBattleEngine entry points
Step 5 of multi-instancing migration. GameMgr.GetIns() now resolves through BattleAmbient.Require() (throws when no scope active — fail-fast since engine callers unconditionally dereference). SessionBattleEngine now owns a single BattleAmbientContext, pushed via BattleAmbient.Enter at Setup/Receive/all ~30 read accessors and Debug* seams. EngineGlobalInit.WirePerSessionGameMgr extracted out of the _done-gated block: GameMgr is now per-session (ctx.GameMgr is a fresh `new()` per SessionBattleEngine), so the DataMgr chara ids + NetworkUserInfoData seeding must run every Setup, not process-once. The wiring itself is already idempotent. Without this, second-or- later sessions in a process NRE in NetworkBattleManagerBase.CreateBackgroundId. Expected state: SVSim.BattleEngine.Tests have known-failing tests that don't go through SessionBattleEngine (Task 6 wraps HeadlessFixture). SVSim.UnitTests mostly recover; residual failures (deal-frame Accepted:false in conductor integration tests) are captured in data_dumps/task5-test-output/failing-tests-after-task5-node-postwrap.txt for Task 7. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -200,4 +200,41 @@ public class BattleAmbientTests
|
||||
Wizard.Data.BattleRecoveryInfo = info;
|
||||
Assert.That(ctx.RecoveryInfo, Is.SameAs(info));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GameMgr_GetIns_InsideScope_ReturnsScopeInstance()
|
||||
{
|
||||
var mgr = new GameMgr();
|
||||
var ctx = new BattleAmbientContext { GameMgr = mgr };
|
||||
using var _ = BattleAmbient.Enter(ctx);
|
||||
Assert.That(GameMgr.GetIns(), Is.SameAs(mgr));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GameMgr_GetIns_OutsideScope_Throws()
|
||||
{
|
||||
Assert.That(BattleAmbient.Current, Is.Null);
|
||||
Assert.Throws<System.InvalidOperationException>(() => GameMgr.GetIns());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task GameMgr_GetIns_IsolatedBetweenConcurrentTasks()
|
||||
{
|
||||
var mgrA = new GameMgr();
|
||||
var mgrB = new GameMgr();
|
||||
|
||||
var taskA = Task.Run(async () => {
|
||||
using var _ = BattleAmbient.Enter(new BattleAmbientContext { GameMgr = mgrA });
|
||||
await Task.Delay(20);
|
||||
return GameMgr.GetIns();
|
||||
});
|
||||
var taskB = Task.Run(async () => {
|
||||
using var _ = BattleAmbient.Enter(new BattleAmbientContext { GameMgr = mgrB });
|
||||
await Task.Delay(20);
|
||||
return GameMgr.GetIns();
|
||||
});
|
||||
var results = await Task.WhenAll(taskA, taskB);
|
||||
Assert.That(results[0], Is.SameAs(mgrA));
|
||||
Assert.That(results[1], Is.SameAs(mgrB));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user