diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 52182cd..ab150c4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,18 +21,6 @@ jobs: uses: actions/setup-python@v1 with: python-version: '3.x' - - name: Install the SFML. - run: sudo apt-get update && - sudo apt-get install --yes libsfml-dev qt5-default - - name: Install Criterion - run: git clone --recursive https://github.com/Snaipe/Criterion && - cd Criterion && - sudo apt install --yes ninja-build && - pip3 install meson && - meson build && - ninja -C build && - sudo ninja -C build install && - sudo cp -r /usr/local/lib/x86_64-linux-gnu/libcriterion* /usr/lib - name: Install Gcovr run: python -m pip install --upgrade pip gcovr - name: Update G++ diff --git a/CMakeLists.txt b/CMakeLists.txt index b32d227..db0a08a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,7 +95,7 @@ set(SOURCES sources/PPU/TileRenderer.hpp sources/PPU/Tile.hpp sources/CPU/Registers.hpp - sources/Memory/IMemoryBus.hpp sources/Models/Callback.hpp) + sources/Memory/IMemoryBus.hpp sources/Models/Callback.hpp sources/Models/Logger.hpp) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) @@ -184,6 +184,9 @@ add_executable(unit_tests EXCLUDE_FROM_ALL tests/CPU/testAddressingMode.cpp tests/testMemoryBus.cpp ) +target_include_directories(unit_tests PUBLIC tests) +target_compile_definitions(unit_tests PUBLIC TESTS) + if (CMAKE_COMPILER_IS_GNUCXX) # target_link_libraries(unit_tests PRIVATE -lgcov) @@ -192,7 +195,7 @@ endif () find_package(Catch2 QUIET) if (NOT Catch2_FOUND) - set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake-dependencies) + set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/libs) find_package(Catch2 REQUIRED) endif () target_link_libraries(unit_tests PRIVATE Catch2::Catch2) diff --git a/cmake-dependencies/FindCatch2.cmake b/libs/FindCatch2.cmake similarity index 100% rename from cmake-dependencies/FindCatch2.cmake rename to libs/FindCatch2.cmake diff --git a/sources/Memory/MemoryBus.cpp b/sources/Memory/MemoryBus.cpp index 8caeabb..8e026d9 100644 --- a/sources/Memory/MemoryBus.cpp +++ b/sources/Memory/MemoryBus.cpp @@ -7,6 +7,7 @@ #include "Memory/MemoryBus.hpp" #include "Memory/MemoryShadow.hpp" #include "Exceptions/InvalidAddress.hpp" +#include "Models/Logger.hpp" namespace ComSquare::Memory { @@ -26,7 +27,7 @@ namespace ComSquare::Memory IMemory *handler = this->getAccessor(addr); if (!handler) { - std::cout << "Unknown memory accessor for address $" << std::hex << addr << ". Using open bus." << std::endl; + log(LogLevel::WARNING, "Unknown memory accessor for address $" << std::hex << addr << ". Using open bus."); return this->_openBus; } @@ -61,7 +62,7 @@ namespace ComSquare::Memory IMemory *handler = this->getAccessor(addr); if (!handler) { - std::cout << "Unknown memory accessor for address " << std::hex << addr << ". Warning, it was a write." << std::endl; + log(LogLevel::ERROR, "Unknown memory accessor for address " << std::hex << addr << ". Warning, it was a write."); return; } handler->write(handler->getRelativeAddress(addr), data); diff --git a/sources/Models/Logger.hpp b/sources/Models/Logger.hpp new file mode 100644 index 0000000..eda0069 --- /dev/null +++ b/sources/Models/Logger.hpp @@ -0,0 +1,32 @@ +// +// Created by Zoe Roux on 2021-07-06. +// + + +#pragma once + +#include + +#ifdef TESTS +#include +#endif + +namespace ComSquare +{ + enum LogLevel + { + INFO, + WARNING, + ERROR + }; + + constexpr LogLevel GlobalLevel = INFO; + +#ifndef TESTS +#define log(level, message) \ + if constexpr((level) >= GlobalLevel) \ + std::cout << message << std::endl // NOLINT(bugprone-macro-parentheses) +#else +#define log(_, msg) INFO(msg) +#endif +} \ No newline at end of file diff --git a/sources/Renderer/QtRenderer/QtSFML.cpp b/sources/Renderer/QtRenderer/QtSFML.cpp index 89e6fcd..5b6ed62 100644 --- a/sources/Renderer/QtRenderer/QtSFML.cpp +++ b/sources/Renderer/QtRenderer/QtSFML.cpp @@ -7,12 +7,13 @@ #include #include #include +#include "Models/Logger.hpp" #include "SNES.hpp" #include "QtSFML.hpp" #ifdef Q_WS_X11 - #include - #include +#include +#include #endif namespace ComSquare::Renderer @@ -57,7 +58,7 @@ namespace ComSquare::Renderer } #ifdef DEBUGGER_ENABLED catch (const DebuggableError &e) { - std::cout << "Invalid rom's instruction: " << e.what() << std::endl; + log(LogLevel::ERROR, "Invalid rom's instruction: " << e.what()); this->_snes.enableCPUDebuggingWithError(e); } #endif diff --git a/tests/APU/testAPU.cpp b/tests/APU/testAPU.cpp index f8c718a..d954c36 100644 --- a/tests/APU/testAPU.cpp +++ b/tests/APU/testAPU.cpp @@ -3,11 +3,10 @@ // #include -#include "../tests.hpp" +#include "tests.hpp" #include "SNES.hpp" #include "APU/APU.hpp" #include "Exceptions/InvalidAddress.hpp" -#include "Exceptions/InvalidOpcode.hpp" using namespace ComSquare; @@ -29,9 +28,9 @@ TEST_CASE("register internalRead", "[internalRead]") TEST_CASE("Page0 read Read", "[Read]") { Init() - uint8_t result = 0; + uint8_t result; - snes.apu._map->Page0._data[0x0010] = 123; + snes.apu._map.Page0._data[0x0010] = 123; result = snes.apu._internalRead(0x0010); REQUIRE(result == 123); } @@ -41,7 +40,7 @@ TEST_CASE("Page1 read Read", "[Read]") Init() uint8_t result = 0; - snes.apu._map->Page1._data[0x0042] = 123; + snes.apu._map.Page1._data[0x0042] = 123; result = snes.apu._internalRead(0x0142); REQUIRE(result == 123); } @@ -51,7 +50,7 @@ TEST_CASE("Memory internalRead", "[internalRead]") Init() uint8_t result = 0; - snes.apu._map->Memory._data[0xFCDC] = 123; + snes.apu._map.Memory._data[0xFCDC] = 123; result = snes.apu._internalRead(0xFEDC); REQUIRE(result == 123); } @@ -61,7 +60,7 @@ TEST_CASE("IPL internalRead", "[internalRead]") Init() uint8_t result = 0; - snes.apu._map->IPL._data[0x001F] = 123; + snes.apu._map.IPL._data[0x001F] = 123; result = snes.apu._internalRead(0xFFDF); REQUIRE(result == 123); } @@ -69,7 +68,7 @@ TEST_CASE("IPL internalRead", "[internalRead]") TEST_CASE("Invalid internalRead", "[internalRead]") { Init() - auto apu = snes.apu; + REQUIRE_THROWS_AS(snes.apu._internalRead(0x10000), InvalidAddress); } @@ -83,16 +82,16 @@ TEST_CASE("Invalid internalRead", "[internalRead]") TEST_CASE("Page0 write Write", "[Write]") { Init() - auto apu = snes.apu; + snes.apu._internalWrite(0x0001, 123); - REQUIRE(snes.apu._map->Page0._data[0x0001] == 123); + REQUIRE(snes.apu._map.Page0._data[0x0001] == 123); } TEST_CASE("register write Write", "[Write]") { Init() - auto apu = snes.apu; + snes.apu._internalWrite(0x00F4, 123); REQUIRE(snes.apu._registers.port0 == 123); @@ -101,34 +100,34 @@ TEST_CASE("register write Write", "[Write]") TEST_CASE("Page1 internalWrite", "[internalWrite]") { Init() - auto apu = snes.apu; + snes.apu._internalWrite(0x01FF, 123); - REQUIRE(snes.apu._map->Page1._data[0x00FF] == 123); + REQUIRE(snes.apu._map.Page1._data[0x00FF] == 123); } TEST_CASE("Memory write internalWrite", "[internalWrite]") { Init() - auto apu = snes.apu; + snes.apu._internalWrite(0x0789, 123); - REQUIRE(snes.apu._map->Memory._data[0x0589] == 123); + REQUIRE(snes.apu._map.Memory._data[0x0589] == 123); } TEST_CASE("IPL internalWrite", "[internalWrite]") { Init() - auto apu = snes.apu; + snes.apu._internalWrite(0xFFF0, 123); - REQUIRE(snes.apu._map->IPL._data[0x0030] == 123); + REQUIRE(snes.apu._map.IPL._data[0x0030] == 123); } TEST_CASE("Invalid internalWrite", "[internalWrite]") { Init() - auto apu = snes.apu; + REQUIRE_THROWS_AS(snes.apu._internalWrite(0x10000, 123), InvalidAddress); } @@ -152,7 +151,7 @@ TEST_CASE("Valid read", "[read]") TEST_CASE("Invalid read", "[read]") { Init() - auto apu = snes.apu; + REQUIRE_THROWS_AS(snes.apu.read(0x10000), InvalidAddress); } @@ -166,7 +165,7 @@ TEST_CASE("Invalid read", "[read]") TEST_CASE("Valid write", "[write]") { Init() - auto apu = snes.apu; + snes.apu.write(0x03, 123); REQUIRE(snes.apu._registers.port3 == 123); @@ -175,7 +174,7 @@ TEST_CASE("Valid write", "[write]") TEST_CASE("Invalid write", "[write]") { Init() - auto apu = snes.apu; + REQUIRE_THROWS_AS(snes.apu.write(0x04, 123), InvalidAddress); } @@ -205,7 +204,7 @@ TEST_CASE("Valid executeInstruction", "[executeInstruction]") TEST_CASE("running update", "[update]") { Init() - auto apu = snes.apu; + snes.apu._internalRegisters.pc = 0x00; snes.apu.update(1); @@ -215,7 +214,7 @@ TEST_CASE("running update", "[update]") TEST_CASE("stopped update", "[update]") { Init() - auto apu = snes.apu; + snes.apu._state = APU::Stopped; snes.apu.update(1); @@ -231,7 +230,7 @@ TEST_CASE("stopped update", "[update]") TEST_CASE("direct get", "[get]") { Init() - auto apu = snes.apu; + snes.apu._internalRegisters.pc = 0x32; snes.apu._internalWrite(0x32, 123); @@ -241,7 +240,7 @@ TEST_CASE("direct get", "[get]") TEST_CASE("absolute get", "[get]") { Init() - auto apu = snes.apu; + snes.apu._internalRegisters.pc = 0x32; snes.apu._internalWrite(0x32, 0b00001111); diff --git a/tests/APU/testOperand.cpp b/tests/APU/testOperand.cpp index 908d1a2..91c4940 100644 --- a/tests/APU/testOperand.cpp +++ b/tests/APU/testOperand.cpp @@ -3,18 +3,16 @@ // #include -#include "../tests.hpp" -#include "../../sources/SNES.hpp" -#include "../../sources/APU/APU.hpp" -#include "../../sources/Exceptions/InvalidAddress.hpp" -#include "../../sources/Exceptions/InvalidOpcode.hpp" +#include "tests.hpp" +#include "SNES.hpp" +#include "APU/APU.hpp" +#include "Exceptions/InvalidAddress.hpp" using namespace ComSquare; TEST_CASE("immediate apu_get", "[apu_get]") { Init() - auto apu = snes.apu; snes.apu._internalRegisters.pc = 0x32; snes.apu._internalWrite(0x32, 0x40); @@ -24,7 +22,6 @@ TEST_CASE("immediate apu_get", "[apu_get]") TEST_CASE("direct apu_get", "[apu_get]") { Init() - auto apu = snes.apu; snes.apu._internalRegisters.pc = 0x32; snes.apu._internalRegisters.p = true; @@ -35,7 +32,6 @@ TEST_CASE("direct apu_get", "[apu_get]") TEST_CASE("X apu_get", "[apu_get]") { Init() - auto apu = snes.apu; snes.apu._internalRegisters.x = 0x32; snes.apu._internalRegisters.p = true; @@ -45,7 +41,6 @@ TEST_CASE("X apu_get", "[apu_get]") TEST_CASE("Y apu_get", "[apu_get]") { Init() - auto apu = snes.apu; snes.apu._internalRegisters.y = 0x32; snes.apu._internalRegisters.p = true; @@ -55,7 +50,6 @@ TEST_CASE("Y apu_get", "[apu_get]") TEST_CASE("directbyX apu_get", "[apu_get]") { Init() - auto apu = snes.apu; snes.apu._internalRegisters.pc = 0x32; snes.apu._internalRegisters.x = 0x03; @@ -66,7 +60,6 @@ TEST_CASE("directbyX apu_get", "[apu_get]") TEST_CASE("directbyY apu_get", "[apu_get]") { Init() - auto apu = snes.apu; snes.apu._internalRegisters.pc = 0x32; snes.apu._internalRegisters.y = 0x05; @@ -77,7 +70,6 @@ TEST_CASE("directbyY apu_get", "[apu_get]") TEST_CASE("absolute apu_get", "[apu_get]") { Init() - auto apu = snes.apu; snes.apu._internalRegisters.pc = 0x32; snes.apu._internalWrite(0x32, 0b00001111); @@ -88,7 +80,6 @@ TEST_CASE("absolute apu_get", "[apu_get]") TEST_CASE("absolutebyx apu_get", "[apu_get]") { Init() - auto apu = snes.apu; snes.apu._internalRegisters.pc = 0x32; snes.apu._internalRegisters.x = 10; @@ -101,7 +92,6 @@ TEST_CASE("absolutebyx apu_get", "[apu_get]") TEST_CASE("absoluteaddrbyx apu_get", "[apu_get]") { Init() - auto apu = snes.apu; snes.apu._internalRegisters.pc = 0x32; snes.apu._internalRegisters.x = 10; @@ -113,7 +103,6 @@ TEST_CASE("absoluteaddrbyx apu_get", "[apu_get]") TEST_CASE("absoluteaddrbyy apu_get", "[apu_get]") { Init() - auto apu = snes.apu; snes.apu._internalRegisters.pc = 0x32; snes.apu._internalRegisters.y = 10; @@ -138,7 +127,6 @@ TEST_CASE("absolutebit apu_get", "[apu_get]") TEST_CASE("absolutebyxdirect apu_get", "[apu_get]") { Init() - auto apu = snes.apu; snes.apu._internalRegisters.pc = 0x32; snes.apu._internalRegisters.p = true; @@ -152,7 +140,6 @@ TEST_CASE("absolutebyxdirect apu_get", "[apu_get]") TEST_CASE("absolutedirectbyy apu_get", "[apu_get]") { Init() - auto apu = snes.apu; snes.apu._internalRegisters.pc = 0x32; snes.apu._internalRegisters.p = true; diff --git a/tests/tests.hpp b/tests/tests.hpp index 5d3a913..3574ac9 100644 --- a/tests/tests.hpp +++ b/tests/tests.hpp @@ -13,7 +13,6 @@ #define protected public #define class struct -#include "Memory/MemoryBus.hpp" #include "Renderer/NoRenderer.hpp" #include "SNES.hpp"