Enable SameBoy in testroms projects

This commit is contained in:
YoshiRulz 2022-01-31 19:10:04 +10:00
parent 7392df29d9
commit 5d92ca3b4f
No known key found for this signature in database
GPG Key ID: C4DE31C245353FB7
7 changed files with 2223 additions and 6 deletions

View File

@ -101,7 +101,7 @@ namespace BizHawk.Tests.Testroms.GB
TestUtils.ShortCircuitKnownFailure(caseStr, KnownFailures, out var knownFail);
var actualUnnormalised = DummyFrontend.RunAndScreenshot(
InitGBCore(testCase.Setup, $"{testCase.TestName}.gbc", ReflectionCache.EmbeddedResourceStream(testCase.RomEmbedPath).ReadAllBytes()),
static fe => fe.FrameAdvanceBy(15));
static fe => fe.FrameAdvanceBy(18));
var state = GBScreenshotsEqual(
ReflectionCache.EmbeddedResourceStream(testCase.ExpectEmbedPath),
actualUnnormalised,

View File

@ -37,6 +37,8 @@ namespace BizHawk.Tests.Testroms.GB
private static readonly IReadOnlyCollection<string> KnownFailures = new[]
{
"BullyGB on CGB_C in GBHawk",
"BullyGB on CGB_C in SameBoy (no BIOS)",
"BullyGB on DMG in SameBoy (no BIOS)",
};
private static readonly bool RomIsPresent = ReflectionCache.EmbeddedResourceList().Contains(ROM_EMBED_PATH);
@ -61,7 +63,7 @@ namespace BizHawk.Tests.Testroms.GB
TestUtils.ShortCircuitKnownFailure(caseStr, KnownFailures, out var knownFail);
var actualUnnormalised = DummyFrontend.RunAndScreenshot(
InitGBCore(setup, "bully.gbc", ReflectionCache.EmbeddedResourceStream(ROM_EMBED_PATH).ReadAllBytes()),
static fe => fe.FrameAdvanceBy(18));
static fe => fe.FrameAdvanceBy(20));
var state = GBScreenshotsEqual(
ReflectionCache.EmbeddedResourceStream($"res.BullyGB_artifact.expected_{(setup.Variant.IsColour() ? "cgb" : "dmg")}.png"),
actualUnnormalised,

View File

@ -7,11 +7,13 @@ using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores;
using BizHawk.Emulation.Cores.Nintendo.Gameboy;
using BizHawk.Emulation.Cores.Nintendo.GBHawk;
using BizHawk.Emulation.Cores.Nintendo.Sameboy;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using static BizHawk.Emulation.Cores.Nintendo.Gameboy.Gameboy;
using static BizHawk.Emulation.Cores.Nintendo.GBHawk.GBHawk;
using static BizHawk.Emulation.Cores.Nintendo.Sameboy.Sameboy;
namespace BizHawk.Tests.Testroms.GB
{
@ -22,7 +24,14 @@ namespace BizHawk.Tests.Testroms.GB
public readonly struct CoreSetup
{
public static IReadOnlyCollection<CoreSetup> ValidSetupsFor(ConsoleVariant variant)
=> new CoreSetup[] { new(CoreNames.Gambatte, variant), new(CoreNames.Gambatte, variant, useBios: false), new(CoreNames.GbHawk, variant) };
=> new CoreSetup[]
{
new(CoreNames.Gambatte, variant),
new(CoreNames.Gambatte, variant, useBios: false),
new(CoreNames.GbHawk, variant),
new(CoreNames.Sameboy, variant),
new(CoreNames.Sameboy, variant, useBios: false),
};
public readonly string CoreName;
@ -55,6 +64,20 @@ namespace BizHawk.Tests.Testroms.GB
private static readonly GBSyncSettings GBHawkSyncSettings_GBC = new() { ConsoleMode = GBSyncSettings.ConsoleModeType.GBC };
private static readonly SameboySettings SameBoySettings = new() { ColorCorrection = SameboySettings.ColorCorrectionMode.DISABLED };
private static readonly SameboySyncSettings SameBoySyncSettings_GB_NOBIOS = new() { ConsoleMode = SameboySyncSettings.GBModel.GB_MODEL_DMG_B, EnableBIOS = false };
private static readonly SameboySyncSettings SameBoySyncSettings_GB_USEBIOS = new() { ConsoleMode = SameboySyncSettings.GBModel.GB_MODEL_DMG_B, EnableBIOS = true };
private static readonly SameboySyncSettings SameBoySyncSettings_GBC_C_NOBIOS = new() { ConsoleMode = SameboySyncSettings.GBModel.GB_MODEL_CGB_C, EnableBIOS = false };
private static readonly SameboySyncSettings SameBoySyncSettings_GBC_C_USEBIOS = new() { ConsoleMode = SameboySyncSettings.GBModel.GB_MODEL_CGB_C, EnableBIOS = true };
private static readonly SameboySyncSettings SameBoySyncSettings_GBC_D_NOBIOS = new() { ConsoleMode = SameboySyncSettings.GBModel.GB_MODEL_CGB_D, EnableBIOS = false };
private static readonly SameboySyncSettings SameBoySyncSettings_GBC_D_USEBIOS = new() { ConsoleMode = SameboySyncSettings.GBModel.GB_MODEL_CGB_D, EnableBIOS = true };
public static readonly IReadOnlyDictionary<int, int> MattCurriePaletteMap = new Dictionary<int, int>
{
[0x0F3EAA] = 0x0000FF,
@ -126,6 +149,15 @@ namespace BizHawk.Tests.Testroms.GB
? GBHawkSyncSettings_GBC
: GBHawkSyncSettings_GB;
public static SameboySyncSettings GetSameBoySyncSettings(ConsoleVariant variant, bool biosAvailable)
=> variant switch
{
ConsoleVariant.CGB_C => biosAvailable ? SameBoySyncSettings_GBC_C_USEBIOS : SameBoySyncSettings_GBC_C_NOBIOS,
ConsoleVariant.CGB_D => biosAvailable ? SameBoySyncSettings_GBC_D_USEBIOS : SameBoySyncSettings_GBC_D_NOBIOS,
ConsoleVariant.DMG or ConsoleVariant.DMG_B => biosAvailable ? SameBoySyncSettings_GB_USEBIOS : SameBoySyncSettings_GB_NOBIOS,
_ => throw new Exception()
};
public static DummyFrontend.ClassInitCallbackDelegate InitGBCore(CoreSetup setup, string romFilename, byte[] rom)
=> (efp, _, coreComm) =>
{
@ -135,9 +167,10 @@ namespace BizHawk.Tests.Testroms.GB
{
CoreNames.Gambatte => new Gameboy(coreComm, game, rom, GambatteSettings, GetGambatteSyncSettings(setup.Variant, setup.UseBIOS), deterministic: true),
CoreNames.GbHawk => new GBHawk(coreComm, game, rom, new(), GetGBHawkSyncSettings(setup.Variant)),
CoreNames.Sameboy => new Sameboy(coreComm, game, rom, SameBoySettings, GetSameBoySyncSettings(setup.Variant, setup.UseBIOS), deterministic: true),
_ => throw new Exception()
};
var biosWaitDuration = setup.UseBIOS
var biosWaitDuration = setup.UseBIOS || setup.CoreName is CoreNames.Sameboy
? setup.Variant.IsColour()
? 186
: 334
@ -153,6 +186,7 @@ namespace BizHawk.Tests.Testroms.GB
=> setup.CoreName switch
{
CoreNames.Gambatte => ImageUtils.PaletteSwap(img, setup.Variant.IsColour() ? UnVividGBCPaletteMap : UnVividGBPaletteMap),
CoreNames.Sameboy => setup.Variant.IsColour() ? ImageUtils.PaletteSwap(img, UnVividGBCPaletteMap) : img,
_ => img
};
}

View File

@ -8,6 +8,7 @@ using BizHawk.Common.StringExtensions;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores;
using BizHawk.Emulation.Cores.Nintendo.GBHawk;
using BizHawk.Emulation.Cores.Nintendo.Sameboy;
using Microsoft.VisualStudio.TestTools.UnitTesting;
@ -34,34 +35,56 @@ namespace BizHawk.Tests.Testroms.GB
"m3_bgp_change_sprites on CGB_C in Gambatte", // Gambatte's GBC emulation matches CGB D variant
"m3_bgp_change_sprites on CGB_C in Gambatte (no BIOS)", // Gambatte's GBC emulation matches CGB D variant
"m3_bgp_change_sprites on CGB_C in GBHawk",
"m3_bgp_change_sprites on CGB_C in SameBoy",
"m3_bgp_change_sprites on CGB_C in SameBoy (no BIOS)",
"m3_bgp_change_sprites on CGB_D in GBHawk",
"m3_bgp_change_sprites on DMG in Gambatte",
"m3_bgp_change_sprites on DMG in Gambatte (no BIOS)",
"m3_bgp_change_sprites on DMG in GBHawk",
"m3_lcdc_bg_en_change on CGB_C in SameBoy",
"m3_lcdc_bg_en_change on CGB_C in SameBoy (no BIOS)",
"m3_lcdc_bg_en_change on DMG in Gambatte",
"m3_lcdc_bg_en_change on DMG in Gambatte (no BIOS)",
"m3_lcdc_bg_en_change on DMG in GBHawk",
"m3_lcdc_bg_en_change on DMG in SameBoy",
"m3_lcdc_bg_en_change on DMG in SameBoy (no BIOS)",
"m3_lcdc_bg_en_change on DMG_B in Gambatte",
"m3_lcdc_bg_en_change on DMG_B in Gambatte (no BIOS)",
"m3_lcdc_bg_en_change on DMG_B in GBHawk",
"m3_lcdc_bg_en_change on DMG_B in SameBoy",
"m3_lcdc_bg_en_change on DMG_B in SameBoy (no BIOS)",
"m3_lcdc_bg_en_change2 on CGB_C in SameBoy",
"m3_lcdc_bg_en_change2 on CGB_C in SameBoy (no BIOS)",
"m3_lcdc_bg_map_change on CGB_C in GBHawk",
"m3_lcdc_bg_map_change on DMG in GBHawk",
"m3_lcdc_bg_map_change2 on CGB_C in GBHawk",
"m3_lcdc_bg_map_change2 on CGB_C in SameBoy",
"m3_lcdc_bg_map_change2 on CGB_C in SameBoy (no BIOS)",
"m3_lcdc_obj_en_change on CGB_C in SameBoy",
"m3_lcdc_obj_en_change on CGB_C in SameBoy (no BIOS)",
"m3_lcdc_obj_en_change on DMG in Gambatte",
"m3_lcdc_obj_en_change on DMG in Gambatte (no BIOS)",
"m3_lcdc_obj_en_change on DMG in GBHawk",
"m3_lcdc_obj_en_change_variant on CGB_C in Gambatte", // Gambatte's GBC emulation matches CGB D variant
"m3_lcdc_obj_en_change_variant on CGB_C in Gambatte (no BIOS)", // Gambatte's GBC emulation matches CGB D variant
"m3_lcdc_obj_en_change_variant on CGB_C in GBHawk",
"m3_lcdc_obj_en_change_variant on CGB_C in SameBoy",
"m3_lcdc_obj_en_change_variant on CGB_C in SameBoy (no BIOS)",
"m3_lcdc_obj_en_change_variant on CGB_D in GBHawk",
"m3_lcdc_obj_en_change_variant on CGB_D in SameBoy",
"m3_lcdc_obj_en_change_variant on CGB_D in SameBoy (no BIOS)",
"m3_lcdc_obj_en_change_variant on DMG in Gambatte",
"m3_lcdc_obj_en_change_variant on DMG in Gambatte (no BIOS)",
"m3_lcdc_obj_en_change_variant on DMG in GBHawk",
"m3_lcdc_obj_en_change_variant on DMG in SameBoy", // SameBoy emulates DMG-B, but there's no DMG-B-specific expect image for this test, so it should be the same on all DMG revisions?
"m3_lcdc_obj_en_change_variant on DMG in SameBoy (no BIOS)", // SameBoy emulates DMG-B, but there's no DMG-B-specific expect image for this test, so it should be the same on all DMG revisions?
"m3_lcdc_obj_size_change on CGB_C in GBHawk",
"m3_lcdc_obj_size_change on DMG in Gambatte",
"m3_lcdc_obj_size_change on DMG in Gambatte (no BIOS)",
"m3_lcdc_obj_size_change on DMG in GBHawk",
"m3_lcdc_obj_size_change_scx on CGB_C in GBHawk",
"m3_lcdc_obj_size_change_scx on CGB_C in SameBoy",
"m3_lcdc_obj_size_change_scx on CGB_C in SameBoy (no BIOS)",
"m3_lcdc_obj_size_change_scx on DMG in Gambatte",
"m3_lcdc_obj_size_change_scx on DMG in Gambatte (no BIOS)",
"m3_lcdc_obj_size_change_scx on DMG in GBHawk",
@ -75,35 +98,59 @@ namespace BizHawk.Tests.Testroms.GB
"m3_lcdc_tile_sel_win_change on CGB_C in Gambatte",
"m3_lcdc_tile_sel_win_change on CGB_C in Gambatte (no BIOS)",
"m3_lcdc_tile_sel_win_change on CGB_C in GBHawk",
"m3_lcdc_tile_sel_win_change on CGB_C in SameBoy",
"m3_lcdc_tile_sel_win_change on CGB_C in SameBoy (no BIOS)",
"m3_lcdc_tile_sel_win_change on DMG in GBHawk",
"m3_lcdc_tile_sel_win_change2 on CGB_C in Gambatte",
"m3_lcdc_tile_sel_win_change2 on CGB_C in Gambatte (no BIOS)",
"m3_lcdc_tile_sel_win_change2 on CGB_C in GBHawk",
"m3_lcdc_win_en_change_multiple on CGB_C in GBHawk",
"m3_lcdc_win_en_change_multiple on CGB_C in SameBoy",
"m3_lcdc_win_en_change_multiple on CGB_C in SameBoy (no BIOS)",
"m3_lcdc_win_en_change_multiple on DMG in GBHawk",
"m3_lcdc_win_en_change_multiple_wx on DMG in Gambatte",
"m3_lcdc_win_en_change_multiple_wx on DMG in Gambatte (no BIOS)",
"m3_lcdc_win_en_change_multiple_wx on DMG in GBHawk",
"m3_lcdc_win_en_change_multiple_wx on DMG in SameBoy",
"m3_lcdc_win_en_change_multiple_wx on DMG in SameBoy (no BIOS)",
"m3_lcdc_win_en_change_multiple_wx on DMG_B in Gambatte",
"m3_lcdc_win_en_change_multiple_wx on DMG_B in Gambatte (no BIOS)",
"m3_lcdc_win_en_change_multiple_wx on DMG_B in GBHawk",
"m3_lcdc_win_en_change_multiple_wx on DMG_B in SameBoy",
"m3_lcdc_win_en_change_multiple_wx on DMG_B in SameBoy (no BIOS)",
"m3_lcdc_win_map_change on CGB_C in GBHawk",
"m3_lcdc_win_map_change on DMG in GBHawk",
"m3_lcdc_win_map_change2 on CGB_C in GBHawk",
"m3_lcdc_win_map_change2 on CGB_C in SameBoy",
"m3_lcdc_win_map_change2 on CGB_C in SameBoy (no BIOS)",
"m3_obp0_change on CGB_C in Gambatte", // Gambatte's GBC emulation matches CGB D variant
"m3_obp0_change on CGB_C in Gambatte (no BIOS)", // Gambatte's GBC emulation matches CGB D variant
"m3_obp0_change on CGB_C in GBHawk",
"m3_obp0_change on CGB_D in GBHawk",
"m3_obp0_change on DMG in GBHawk",
"m3_scx_high_5_bits on CGB_C in GBHawk",
"m3_scx_high_5_bits on CGB_C in SameBoy",
"m3_scx_high_5_bits on CGB_C in SameBoy (no BIOS)",
"m3_scx_high_5_bits on DMG in GBHawk",
"m3_scx_high_5_bits on DMG in SameBoy", // SameBoy emulates DMG-B, but there's no DMG-B-specific expect image for this test, so it should be the same on all DMG revisions?
"m3_scx_high_5_bits on DMG in SameBoy (no BIOS)", // SameBoy emulates DMG-B, but there's no DMG-B-specific expect image for this test, so it should be the same on all DMG revisions?
"m3_scx_high_5_bits_change2 on CGB_C in GBHawk",
"m3_scx_high_5_bits_change2 on CGB_C in SameBoy",
"m3_scx_high_5_bits_change2 on CGB_C in SameBoy (no BIOS)",
"m3_scx_low_3_bits on CGB_C in SameBoy",
"m3_scx_low_3_bits on CGB_C in SameBoy (no BIOS)",
"m3_scy_change on CGB_C in GBHawk",
"m3_scy_change on CGB_C in SameBoy",
"m3_scy_change on CGB_C in SameBoy (no BIOS)",
"m3_scy_change on CGB_D in Gambatte", // Gambatte's GBC emulation matches CGB C variant
"m3_scy_change on CGB_D in Gambatte (no BIOS)", // Gambatte's GBC emulation matches CGB C variant
"m3_scy_change on CGB_D in GBHawk",
"m3_scy_change on CGB_D in SameBoy",
"m3_scy_change on CGB_D in SameBoy (no BIOS)",
"m3_scy_change on DMG in GBHawk",
"m3_scy_change2 on CGB_C in GBHawk",
"m3_scy_change2 on CGB_C in SameBoy",
"m3_scy_change2 on CGB_C in SameBoy (no BIOS)",
"m3_window_timing on CGB_C in Gambatte", // Gambatte's GBC emulation matches CGB D variant
"m3_window_timing on CGB_C in Gambatte (no BIOS)", // Gambatte's GBC emulation matches CGB D variant
"m3_window_timing on CGB_C in GBHawk",
@ -112,6 +159,8 @@ namespace BizHawk.Tests.Testroms.GB
"m3_window_timing_wx_0 on CGB_C in Gambatte",
"m3_window_timing_wx_0 on CGB_C in Gambatte (no BIOS)",
"m3_window_timing_wx_0 on CGB_C in GBHawk",
"m3_window_timing_wx_0 on CGB_C in SameBoy",
"m3_window_timing_wx_0 on CGB_C in SameBoy (no BIOS)",
"m3_window_timing_wx_0 on CGB_D in Gambatte",
"m3_window_timing_wx_0 on CGB_D in Gambatte (no BIOS)",
"m3_window_timing_wx_0 on CGB_D in GBHawk",
@ -124,6 +173,8 @@ namespace BizHawk.Tests.Testroms.GB
"m3_wx_4_change_sprites on CGB_C in Gambatte",
"m3_wx_4_change_sprites on CGB_C in Gambatte (no BIOS)",
"m3_wx_4_change_sprites on CGB_C in GBHawk",
"m3_wx_4_change_sprites on CGB_C in SameBoy", // don't think this is getting captured properly but it wouldn't pass anyway
"m3_wx_4_change_sprites on CGB_C in SameBoy (no BIOS)", // don't think this is getting captured properly but it wouldn't pass anyway
"m3_wx_4_change_sprites on DMG in Gambatte",
"m3_wx_4_change_sprites on DMG in Gambatte (no BIOS)",
"m3_wx_4_change_sprites on DMG in GBHawk",
@ -215,11 +266,14 @@ namespace BizHawk.Tests.Testroms.GB
{
// without this, exec hook triggers too early and I've decided I don't want to know why ¯\_(ツ)_/¯ --yoshi
fe.FrameAdvanceBy(5);
// if (testCase.Setup.CoreName is CoreNames.Sameboy) fe.FrameAdvance();
if (testCase.TestName is "m3_lcdc_win_map_change2") fe.FrameAdvance(); // just happens to be an outlier
}
Func<long> getPC = fe.Core switch
{
GBHawk gbHawk => () => gbHawk.cpu.RegPC,
Sameboy when testCase.Setup is { UseBIOS: false, Variant: ConsoleVariant.DMG or ConsoleVariant.DMG_B }
=> () => (long) fe.CoreAsDebuggable!.GetCpuFlagsAndRegisters()["PC"].Value - 1, // something something pre- vs. post-increment
_ => () => (long) fe.CoreAsDebuggable!.GetCpuFlagsAndRegisters()["PC"].Value
};
var domain = fe.CoreAsMemDomains!.SystemBus;
@ -235,6 +289,7 @@ namespace BizHawk.Tests.Testroms.GB
address: null, // all addresses
mask: null));
Assert.IsTrue(fe.FrameAdvanceUntil(() => finished), "timed out waiting for exec hook");
if (testCase.Setup.CoreName is CoreNames.Sameboy) fe.FrameAdvanceBy(7); // ¯\_(ツ)_/¯
}
var actualUnnormalised = DummyFrontend.RunAndScreenshot(
InitGBCore(testCase.Setup, $"{testCase.TestName}.gb", ReflectionCache.EmbeddedResourceStream(testCase.RomEmbedPath).ReadAllBytes()),

View File

@ -41,7 +41,10 @@ namespace BizHawk.Tests.Testroms.GB
private static readonly IReadOnlyCollection<string> KnownFailures = new[]
{
"",
"RTC3Test.basic on CGB_C in SameBoy",
"RTC3Test.basic on CGB_C in SameBoy (no BIOS)",
"RTC3Test.basic on DMG in SameBoy",
"RTC3Test.basic on DMG in SameBoy (no BIOS)",
};
private static readonly bool RomIsPresent = ReflectionCache.EmbeddedResourceList().Contains(ROM_EMBED_PATH);

View File

@ -72,4 +72,4 @@ $Env:BIZHAWKTEST_SAVE_IMAGES = "all"
dotnet test -c Release -l "console;verbosity=detailed"
```
Summary of `BIZHAWKTEST_RUN_KNOWN_FAILURES=1 ./run_tests_release.sh` should read 86 passed / 118 skipped / 0 failed.
Summary of `BIZHAWKTEST_RUN_KNOWN_FAILURES=1 ./run_tests_release.sh` should read 166 passed / 174 skipped / 0 failed.