- ScriptAssembler (Age.Engine/Sys4): assemble code+strings -> Script (inverse of Sys4Loader; also Phase-D modding-assembler groundwork). - SyntheticSceneTests: deterministic show-text/wait/nested-call-script/shared-global scene run with call-script handling ON. - WaitForInputTests: reworked onto a synthesized two-page scene (was: SC0000 stub=186). - RecoverTests: full call-script handling via a no-op subroutine double (isolates RECOVER's ISA semantics from real subroutines' game-state deps). - Retire TraceDiffTests: it matched the C# VM to vm0.py's stubbed-call-script trace; vm0.py is retired from oracle duty, and we no longer gate handling to keep it matching. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
39 lines
1.6 KiB
C#
39 lines
1.6 KiB
C#
using System.Collections.Generic;
|
|
using Age.Engine.Hosting;
|
|
using Age.Engine.Model;
|
|
|
|
/// <summary>Shared test doubles: a host that records observable effects, and an in-memory script
|
|
/// provider for synthetic call-script targets.</summary>
|
|
internal sealed class RecordingHost : IHost
|
|
{
|
|
public int Waits, CallScripts;
|
|
public readonly List<(int Offset, string Text)> Lines = new();
|
|
public void ShowText(int offset, string text) => Lines.Add((offset, text));
|
|
public void CallScript(long id) => CallScripts++;
|
|
public void OnStub(int opcode) { }
|
|
public void WaitForInput() => Waits++;
|
|
public void CreateTexture(int slot, int w, int h) { }
|
|
public void SetTexture(long resId, int slot) { }
|
|
public void DrawTexture(int slot, int sx, int sy, int w, int h, int dx, int dy) { }
|
|
public (int Width, int Height) GetTextureSize(int slot) => (0, 0);
|
|
public void PlayBgm(long id) { }
|
|
public void PlayVoice(long id) { }
|
|
}
|
|
|
|
internal sealed class MapProvider : IScriptProvider
|
|
{
|
|
private readonly Dictionary<long, Script> _m;
|
|
public MapProvider(Dictionary<long, Script> m) => _m = m;
|
|
public Script? GetById(long id) => _m.TryGetValue(id, out var s) ? s : null;
|
|
}
|
|
|
|
/// <summary>A controlled test double: every call-script id resolves to the same script (typically a
|
|
/// no-op that just exits). Lets a test run a real script with call-script handling ON while isolating
|
|
/// it from the real subroutines' game-state dependencies.</summary>
|
|
internal sealed class AnyProvider : IScriptProvider
|
|
{
|
|
private readonly Script _s;
|
|
public AnyProvider(Script s) => _s = s;
|
|
public Script? GetById(long id) => _s;
|
|
}
|