改造一些

This commit is contained in:
2026-08-12 00:06:44 +08:00
parent aca480d988
commit abd1b595c7
57 changed files with 883 additions and 732 deletions
@@ -12,20 +12,22 @@ TEST(double_state_strategy_test, calls_optional_state_validator_when_present) {
EXPECT_THROW(builder.build(1, "invalid"), 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(product->render_use_state().percent.get(), 20);
EXPECT_EQ(render.read(*product).percent.get(), 20);
product->publish();
EXPECT_EQ(product->render_use_state().percent.get(), 60);
EXPECT_EQ(render.read(*product).percent.get(), 60);
}
TEST(double_state_strategy_test, returns_render_state_snapshot) {
TEST(double_state_strategy_test, keeps_acquired_render_reference_stable_until_publish) {
State_Render_State_Reader render;
State_Plain_Strategy strategy(State_Plain_Value{.count = 1, .name = "snapshot"});
const auto snapshot = strategy.render_use_state();
const auto snapshot = render.read(strategy);
strategy.set<&State_Plain_Value::count>(2);
strategy.publish();
EXPECT_EQ(snapshot.count, 1);
EXPECT_EQ(strategy.render_use_state().count, 2);
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");
@@ -33,10 +35,11 @@ TEST(double_state_strategy_test, keeps_cached_value_when_runtime_validation_fail
EXPECT_EQ(product->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(product->render_use_state().count, 2);
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>);
@@ -95,6 +98,7 @@ struct Double_State_Throwing_Assignment_State {
inline static bool throw_on_copy_assignment{};
};
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>;
Double_State_Throwing_Assignment_State::throw_on_copy_assignment = false;
Strategy strategy(Double_State_Throwing_Assignment_State(1, 2));
@@ -104,10 +108,10 @@ TEST(double_state_strategy_test, failed_publish_keeps_render_state_and_revision_
EXPECT_THROW(strategy.publish(), std::runtime_error);
Double_State_Throwing_Assignment_State::throw_on_copy_assignment = false;
EXPECT_EQ(strategy.state_revision(), 0);
EXPECT_EQ(strategy.render_use_state().first, 1);
EXPECT_EQ(strategy.render_use_state().second, 2);
EXPECT_EQ(render.read(strategy).first, 1);
EXPECT_EQ(render.read(strategy).second, 2);
strategy.publish();
EXPECT_EQ(strategy.state_revision(), 1);
EXPECT_EQ(strategy.render_use_state().first, 10);
EXPECT_EQ(strategy.render_use_state().second, 20);
EXPECT_EQ(render.read(strategy).first, 10);
EXPECT_EQ(render.read(strategy).second, 20);
}