public void RunTest() { output.Append(@"{\rtf1\ansi {\colortbl ;\red255\green255\blue255;\red0\green200\blue0;\red200\green0\blue0;}"); output.Append(@"\cf1Running " + testSuite.name + @":\par"); foreach (Test test in testSuite.tests) { output.Append(@"\cf1" + test.name + ": "); testCore = new NESCore(SystemType.NTSC, Path.Combine(testSuite.basepath, test.file), "", 44100); testCore.SetControllers(ControllerType.Controller, ControllerType.Controller, ControllerType.Empty, false, false); int frame = 0; if (test.type == TestType.movie) { StreamReader fm2 = File.OpenText(Path.Combine(testSuite.basepath, test.movie)); Controller player1 = new Controller(); Controller player2 = new Controller(); bool movieEnd = Fm2Reader(fm2, ref player1, ref player2); while (!close && !movieEnd) { testCore.Start(player1, player2, false); testCore.APU.ResetBuffer(); movieEnd = Fm2Reader(fm2, ref player1, ref player2); } } else if (test.type == TestType.noinput) { while (frame++ != test.frame && !close) { testCore.Start(new Controller(), new Controller(), false); testCore.APU.ResetBuffer(); } } foreach (ComparisonGroup compares in test.comparisonGroups) { bool pass = true; uint result = 0; //output.Append(compares.name + ": "); foreach (Comparison compare in compares.comparisons) { if (compare.type == CompareType.memory) { switch (compare.op) { default: case ComparisonOperator.equal: if (testCore.Memory[compare.address] != compare.value) { pass = false; } result = testCore.Memory[compare.address]; break; case ComparisonOperator.notequal: if (testCore.Memory[compare.address] == compare.value) { pass = false; } result = testCore.Memory[compare.address]; break; case ComparisonOperator.lessthan: if (testCore.Memory[compare.address] >= compare.value) { pass = false; } result = testCore.Memory[compare.address]; break; case ComparisonOperator.greaterthan: if (testCore.Memory[compare.address] <= compare.value) { pass = false; } result = testCore.Memory[compare.address]; break; } } else if (compare.type == CompareType.screenshot) { uint CRC = GetScreenCRC(testCore.PPU.screen); switch (compare.op) { default: case ComparisonOperator.equal: if (compare.crc != CRC) { pass = false; } result = CRC; break; case ComparisonOperator.notequal: if (compare.crc == CRC) { pass = false; } result = CRC; break; case ComparisonOperator.lessthan: if (compare.crc >= CRC) { pass = false; } result = CRC; break; case ComparisonOperator.greaterthan: if (compare.crc <= CRC) { pass = false; } result = CRC; break; } } } if (pass) { output.Append(@"\cf2" + compares.pass + @"\par"); } else { output.Append(@"\cf3" + compares.fail + @"\par"); } } } output.Append(@"\cf1Tests Complete\par"); running = false; finalDraw = true; }