Now off catch2 and on my own testing fuc2.

This commit is contained in:
Zed A. Shaw 2026-06-16 01:34:03 -04:00
parent 4f3fa59793
commit 1d11c8b162
10 changed files with 177 additions and 98 deletions

View file

@ -26,7 +26,7 @@ tracy_build:
meson compile -j 10 -C builddir
test: build
./builddir/runtests
./builddir/fuc2it
run: build test
ifeq '$(OS)' 'Windows_NT'
@ -49,7 +49,7 @@ clean:
meson compile --clean -C builddir
debug_test: build
gdb --nx -x .gdbinit --ex run --args builddir/runtests -e
gdb --nx -x .gdbinit --ex run --args builddir/fuc2it -e
win_installer:
powershell 'start "C:\Program Files (x86)\solicus\InstallForge\bin\ifbuilderenvx86.exe" scripts\win_installer.ifp'

View file

@ -3,7 +3,7 @@
# HEY BUG: when you have a . spec in a LEL it doesn't work on text
project('lel-guecs', 'cpp',
version: '0.7.3',
version: '0.7.4',
default_options: [
'cpp_std=c++23',
'cpp_args=-D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1',
@ -51,7 +51,7 @@ elif build_machine.system() == 'darwin'
]
endif
catch2 = subproject('catch2').get_variable('catch2_with_main_dep')
fuc2 = subproject('fuc2').get_variable('fuc2_dep')
fmt = subproject('fmt').get_variable('fmt_dep')
json = subproject('nlohmann_json').get_variable('nlohmann_json_dep')
freetype2 = subproject('freetype2').get_variable('freetype_dep')
@ -117,19 +117,20 @@ lel_guecs_sfml_dep = declare_dependency(
link_with: lel_guecs_sfml_lib,
include_directories: lel_guecs_inc)
executable('runtests', [
executable('fuc2it', [
'tests/guecs.cpp',
'tests/lel.cpp',
'tests/main.cpp',
'tests/shaders.cpp',
'tests/sound.cpp',
'tests/textures.cpp',
'tests/guecs.cpp',
],
cpp_args: cpp_args,
link_args: link_args,
override_options: exe_defaults,
include_directories: lel_guecs_inc,
link_with: [lel_guecs_lib, lel_guecs_sfml_lib],
dependencies: dependencies + [catch2])
dependencies: dependencies + [fuc2])
executable('clicker_game', [
'demos/clicker_game.cpp',

View file

@ -1,10 +1,20 @@
#include <catch2/catch_test_macros.hpp>
#include <fmt/core.h>
#include "guecs/ui.hpp"
#include <fmt/xchar.h>
#include <fuc2/testing.hpp>
using namespace guecs;
using namespace fuc2;
TEST_CASE("prototype one gui", "[ecs-gui]") {
// accidentally gutted, will recover later
namespace guecs_tests {
void test_prototype() {
// accidentally gutted, will recover later
}
fuc2::Set TESTS{
.name="GUECS tests (empty!)",
.tests={
{"test_prototype", test_prototype},
}
};
}

View file

@ -1,61 +1,72 @@
#include "guecs/lel.hpp"
#include <catch2/catch_test_macros.hpp>
#include <fmt/core.h>
#include <string>
#include <fuc2/testing.hpp>
TEST_CASE("test basic ops", "[lel]") {
lel::Parser parser(0, 0, 500, 500);
using namespace fuc2;
bool good = parser.parse(
"[ label_1 | label3 | test1]"
"[ *(300,300)text1 | %(150)people | ^test2]"
"[ >label2 | _ | .test3]"
"[ =message | buttons | test4]");
namespace lel_tests {
void test_basic_ops() {
lel::Parser parser(0, 0, 500, 500);
REQUIRE(good);
bool good = parser.parse(
"[ label_1 | label3 | test1]"
"[ *(300,300)text1 | %(150)people | ^test2]"
"[ >label2 | _ | .test3]"
"[ =message | buttons | test4]");
for(size_t rowcount = 0; rowcount < parser.grid.size(); rowcount++) {
auto& row = parser.grid[rowcount];
CHECK(good);
for(size_t colcount = 0; colcount < row.size(); colcount++) {
auto &name = row[colcount];
if(name == "_") {
REQUIRE(!parser.cells.contains(name));
} else if(name == "_MAIN") {
// it's the main cell which covers the whole area
auto &cell = parser.cells.at(name);
REQUIRE(cell.row == 0);
REQUIRE(cell.col == 0);
REQUIRE(cell.x == parser.grid_x);
REQUIRE(cell.y == parser.grid_y);
REQUIRE(cell.w == parser.grid_w);
REQUIRE(cell.h == parser.grid_h);
} else {
auto &cell = parser.cells.at(name);
REQUIRE(cell.row == int(rowcount));
REQUIRE(cell.col == int(colcount));
for(size_t rowcount = 0; rowcount < parser.grid.size(); rowcount++) {
auto& row = parser.grid[rowcount];
for(size_t colcount = 0; colcount < row.size(); colcount++) {
auto &name = row[colcount];
if(name == "_") {
CHECK(!parser.cells.contains(name));
} else if(name == "_MAIN") {
// it's the main cell which covers the whole area
auto &cell = parser.cells.at(name);
CHECK(cell.row == 0);
CHECK(cell.col == 0);
CHECK(cell.x == parser.grid_x);
CHECK(cell.y == parser.grid_y);
CHECK(cell.w == parser.grid_w);
CHECK(cell.h == parser.grid_h);
} else {
auto &cell = parser.cells.at(name);
CHECK(cell.row == int(rowcount));
CHECK(cell.col == int(colcount));
}
}
}
CHECK(parser.cells.size() == 11);
CHECK(parser.cells.at("label2").right == true);
CHECK(parser.cells.at("text1").expand == true);
CHECK(parser.cells.at("text1").w == 300);
CHECK(parser.cells.at("text1").h == 300);
CHECK(parser.cells.at("people").expand == false);
CHECK(parser.cells.at("message").expand == false);
CHECK(parser.cells.at("message").center == true);
for(auto& [name, cell] : parser.cells) {
CHECK(cell.w > 0);
CHECK(cell.h > 0);
}
auto hit = parser.hit(10, 10);
CHECK(*hit == "label_1");
auto nohit = parser.hit(1000, 1000);
CHECK(!nohit);
CHECK(nohit == std::nullopt);
}
REQUIRE(parser.cells.size() == 11);
REQUIRE(parser.cells.at("label2").right == true);
REQUIRE(parser.cells.at("text1").expand == true);
REQUIRE(parser.cells.at("text1").w == 300);
REQUIRE(parser.cells.at("text1").h == 300);
REQUIRE(parser.cells.at("people").expand == false);
REQUIRE(parser.cells.at("message").expand == false);
REQUIRE(parser.cells.at("message").center == true);
for(auto& [name, cell] : parser.cells) {
REQUIRE(cell.w > 0);
REQUIRE(cell.h > 0);
}
auto hit = parser.hit(10, 10);
REQUIRE(*hit == "label_1");
auto nohit = parser.hit(1000, 1000);
REQUIRE(!nohit);
REQUIRE(nohit == std::nullopt);
fuc2::Set TESTS{
.name="lel parser tests",
.tests={
{"test_basic_ops", test_basic_ops},
}
};
}

31
tests/main.cpp Normal file
View file

@ -0,0 +1,31 @@
#include <fuc2/run.hpp>
// you can also place these into a .hpp you include if
// they're too numerous to manage
namespace lel_tests {
extern fuc2::Set TESTS;
}
namespace guecs_tests {
extern fuc2::Set TESTS;
}
namespace shader_tests {
extern fuc2::Set TESTS;
}
namespace sound_tests {
extern fuc2::Set TESTS;
}
namespace texture_tests {
extern fuc2::Set TESTS;
}
int main(int argc, char* argv[]) {
run(lel_tests::TESTS);
run(guecs_tests::TESTS);
run(shader_tests::TESTS);
run(sound_tests::TESTS);
run(texture_tests::TESTS);
}

View file

@ -1,26 +1,36 @@
#include <catch2/catch_test_macros.hpp>
#include <fmt/core.h>
#include <string>
#include "guecs/sfml/shaders.hpp"
#include <fuc2/testing.hpp>
using namespace fuc2;
using namespace fmt;
TEST_CASE("shader loading/init works", "[shaders]") {
shaders::init();
int version = shaders::version();
namespace shader_tests {
void test_shader_loading() {
shaders::init();
int version = shaders::version();
std::shared_ptr<sf::Shader> ui_shader = shaders::get("ui_shader");
auto other_test = shaders::get("ui_shader");
std::shared_ptr<sf::Shader> ui_shader = shaders::get("ui_shader");
auto other_test = shaders::get("ui_shader");
REQUIRE(ui_shader != nullptr);
REQUIRE(ui_shader == other_test);
REQUIRE(shaders::updated(version) == false);
CHECK(ui_shader != nullptr);
CHECK(ui_shader == other_test);
CHECK(shaders::updated(version) == false);
int new_version = shaders::reload();
REQUIRE(version != shaders::version());
REQUIRE(version != new_version);
REQUIRE(shaders::version() == new_version);
REQUIRE(shaders::updated(version) == true);
version = new_version;
int new_version = shaders::reload();
CHECK(version != shaders::version());
CHECK(version != new_version);
CHECK(shaders::version() == new_version);
CHECK(shaders::updated(version) == true);
version = new_version;
}
fuc2::Set TESTS{
.name="shader tests",
.tests={
{"test_shader_loading", test_shader_loading},
}
};
}

View file

@ -1,14 +1,23 @@
#include <catch2/catch_test_macros.hpp>
#include <fmt/core.h>
#include <string>
#include "guecs/sfml/sound.hpp"
#include <fuc2/testing.hpp>
using namespace fmt;
using namespace fuc2;
TEST_CASE("test sound manager", "[sound]") {
sound::init();
namespace sound_tests {
void test_sound_manager() {
sound::init();
sound::play("blank");
sound::play("blank");
sound::play_at("blank", 0.1, 0.1, 0.1);
sound::play_at("blank", 0.1, 0.1, 0.1);
}
fuc2::Set TESTS{
.name="sound manager tests",
.tests={
{"test_sound_manager", test_sound_manager},
}
};
}

View file

@ -1,15 +1,24 @@
#include <catch2/catch_test_macros.hpp>
#include <fmt/core.h>
#include <string>
#include "guecs/sfml/textures.hpp"
#include <fuc2/testing.hpp>
using namespace fmt;
using namespace fuc2;
TEST_CASE("test texture management", "[textures]") {
textures::init();
auto spider = textures::get("textures_test");
REQUIRE(spider.sprite != nullptr);
REQUIRE(spider.texture != nullptr);
namespace texture_tests {
void test_texture_management() {
textures::init();
auto spider = textures::get("textures_test");
CHECK(spider.sprite != nullptr);
CHECK(spider.texture != nullptr);
auto image = textures::load_image("assets/textures_test.png");
auto image = textures::load_image("assets/textures_test.png");
}
fuc2::Set TESTS{
.name="texture manager tests",
.tests={
{"test_texture_management", test_texture_management},
}
};
}

View file

@ -1,11 +0,0 @@
[wrap-file]
directory = Catch2-3.7.1
source_url = https://github.com/catchorg/Catch2/archive/v3.7.1.tar.gz
source_filename = Catch2-3.7.1.tar.gz
source_hash = c991b247a1a0d7bb9c39aa35faf0fe9e19764213f28ffba3109388e62ee0269c
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/catch2_3.7.1-1/Catch2-3.7.1.tar.gz
wrapdb_version = 3.7.1-1
[provide]
catch2 = catch2_dep
catch2-with-main = catch2_with_main_dep

9
wraps/fuc2.wrap Normal file
View file

@ -0,0 +1,9 @@
[wrap-git]
directory=fuc2-0.1.0
url=https://lcthw.dev/cpp/fuc2.git
revision=HEAD
depth=1
method=meson
[provide]
fuc2 = fuc2_dep