#include #include "panels/ObjectTreeSelection.hpp" using namespace geopro::app; using geopro::data::DataSource; TEST(AggregateGsState, AllOnIsChecked) { EXPECT_EQ(aggregateGsState(true, 3, 3), GsCheck::Checked); } TEST(AggregateGsState, AllOffIsUnchecked) { EXPECT_EQ(aggregateGsState(false, 0, 3), GsCheck::Unchecked); } TEST(AggregateGsState, DsOnTmNoneIsPartial) { EXPECT_EQ(aggregateGsState(true, 0, 3), GsCheck::Partial); // 只 GS 自身 ds } TEST(AggregateGsState, DsOffSomeTmIsPartial) { EXPECT_EQ(aggregateGsState(false, 1, 3), GsCheck::Partial); // 部分子 TM } TEST(AggregateGsState, DsOnSomeTmIsPartial) { EXPECT_EQ(aggregateGsState(true, 2, 3), GsCheck::Partial); // ds 开但 TM 未满 } TEST(AggregateGsState, NoTmFallsBackToDsOnly) { EXPECT_EQ(aggregateGsState(true, 0, 0), GsCheck::Checked); // 无子 TM → 仅看 ds 开关 EXPECT_EQ(aggregateGsState(false, 0, 0), GsCheck::Unchecked); } TEST(DedupeSources, RemovesDuplicateByIdAndConfType) { std::vector in = {{"t1", 2}, {"g1", 1}, {"t1", 2}, {"g1", 1}, {"t2", 2}}; const auto out = dedupeSources(in); ASSERT_EQ(out.size(), 3u); EXPECT_EQ(out[0].id, "t1"); EXPECT_EQ(out[0].confType, 2); EXPECT_EQ(out[1].id, "g1"); EXPECT_EQ(out[1].confType, 1); EXPECT_EQ(out[2].id, "t2"); } TEST(DedupeSources, SameIdDifferentConfTypeKept) { std::vector in = {{"x", 1}, {"x", 2}}; EXPECT_EQ(dedupeSources(in).size(), 2u); }