#include #include "vde/brep/incremental_update.h" #include "vde/brep/modeling.h" using namespace vde::brep; using namespace vde::core; TEST(IncrementalUpdateTest, RegisterNode) { IncrementalUpdateEngine engine; engine.register_node(1); EXPECT_EQ(engine.total_nodes(), 1); } TEST(IncrementalUpdateTest, RegisterWithDeps) { IncrementalUpdateEngine engine; engine.register_node(1); engine.register_node(2, {1}); engine.register_node(3, {1, 2}); EXPECT_EQ(engine.total_nodes(), 3); } TEST(IncrementalUpdateTest, MarkDirtyPropagates) { IncrementalUpdateEngine engine; engine.register_node(1); engine.register_node(2, {1}); engine.register_node(3, {2}); engine.mark_dirty(1); EXPECT_EQ(engine.dirty_count(), 3); } TEST(IncrementalUpdateTest, MarkDirtyNoUpstream) { IncrementalUpdateEngine engine; engine.register_node(1); engine.register_node(2, {1}); engine.mark_dirty(2); EXPECT_EQ(engine.dirty_count(), 1); } TEST(IncrementalUpdateTest, CacheMissOnDirty) { IncrementalUpdateEngine engine; engine.register_node(1); engine.mark_dirty(1); EXPECT_TRUE(engine.get_cache(1) == nullptr); EXPECT_EQ(engine.cache_misses(), 1); } TEST(IncrementalUpdateTest, RebuildClearsDirty) { IncrementalUpdateEngine engine; engine.register_node(1); engine.mark_dirty(1); EXPECT_EQ(engine.dirty_count(), 1); FeatureHistory history; engine.incremental_rebuild(history); EXPECT_EQ(engine.dirty_count(), 0); } TEST(IncrementalUpdateTest, RebuildWithCallback) { IncrementalUpdateEngine engine; engine.register_node(1); engine.mark_dirty(1); int cb = 0; FeatureHistory history; engine.incremental_rebuild(history, [&](int nid, const BrepModel&) { cb++; }); EXPECT_EQ(cb, 1); } TEST(IncrementalUpdateTest, ChainDependencyOrder) { IncrementalUpdateEngine engine; engine.register_node(1); engine.register_node(2, {1}); engine.mark_dirty(1); std::vector order; FeatureHistory history; engine.incremental_rebuild(history, [&](int nid, const BrepModel&) { order.push_back(nid); }); ASSERT_GE(order.size(), 2u); EXPECT_LT(std::find(order.begin(),order.end(),1), std::find(order.begin(),order.end(),2)); } TEST(IncrementalUpdateTest, IncrementalVsFull) { IncrementalUpdateEngine engine; for (int i = 1; i <= 10; ++i) { std::vector deps; if (i > 1) deps.push_back(i - 1); engine.register_node(i, deps); } FeatureHistory history; engine.clear_all(); int fc = engine.incremental_rebuild(history); EXPECT_EQ(fc, 10); engine.clear_all(); engine.incremental_rebuild(history); engine.mark_dirty(5); int ic = engine.incremental_rebuild(history); EXPECT_LT(ic, fc); EXPECT_GT(ic, 0); } TEST(IncrementalUpdateTest, HitRate) { IncrementalUpdateEngine engine; EXPECT_EQ(engine.hit_rate(), 0.0); } TEST(IncrementalUpdateTest, ClearAll) { IncrementalUpdateEngine engine; engine.register_node(1); engine.register_node(2); engine.clear_all(); EXPECT_EQ(engine.dirty_count(), 2); }