Files

102 lines
3.0 KiB
C#

using Chip8.Core;
using Xunit;
namespace Chip8.Tests;
public class WatchpointTests
{
[Fact]
public void memoryWatchStopsWhenTheByteChanges()
{
var machine = TestHarness.withProgram(Platform.Chip8, 0xA400, 0x6005, 0xF055, 0x1206);
var debugger = new Debugger(machine);
debugger.watchMemory(0x400);
RunResult outcome = debugger.run(100);
Assert.Equal(StopReason.Watchpoint, outcome.reason);
Assert.Equal(3, outcome.steps);
Assert.Equal(0x400, outcome.triggeredAddress);
Assert.Equal(5, machine.memory[0x400]);
Assert.Contains("memory 0x0400", debugger.lastWatchDescription);
}
[Fact]
public void registerWatchStopsWhenTheRegisterChanges()
{
var machine = TestHarness.withProgram(Platform.Chip8, 0x6005, 0x1202);
var debugger = new Debugger(machine);
debugger.watchRegister(0);
RunResult outcome = debugger.run(50);
Assert.Equal(StopReason.Watchpoint, outcome.reason);
Assert.Equal(1, outcome.steps);
Assert.Contains("V0", debugger.lastWatchDescription);
}
[Fact]
public void unwatchedMemoryDoesNotStop()
{
var machine = TestHarness.withProgram(Platform.Chip8, 0xA400, 0x6005, 0xF055, 0x1206);
var debugger = new Debugger(machine);
debugger.watchMemory(0x400);
debugger.clearWatches();
RunResult outcome = debugger.run(20);
Assert.Equal(StopReason.StepLimit, outcome.reason);
}
[Fact]
public void stepOverRunsThroughACall()
{
var machine = TestHarness.withProgram(Platform.Chip8, 0x2204, 0x6042, 0x0000, 0x00EE);
var debugger = new Debugger(machine);
RunResult outcome = debugger.stepOver(100);
Assert.Equal(0x202, machine.pc);
Assert.Equal(0, machine.v[0]);
Assert.Equal(3, outcome.steps);
}
[Fact]
public void stepOverIsASingleStepForNonCalls()
{
var machine = TestHarness.withProgram(Platform.Chip8, 0x6005, 0x1202);
var debugger = new Debugger(machine);
debugger.stepOver(100);
Assert.Equal(0x202, machine.pc);
Assert.Equal(5, machine.v[0]);
}
[Fact]
public void runUntilStopsAtTheTargetAddress()
{
var machine = TestHarness.withProgram(Platform.Chip8, 0x7001, 0x1200);
var debugger = new Debugger(machine);
RunResult outcome = debugger.runUntil(0x202, 100);
Assert.Equal(0x202, machine.pc);
Assert.Equal(StopReason.Breakpoint, outcome.reason);
}
[Fact]
public void disassembleWindowDecodesFromProgramCounter()
{
var machine = TestHarness.withProgram(Platform.Chip8, 0xA300, 0x6001, 0x00EE);
var debugger = new Debugger(machine);
var lines = debugger.disassembleWindow(3);
Assert.Equal(3, lines.Count);
Assert.Equal(0x200, lines[0].address);
Assert.Equal("LD I, 0x300", lines[0].mnemonic);
Assert.Equal("RET", lines[2].mnemonic);
}
}