Files
ComSquare/tests/testMemoryBus.cpp
2021-07-06 18:23:22 +02:00

421 lines
8.5 KiB
C++

//
// Created by Melefo on 05/02/2020.
//
#include <catch2/catch.hpp>
#include <iostream>
#include "tests.hpp"
#include "Memory/MemoryShadow.hpp"
#include "Memory/RectangleShadow.hpp"
#include "Exceptions/InvalidAction.hpp"
using namespace ComSquare;
//////////////////////////////////
// //
// MemoryBus::getAccessor tests //
// //
//////////////////////////////////
TEST_CASE("GetWramStart BusAccessor", "[BusAccessor]")
{
Init()
Memory::IMemory *accessor = snes.bus.getAccessor(0x7E0000);
REQUIRE(accessor == &snes.wram);
}
TEST_CASE("GetWramEnd BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = snes.bus.getAccessor(0x7FFFFF);
REQUIRE(accessor == &snes.wram);
}
TEST_CASE("GetWramMirror BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = dynamic_cast<Memory::RectangleShadow *>(snes.bus.getAccessor(0x2F11FF));
REQUIRE(accessor != nullptr);
REQUIRE(&accessor->_initial == &snes.wram);
}
TEST_CASE("GetWramMirror2 BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = dynamic_cast<Memory::RectangleShadow *>(snes.bus.getAccessor(0x100000));
REQUIRE(accessor != nullptr);
REQUIRE(&accessor->_initial == &snes.wram);
}
TEST_CASE("GetWramMirror3 BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = dynamic_cast<Memory::RectangleShadow *>(snes.bus.getAccessor(0x1010));
REQUIRE(accessor != nullptr);
REQUIRE(&accessor->_initial == &snes.wram);
}
TEST_CASE("GetOpenBus BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = snes.bus.getAccessor(0x897654);
REQUIRE(accessor == nullptr);
}
TEST_CASE("GetSramStart BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = dynamic_cast<Memory::RectangleShadow *>(snes.bus.getAccessor(0x700000));
REQUIRE(accessor);
REQUIRE(&accessor->_initial == &snes.sram);
}
TEST_CASE("GetSramEnd BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = dynamic_cast<Memory::RectangleShadow *>(snes.bus.getAccessor(0x7D7FFF));
REQUIRE(accessor);
REQUIRE(&accessor->_initial == &snes.sram);
}
TEST_CASE("GetSramMirror BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = snes.bus.getAccessor(0xF00123);
REQUIRE(accessor == &snes.sram);
}
TEST_CASE("GetAPUStart BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = snes.bus.getAccessor(0x002140);
REQUIRE(accessor == &snes.apu);
}
TEST_CASE("GetAPUEnd BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = snes.bus.getAccessor(0x002143);
REQUIRE(accessor == &snes.apu);
}
TEST_CASE("GetAPUMirror BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = dynamic_cast<Memory::MemoryShadow *>(snes.bus.getAccessor(0xAB2143));
REQUIRE(accessor);
REQUIRE(&accessor->_initial == &snes.apu);
}
TEST_CASE("GetAPUMirrorFirstHalf BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = dynamic_cast<Memory::MemoryShadow *>(snes.bus.getAccessor(0x052143));
REQUIRE(accessor);
REQUIRE(&accessor->_initial == &snes.apu);
}
TEST_CASE("GetCPUStart BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = snes.bus.getAccessor(0x004200);
REQUIRE(accessor == &snes.cpu);
}
TEST_CASE("GetCPUEnd BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = snes.bus.getAccessor(0x00421F);
REQUIRE(accessor == &snes.cpu);
}
TEST_CASE("GetPPU1Start BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = snes.bus.getAccessor(0x00213E);
REQUIRE(accessor == &snes.ppu);
}
TEST_CASE("GetPPU1End BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = snes.bus.getAccessor(0x00213F);
REQUIRE(accessor == &snes.ppu);
}
TEST_CASE("GetCPU BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = snes.bus.getAccessor(0x004212);
REQUIRE(accessor == &snes.cpu);
}
TEST_CASE("GetPPU1Mirror BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = dynamic_cast<Memory::MemoryShadow *>(snes.bus.getAccessor(0x80213F));
REQUIRE(accessor);
REQUIRE(&accessor->_initial == &snes.ppu);
}
TEST_CASE("GetCPU2Mirror BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = dynamic_cast<Memory::MemoryShadow *>(snes.bus.getAccessor(0x804212));
REQUIRE(accessor);
REQUIRE(&accessor->_initial == &snes.cpu);
}
TEST_CASE("GetRomStart BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = snes.bus.getAccessor(0x808000);
REQUIRE(accessor == &snes.cartridge);
}
TEST_CASE("GetRomEnd BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = snes.bus.getAccessor(0xFFFFFF);
REQUIRE(accessor == &snes.cartridge);
}
TEST_CASE("GetRomMirror BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = dynamic_cast<Memory::RectangleShadow *>(snes.bus.getAccessor(0x694200));
REQUIRE(accessor);
REQUIRE(&accessor->_initial == &snes.cartridge);
}
TEST_CASE("GetRomMirror2 BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = dynamic_cast<Memory::RectangleShadow *>(snes.bus.getAccessor(0x01FEDC));
REQUIRE(accessor);
REQUIRE(&accessor->_initial == &snes.cartridge);
}
TEST_CASE("GetRomMirror3 BusAccessor", "[BusAccessor]")
{
Init()
snes.cartridge.header.mappingMode = Cartridge::LoRom;
auto *rawAccessor = snes.bus.getAccessor(0xDE1248);
REQUIRE(rawAccessor);
auto *accessor = dynamic_cast<Memory::RectangleShadow *>(rawAccessor);
REQUIRE(accessor);
REQUIRE(&accessor->_initial == &snes.cartridge);
}
TEST_CASE("Get0x0 BusAccessor", "[BusAccessor]")
{
Init()
auto *accessor = dynamic_cast<Memory::RectangleShadow *>(snes.bus.getAccessor(0x0));
REQUIRE(accessor);
REQUIRE(&accessor->_initial == &snes.wram);
}
///////////////////////////
// //
// MemoryBus::read tests //
// //
///////////////////////////
TEST_CASE("Read0x0 BusRead", "[BusRead]")
{
Init()
uint8_t data;
snes.wram._data[0] = 123;
data = snes.bus.read(0x0);
REQUIRE(data == 123);
}
TEST_CASE("Read ReadOutside", "[ReadOutside]")
{
Init()
uint8_t data;
snes.bus._openBus = 123;
data = snes.bus.read(0x002000);
REQUIRE(data == 123);
}
TEST_CASE("ReadOutside2 Read][Bus", "[Read][Bus]")
{
Init()
uint8_t data;
snes.bus._openBus = 123;
data = snes.bus.read(0xBF2FFF);
REQUIRE(data == 123);
}
TEST_CASE("ReadOutside3 Read][Bus", "[Read][Bus]")
{
Init()
uint8_t data;
snes.bus._openBus = 123;
data = snes.bus.read(0x127654);
REQUIRE(data == 123);
}
TEST_CASE("ReadAPU BusRead", "[BusRead]")
{
Init()
uint8_t data;
snes.apu._registers.port0 = 123;
data = snes.bus.read(0x002140);
REQUIRE(data == 123);
}
TEST_CASE("ReadROM BusRead", "[BusRead]")
{
Init()
uint8_t data;
snes.cartridge._data[5] = 123;
data = snes.bus.read(0x808005);
REQUIRE(data == 123);
}
TEST_CASE("ReadROMStart BusRead", "[BusRead]")
{
Init()
uint8_t data;
snes.cartridge._data[0] = 123;
data = snes.bus.read(0x808000);
REQUIRE(data == 123);
}
TEST_CASE("ReadCPU BusRead", "[BusRead]")
{
Init()
uint8_t data;
snes.cpu._internalRegisters.wrio = 123;
data = snes.bus.read(0x004201);
REQUIRE(data == 123);
}
TEST_CASE("ReadPPU BusRead", "[BusRead]")
{
Init()
uint8_t data;
snes.ppu._registers._mpy.mpyl = 123;
data = snes.bus.read(0x002134);
REQUIRE(data == 123);
}
TEST_CASE("ReadSRAM BusRead", "[BusRead]")
{
Init()
uint8_t data;
snes.sram._data[7] = 123;
data = snes.bus.read(0x700007);
REQUIRE(data == 123);
}
TEST_CASE("ReadWRAM BusRead", "[BusRead]")
{
Init()
uint8_t data;
snes.wram._data[3] = 123;
data = snes.bus.read(0x7E0003);
REQUIRE(data == 123);
}
TEST_CASE("ReadWRAM2 BusRead", "[BusRead]")
{
Init()
uint8_t data;
snes.wram._data[0x1010] = 123;
data = snes.bus.read(0x7E1010);
REQUIRE(data == 123);
}
TEST_CASE("ReadWRAMMirror BusRead", "[BusRead]")
{
Init()
uint8_t data;
snes.wram._data[0x1010] = 123;
data = snes.bus.read(0x1010);
REQUIRE(data == 123);
}
////////////////////////////
// //
// MemoryBus::write tests //
// //
////////////////////////////
TEST_CASE("Write0x0 BusWrite", "[BusWrite]")
{
Init()
try {
snes.bus.write(0x0, 123);
} catch (std::exception &ex) {
std::cout << ex.what() << std::endl;
}
REQUIRE(snes.wram._data[0] == 123);
}
TEST_CASE("WriteAPU BusWrite", "[BusWrite]")
{
Init()
snes.bus.write(0x002143, 123);
REQUIRE(snes.apu._registers.port3 == 123);
}
TEST_CASE("WritePPU BusWrite", "[BusWrite]")
{
Init()
snes.bus.write(0x002106, 123);
REQUIRE(snes.ppu._registers._mosaic.raw == 123);
}
TEST_CASE("WriteCPU BusWrite", "[BusWrite]")
{
Init()
snes.bus.write(0x00420D, 123);
REQUIRE(snes.cpu._internalRegisters.memsel == 123);
}
TEST_CASE("WriteROM BusWrite", "[BusWrite]")
{
Init()
REQUIRE_THROWS_AS(snes.bus.write(0x808005, 123), InvalidAction);
}
TEST_CASE("WriteWRAM BusWrite", "[BusWrite]")
{
Init()
snes.bus.write(0x7E0002, 123);
REQUIRE(snes.wram._data[2] == 123);
}
TEST_CASE("WriteSRAM BusWrite", "[BusWrite]")
{
Init()
snes.bus.write(0x700009, 123);
REQUIRE(snes.sram._data[9] == 123);
}