102 lines
3.0 KiB
C#
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);
|
|
}
|
|
}
|