mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-08-15 14:43:32 -07:00
Add test for queries with visibility checks
Some checks failed
checkrefs / lfscheck (push) Has been cancelled
checkrefs / checkrefs (push) Has been cancelled
lint / cppcheck (push) Has been cancelled
lint / copyright (push) Has been cancelled
lint / jenkinsfiles (push) Has been cancelled
pre-commit / pre-commit (push) Has been cancelled
Some checks failed
checkrefs / lfscheck (push) Has been cancelled
checkrefs / checkrefs (push) Has been cancelled
lint / cppcheck (push) Has been cancelled
lint / copyright (push) Has been cancelled
lint / jenkinsfiles (push) Has been cancelled
pre-commit / pre-commit (push) Has been cancelled
This commit is contained in:
parent
38b33b0484
commit
1b07b799ec
1 changed files with 101 additions and 1 deletions
|
|
@ -221,7 +221,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void test_queries()
|
||||
void test_range_queries_distance_only()
|
||||
{
|
||||
ComponentTestHelper test(*g_ScriptContext);
|
||||
|
||||
|
|
@ -295,6 +295,106 @@ public:
|
|||
|
||||
}
|
||||
|
||||
void test_range_queries_visibility_filtering()
|
||||
{
|
||||
ComponentTestHelper test(*g_ScriptContext);
|
||||
|
||||
ICmpRangeManager* rangeManager = test.Add<ICmpRangeManager>(CID_RangeManager, "", SYSTEM_ENTITY);
|
||||
|
||||
MockVisionRgm vision, vision2;
|
||||
MockPositionRgm position, position2;
|
||||
MockObstructionRgm obs(fixed::FromInt(2)), obs2(fixed::Zero());
|
||||
test.AddMock(100, IID_Vision, vision);
|
||||
test.AddMock(100, IID_Position, position);
|
||||
test.AddMock(100, IID_Obstruction, obs);
|
||||
|
||||
test.AddMock(101, IID_Vision, vision2);
|
||||
test.AddMock(101, IID_Position, position2);
|
||||
test.AddMock(101, IID_Obstruction, obs2);
|
||||
|
||||
rangeManager->SetBounds(entity_pos_t::FromInt(0), entity_pos_t::FromInt(0), entity_pos_t::FromInt(512), entity_pos_t::FromInt(512));
|
||||
rangeManager->Verify();
|
||||
{ CMessageCreate msg(100); rangeManager->HandleMessage(msg, false); }
|
||||
{ CMessageCreate msg(101); rangeManager->HandleMessage(msg, false); }
|
||||
|
||||
// Set ownership for both entities so they have proper owners
|
||||
{ CMessageOwnershipChanged msg(100, -1, 1); rangeManager->HandleMessage(msg, false); }
|
||||
{ CMessageOwnershipChanged msg(101, -1, 1); rangeManager->HandleMessage(msg, false); }
|
||||
|
||||
auto move = [&rangeManager](entity_id_t ent, MockPositionRgm& pos, fixed x, fixed z) {
|
||||
pos.m_Pos = CFixedVector3D(x, fixed::Zero(), z);
|
||||
{ CMessagePositionChanged msg(ent, true, x, z, entity_angle_t::Zero()); rangeManager->HandleMessage(msg, false); }
|
||||
};
|
||||
|
||||
move(100, position, fixed::FromInt(10), fixed::FromInt(10));
|
||||
move(101, position2, fixed::FromInt(10), fixed::FromInt(15));
|
||||
|
||||
std::vector<int> owners;
|
||||
owners.push_back(1);
|
||||
|
||||
// Test 1: With preferMirages = true, we should get the mirage entity when visible
|
||||
ICmpRangeManager::tag_t query = rangeManager->CreateActiveQuery(
|
||||
100, // source
|
||||
fixed::FromInt(0), // minRange
|
||||
fixed::FromInt(50), // maxRange
|
||||
owners, // owners
|
||||
0, // requiredInterface
|
||||
rangeManager->GetEntityFlagMask("normal"),
|
||||
true, // accountForSize
|
||||
true // preferMirages = true
|
||||
);
|
||||
rangeManager->EnableActiveQuery(query);
|
||||
|
||||
// With reveal map enabled, entity should be visible
|
||||
rangeManager->SetLosRevealWholeMap(1, true);
|
||||
{ CMessageUpdate msg(fixed::FromInt(1)); rangeManager->HandleMessage(msg, false); }
|
||||
|
||||
std::vector<entity_id_t> nearby = rangeManager->ResetActiveQuery(query);
|
||||
// Should return either the real entity (101) or a mirage.
|
||||
// For this test, we just verify something is returned.
|
||||
TS_ASSERT_EQUALS(nearby.size(), 1);
|
||||
|
||||
// Disable reveal map - entity should become hidden
|
||||
rangeManager->SetLosRevealWholeMap(1, false);
|
||||
{ CMessageUpdate msg(fixed::FromInt(1)); rangeManager->HandleMessage(msg, false); }
|
||||
|
||||
nearby = rangeManager->ResetActiveQuery(query);
|
||||
// Should return empty (no visible entities)
|
||||
TS_ASSERT_EQUALS(nearby.size(), 0);
|
||||
|
||||
// Re-enable reveal map
|
||||
rangeManager->SetLosRevealWholeMap(1, true);
|
||||
{ CMessageUpdate msg(fixed::FromInt(1)); rangeManager->HandleMessage(msg, false); }
|
||||
|
||||
nearby = rangeManager->ResetActiveQuery(query);
|
||||
TS_ASSERT_EQUALS(nearby.size(), 1);
|
||||
|
||||
// Test 2: With preferMirages = false (default), visibility filtering is disabled
|
||||
ICmpRangeManager::tag_t query2 = rangeManager->CreateActiveQuery(
|
||||
100, // source
|
||||
fixed::FromInt(0), // minRange
|
||||
fixed::FromInt(50), // maxRange
|
||||
owners, // owners
|
||||
0, // requiredInterface
|
||||
rangeManager->GetEntityFlagMask("normal"),
|
||||
true, // accountForSize
|
||||
false // preferMirages = false
|
||||
);
|
||||
rangeManager->EnableActiveQuery(query2);
|
||||
|
||||
// With preferMirages = false, entity should be returned even when hidden
|
||||
rangeManager->SetLosRevealWholeMap(1, false);
|
||||
{ CMessageUpdate msg(fixed::FromInt(1)); rangeManager->HandleMessage(msg, false); }
|
||||
|
||||
nearby = rangeManager->ResetActiveQuery(query2);
|
||||
// Should return the real entity (101) even though hidden
|
||||
TS_ASSERT_EQUALS(nearby, std::vector<entity_id_t>{101});
|
||||
|
||||
// Clean up
|
||||
rangeManager->DestroyActiveQuery(query);
|
||||
rangeManager->DestroyActiveQuery(query2);
|
||||
}
|
||||
|
||||
void test_ParabolicRangeBasic()
|
||||
{
|
||||
ComponentTestHelper test(*g_ScriptContext);
|
||||
|
|
|
|||
Loading…
Reference in a new issue