Files
Renderive/Kernel/tests/main.cpp
T
2026-08-04 18:14:38 +08:00

76 lines
2.7 KiB
C++

#include <atomic>
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>
#ifdef RENDERIVE_WITH_GTEST
#include <gtest/gtest.h>
#endif
#include "../src/renderive/base/property/Property.hpp"
#include "../src/renderive/renderable/Renderable.hpp"
#include "../src/renderive/scene/Scene.hpp"
#include "../src/renderive/state/State_Strategy.hpp"
struct Radio_State {
struct Even_Validator {
void operator()(const int& value) const {
if (value % 2 != 0) {
throw std::invalid_argument("buffer_count must be even");
}
}
};
Range_Value<int, 1, 65535> port{8080};
Validated_Value<int, Even_Validator> buffer_count{2};
int low_watermark{};
int high_watermark{};
};
struct Radio_Base {
Radio_Base(int id, std::string name) : id(id), name(std::move(name)) {}
static void validate_state(const Radio_State& state) {
if (state.low_watermark > state.high_watermark) {
throw std::invalid_argument("low_watermark must not exceed high_watermark");
}
}
int id;
std::string name;
};
struct Demo_Renderable : Renderable_Base {
explicit Demo_Renderable(Scene_Base& scene) : Renderable_Base(scene, {.cache_enabled = true}) {}
void render(const Scene_Render_Context&) override {
++render_count;
}
std::atomic<int> render_count{};
};
using Radio_Strategy = Double_State_Strategy<Radio_Base, Radio_State>;
using Radio = Attach_State_Builder<Radio_Strategy, Radio_State>;
int run_main_flow() {
auto radio = Radio::Builder{}
.set < &Radio_State::port > (9000)
.set<&Radio_State::buffer_count>(8)
.configure([](Radio_State& state) {
state.low_watermark = 16;
state.high_watermark = 64;
})
.build(1, "primary");
radio->set < &Radio_State::port > (9100);
radio->publish();
Scene2D_Context<> scene;
auto renderable = std::make_shared<Demo_Renderable>(scene);
scene.attach_renderable(renderable);
scene.render();
scene.wait_for_render();
const auto& state = radio->render_use_state();
std::cout << radio->id << ' ' << radio->name << ' ' << state.port.get() << ' ' << state.buffer_count.get() << ' ' << renderable->render_count.load() << ' ' << scene.frame_control.frequency_hz() << '\n';
return 0;
}
int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv) {
#ifdef RENDERIVE_WITH_GTEST
if (argc > 1 && std::string(argv[1]) == "--gtest") {
--argc;
++argv;
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
#endif
return run_main_flow();
}