核心第一版
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
#include "double_buffer/object.hpp"
|
||||
#include "double_buffer/model.hpp"
|
||||
#include <gtest/gtest.h>
|
||||
namespace {
|
||||
struct Object_State_Tag {};
|
||||
struct Test_Object : double_buffer::Impl<Test_Object, double_buffer::Root, double_buffer::State_Type<Object_State_Tag>> {
|
||||
struct Test_Object : double_buffer::Def<Test_Object, double_buffer::Root, double_buffer::State_Type<Object_State_Tag>> {
|
||||
struct Prop : Prev_Prop {
|
||||
int first{};
|
||||
int second{};
|
||||
@@ -14,9 +14,9 @@ struct Test_Object : double_buffer::Impl<Test_Object, double_buffer::Root, doubl
|
||||
};
|
||||
struct Private : Prev_Private {};
|
||||
};
|
||||
using Object = double_buffer::Attach_Object<Test_Object>;
|
||||
using Object = double_buffer::Impl<Test_Object>;
|
||||
struct Derived_State_Tag {};
|
||||
struct Derived_Object : double_buffer::Impl<Derived_Object, Test_Object, double_buffer::State_Type<Derived_State_Tag>> {
|
||||
struct Derived_Object : double_buffer::Def<Derived_Object, Test_Object, double_buffer::State_Type<Derived_State_Tag>> {
|
||||
struct Prop : Prev_Prop {};
|
||||
struct State : Prev_State<Derived_State_Tag> {
|
||||
int derived{};
|
||||
@@ -24,29 +24,29 @@ struct Derived_Object : double_buffer::Impl<Derived_Object, Test_Object, double_
|
||||
};
|
||||
struct Private : Prev_Private {};
|
||||
};
|
||||
using Derived = double_buffer::Attach_Object<Derived_Object>;
|
||||
using Derived = double_buffer::Impl<Derived_Object>;
|
||||
}
|
||||
TEST(object_buffer, state_moves_inward_and_keeps_incremental_baseline) {
|
||||
TEST(object_buffer, state_commits_and_keeps_incremental_baseline) {
|
||||
Object object;
|
||||
object.update_state<&Test_Object::State::first>(3);
|
||||
object.exchange();
|
||||
object.advance();
|
||||
EXPECT_EQ(object.d.state.current->first, 3);
|
||||
EXPECT_EQ(object.d.state.pending->first, 3);
|
||||
object.update_state<&Test_Object::State::second>(5);
|
||||
object.exchange();
|
||||
object.advance();
|
||||
EXPECT_EQ(object.d.state.current->first, 3);
|
||||
EXPECT_EQ(object.d.state.current->second, 5);
|
||||
}
|
||||
TEST(object_buffer, prop_moves_outward_and_keeps_incremental_baseline) {
|
||||
TEST(object_buffer, prop_publishes_and_keeps_incremental_baseline) {
|
||||
Object object;
|
||||
object.set(&Test_Object::Prop::first, 17);
|
||||
EXPECT_EQ(object.d.current->first, 17);
|
||||
EXPECT_EQ(object.d.pending->first, 0);
|
||||
object.exchange();
|
||||
object.advance();
|
||||
EXPECT_EQ(object.d.pending->first, 17);
|
||||
EXPECT_EQ(object.d.current->first, 17);
|
||||
object.set(&Test_Object::Prop::second, 19);
|
||||
object.exchange();
|
||||
object.advance();
|
||||
EXPECT_EQ(object.d.pending->first, 17);
|
||||
EXPECT_EQ(object.d.pending->second, 19);
|
||||
}
|
||||
@@ -60,7 +60,7 @@ TEST(state_tag, callback_publishes_only_requested_layer) {
|
||||
}
|
||||
);
|
||||
object.update_state<&Test_Object::State::first>(23);
|
||||
object.exchange();
|
||||
object.advance();
|
||||
EXPECT_EQ(calls, 0);
|
||||
object.notify_state<Object_State_Tag>();
|
||||
EXPECT_EQ(calls, 1);
|
||||
@@ -86,6 +86,26 @@ TEST(state_tag, inherited_tags_remain_independently_addressable) {
|
||||
static_assert(double_buffer::detail::State_Tag_In<double_buffer::Root_State_Tag, Derived::States>);
|
||||
static_assert(double_buffer::detail::State_Tag_In<Object_State_Tag, Derived::States>);
|
||||
static_assert(double_buffer::detail::State_Tag_In<Derived_State_Tag, Derived::States>);
|
||||
static_assert(std::same_as<
|
||||
decltype(std::declval<double_buffer::State_Access<Derived::State>>().template get<Object_State_Tag>()),
|
||||
Test_Object::State&
|
||||
>);
|
||||
static_assert(std::same_as<
|
||||
decltype(std::declval<double_buffer::State_Access<const Derived::State>>().template get<Derived_State_Tag>()),
|
||||
const Derived_Object::State&
|
||||
>);
|
||||
TEST(state_tag, state_access_selects_mutable_and_const_layers_by_tag) {
|
||||
Derived::State state;
|
||||
double_buffer::State_Access states{state};
|
||||
states.get<Object_State_Tag>().first = 31;
|
||||
states.get<Derived_State_Tag>().derived = 47;
|
||||
double_buffer::State_Access<Test_Object::State> base_states = states;
|
||||
EXPECT_EQ(base_states.get<Object_State_Tag>().first, 31);
|
||||
const auto& const_state = state;
|
||||
double_buffer::State_Access current_states{const_state};
|
||||
EXPECT_EQ(current_states.get<Object_State_Tag>().first, 31);
|
||||
EXPECT_EQ(current_states.get<Derived_State_Tag>().derived, 47);
|
||||
}
|
||||
TEST(state_tag, state_chain_keeps_default_equality_usable) {
|
||||
Test_Object::State first;
|
||||
Test_Object::State second;
|
||||
|
||||
Reference in New Issue
Block a user