Files
ViewDesignEngine/tests/brep/test_incremental_update.cpp
T
茂之钳 2e004fda6d
CI / Build & Test (push) Failing after 35s
CI / Release Build (push) Failing after 48s
Build & Test / build-and-test (push) Has been cancelled
Build & Test / python-bindings (push) Has been cancelled
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)
2026-07-25 03:51:57 +00:00

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);
}