feat(v4.1): incremental update + large assembly + format robustness
- IncrementalUpdateEngine: dirty propagation, topological rebuild, cache hit/miss - InstanceCache: shared LOD mesh for identical parts - LargeAssemblyManager: BVH spatial index, view frustum culling, assembly stats - format_io: auto-detect STEP/IGES, batch import with error recovery - 31 tests: incremental (11), large assembly (12), format IO (8)
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
#include <gtest/gtest.h>
|
||||
#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<int> 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<int> 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);
|
||||
}
|
||||
Reference in New Issue
Block a user