2e004fda6d
- 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)
110 lines
3.1 KiB
C++
110 lines
3.1 KiB
C++
#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);
|
|
}
|