中间状态暂存
This commit is contained in:
@@ -2,23 +2,25 @@
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
#include "State_Test_Types.hpp"
|
||||
TEST(double_state_strategy_test, builds_without_state_validator) {
|
||||
auto product = State_Plain_Product::Builder{}.set<&State_Plain_Value::count>(10).set<&State_Plain_Value::name>("alpha").build();
|
||||
EXPECT_EQ(product->get<&State_Plain_Value::count>(), 10);
|
||||
EXPECT_EQ(product->get<&State_Plain_Value::name>(), "alpha");
|
||||
TEST(double_state_strategy_test, constructs_from_state) {
|
||||
State_Plain_Strategy state({.count = 10, .name = "alpha"});
|
||||
EXPECT_EQ(state.get<&State_Plain_Value::count>(), 10);
|
||||
EXPECT_EQ(state.get<&State_Plain_Value::name>(), "alpha");
|
||||
}
|
||||
TEST(double_state_strategy_test, calls_optional_state_validator_when_present) {
|
||||
auto builder = State_Checked_Product::Builder{}.set<&State_Checked_Value::minimum>(10).set<&State_Checked_Value::maximum>(5);
|
||||
EXPECT_THROW(builder.build(1, "invalid"), std::invalid_argument);
|
||||
State_Checked_Value state{.minimum = 10, .maximum = 5};
|
||||
EXPECT_THROW(State_Checked_Validator::validate_state(state),
|
||||
std::invalid_argument);
|
||||
}
|
||||
TEST(double_state_strategy_test, keeps_cache_separate_until_publish) {
|
||||
State_Render_State_Reader render;
|
||||
auto product = State_Checked_Product::Builder{}.set<&State_Checked_Value::percent>(20).set<&State_Checked_Value::batch_size>(4).build(1, "state");
|
||||
product->set<&State_Checked_Value::percent>(60);
|
||||
EXPECT_EQ(product->get<&State_Checked_Value::percent>(), 60);
|
||||
EXPECT_EQ(render.read(*product).percent.get(), 20);
|
||||
product->publish();
|
||||
EXPECT_EQ(render.read(*product).percent.get(), 60);
|
||||
State_Checked_Strategy state(
|
||||
State_Checked_Value{.percent = 20, .batch_size = 4});
|
||||
state.set<&State_Checked_Value::percent>(60);
|
||||
EXPECT_EQ(state.get<&State_Checked_Value::percent>(), 60);
|
||||
EXPECT_EQ(render.read(state).percent.get(), 20);
|
||||
state.publish();
|
||||
EXPECT_EQ(render.read(state).percent.get(), 60);
|
||||
}
|
||||
TEST(double_state_strategy_test, keeps_acquired_render_reference_stable_until_publish) {
|
||||
State_Render_State_Reader render;
|
||||
@@ -30,22 +32,18 @@ TEST(double_state_strategy_test, keeps_acquired_render_reference_stable_until_pu
|
||||
EXPECT_EQ(render.read(strategy).count, 2);
|
||||
}
|
||||
TEST(double_state_strategy_test, keeps_cached_value_when_runtime_validation_fails) {
|
||||
auto product = State_Checked_Product::Builder{}.set<&State_Checked_Value::percent>(20).set<&State_Checked_Value::batch_size>(4).build(1, "state");
|
||||
EXPECT_THROW((product->set<&State_Checked_Value::percent>(200)), std::out_of_range);
|
||||
EXPECT_EQ(product->get<&State_Checked_Value::percent>(), 20);
|
||||
State_Checked_Strategy state(
|
||||
State_Checked_Value{.percent = 20, .batch_size = 4});
|
||||
EXPECT_THROW((state.set<&State_Checked_Value::percent>(200)),
|
||||
std::out_of_range);
|
||||
EXPECT_EQ(state.get<&State_Checked_Value::percent>(), 20);
|
||||
}
|
||||
TEST(double_state_strategy_test, supports_atomic_wait_mutex) {
|
||||
State_Render_State_Reader render;
|
||||
auto product = State_Wait_Product::Builder{State_Plain_Value{.count = 1, .name = "wait"}}.build();
|
||||
product->set<&State_Plain_Value::count>(2);
|
||||
product->publish();
|
||||
EXPECT_EQ(render.read(*product).count, 2);
|
||||
}
|
||||
TEST(double_state_strategy_test, passes_additional_builder_template_arguments) {
|
||||
static_assert(std::same_as<typename State_Tagged_Product::Builder::Tag, State_Builder_Tag>);
|
||||
static_assert(std::same_as<typename State_Tagged_Product::Builder::Mode, State_Builder_Mode>);
|
||||
auto product = State_Tagged_Product::Builder{State_Plain_Value{.count = 3, .name = "tagged"}}.build();
|
||||
EXPECT_EQ(product->get<&State_Plain_Value::count>(), 3);
|
||||
State_Wait_Strategy state({.count = 1, .name = "wait"});
|
||||
state.set<&State_Plain_Value::count>(2);
|
||||
state.publish();
|
||||
EXPECT_EQ(render.read(state).count, 2);
|
||||
}
|
||||
struct Double_State_Observer_Test_Time_Source {
|
||||
std::uint64_t value{100};
|
||||
@@ -70,7 +68,8 @@ struct Double_State_Observer_Test_Recorder {
|
||||
};
|
||||
TEST(double_state_strategy_test, notifies_observer_for_cache_update_and_publish) {
|
||||
using Observer = Observer_State<Double_State_Observer_Test_Recorder, Double_State_Observer_Test_Time_Source>;
|
||||
using Strategy = Double_State_Strategy<State_Plain_Base, State_Plain_Value, Atomic_Spin_Mutex, Observer>;
|
||||
using Strategy =
|
||||
Double_State_Storage<State_Plain_Value, Atomic_Spin_Mutex, Observer>;
|
||||
Double_State_Observer_Test_Recorder recorder;
|
||||
Strategy strategy(State_Plain_Value{}, With_Observer(Observer(recorder, Double_State_Observer_Test_Time_Source{})));
|
||||
strategy.set<&State_Plain_Value::count>(8);
|
||||
@@ -99,7 +98,7 @@ struct Double_State_Throwing_Assignment_State {
|
||||
};
|
||||
TEST(double_state_strategy_test, failed_publish_keeps_render_state_and_revision_unchanged) {
|
||||
State_Render_State_Reader render;
|
||||
using Strategy = Double_State_Strategy<State_Plain_Base, Double_State_Throwing_Assignment_State>;
|
||||
using Strategy = Double_State_Storage<Double_State_Throwing_Assignment_State>;
|
||||
Double_State_Throwing_Assignment_State::throw_on_copy_assignment = false;
|
||||
Strategy strategy(Double_State_Throwing_Assignment_State(1, 2));
|
||||
strategy.set<&Double_State_Throwing_Assignment_State::first>(10);
|
||||
|
||||
Reference in New Issue
Block a user