43 lines
1.7 KiB
C++
43 lines
1.7 KiB
C++
#include <gtest/gtest.h>
|
|
#include <atomic>
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include "renderive/base/observer/Observer.hpp"
|
|
struct Observer_Test_Observation {
|
|
int value{};
|
|
};
|
|
struct Observer_Test_Time_Source {
|
|
std::shared_ptr<std::atomic<std::uint64_t>> time{std::make_shared<std::atomic<std::uint64_t>>(10)};
|
|
std::uint64_t now_ns() const noexcept {
|
|
return time->fetch_add(5, std::memory_order_relaxed);
|
|
}
|
|
};
|
|
struct Observer_Test_Recorder {
|
|
static constexpr bool enabled = true;
|
|
std::shared_ptr<int> value{std::make_shared<int>()};
|
|
void observe(const Observer_Test_Observation& observation) noexcept {
|
|
*value = observation.value;
|
|
}
|
|
};
|
|
using Observer_Test_State = Observer_State<Observer_Test_Recorder, Observer_Test_Time_Source>;
|
|
static_assert(Observation_Struct<Observer_Test_Observation>);
|
|
static_assert(Observer_Time_Source<Observer_Test_Time_Source>);
|
|
static_assert(Struct_Observer<Observer_Test_Recorder, Observer_Test_Observation>);
|
|
static_assert(Timed_Struct_Observer<Observer_Test_State, Observer_Test_Observation>);
|
|
TEST(observer_state_test, forwards_observation_structure) {
|
|
Observer_Test_Recorder recorder;
|
|
Observer_Test_State observer(recorder, Observer_Test_Time_Source{});
|
|
observer.observe(Observer_Test_Observation{7});
|
|
EXPECT_EQ(*recorder.value, 7);
|
|
}
|
|
TEST(observer_state_test, owns_time_source) {
|
|
Observer_Test_State observer;
|
|
EXPECT_EQ(observer.now_ns(), 10);
|
|
EXPECT_EQ(observer.now_ns(), 15);
|
|
}
|
|
TEST(disabled_observer_test, accepts_any_observation_structure) {
|
|
Observer_State<> observer;
|
|
EXPECT_NO_THROW(observer.observe(Observer_Test_Observation{7}));
|
|
EXPECT_GT(observer.now_ns(), 0);
|
|
}
|