/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include namespace AzToolsFramework { // Test components used to test component filters class EntitySearch_TestComponent1 : public AZ::Component { public: AZ_COMPONENT(EntitySearch_TestComponent1, "{D8ABC8F6-E43B-4ED9-AABE-BA8905D4099D}", AZ::Component); static void Reflect(AZ::ReflectContext* context) { if (auto serializeContext = azrtti_cast(context)) { serializeContext->Class() ->Version(1) ->Field("Bool Value", &EntitySearch_TestComponent1::m_boolValue) ->Field("Int Value", &EntitySearch_TestComponent1::m_intValue) ; if (AZ::EditContext* editContext = serializeContext->GetEditContext()) { editContext->Class("SearchTestComponent1", "Component 1 for Entity Search Unit Tests") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::AddableByUser, true) ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game")) ->Attribute(AZ::Edit::Attributes::Category, "Entity Search Test Components") ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Tag.png") ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/Tag.png") ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://www.amazongames.com/") ->DataElement(AZ::Edit::UIHandlers::Default, &EntitySearch_TestComponent1::m_boolValue, "Bool", "") ->DataElement(AZ::Edit::UIHandlers::Default, &EntitySearch_TestComponent1::m_intValue, "Int", "") ; } } } static constexpr bool DefaultBoolValue = true; EntitySearch_TestComponent1() = default; EntitySearch_TestComponent1(int intValue, bool boolValue) : m_boolValue(boolValue) , m_intValue(intValue) { } virtual ~EntitySearch_TestComponent1() override {} private: void Init() override {} void Activate() override {} void Deactivate() override {} int m_intValue = 0; bool m_boolValue = DefaultBoolValue; }; class EntitySearch_TestComponent2 : public AZ::Component { public: AZ_COMPONENT(EntitySearch_TestComponent2, "{E50A848D-64C3-4445-A21B-D8F9C96972FE}", AZ::Component); static void Reflect(AZ::ReflectContext* context) { if (auto serializeContext = azrtti_cast(context)) { serializeContext->Class() ->Version(1) ->Field("Float Value", &EntitySearch_TestComponent2::m_floatValue) ; if (AZ::EditContext* editContext = serializeContext->GetEditContext()) { editContext->Class("SearchTestComponent2", "Component 2 for Entity Search Unit Tests") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::AddableByUser, true) ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game")) ->Attribute(AZ::Edit::Attributes::Category, "Entity Search Test Components") ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Tag.png") ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/Tag.png") ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://www.amazongames.com/") ->DataElement(AZ::Edit::UIHandlers::Default, &EntitySearch_TestComponent2::m_floatValue, "Float", "") ; } } } const static float DefaultFloatValue; EntitySearch_TestComponent2() = default; EntitySearch_TestComponent2(float floatValue) : m_floatValue(floatValue) { } virtual ~EntitySearch_TestComponent2() override {} private: void Init() override {} void Activate() override {} void Deactivate() override {} float m_floatValue = DefaultFloatValue; }; const float EntitySearch_TestComponent2::DefaultFloatValue = 5.0f; class EditorEntitySearchComponentTests : public ::testing::Test { protected: void SetUp() override { m_app.Start(m_descriptor); RegisterComponents(); GenerateTestHierarchy(); } void RegisterComponents() { // Register our test components (This process also reflects them to the appropriate contexts) auto* EntitySearch_TestComponent1Descriptor = EntitySearch_TestComponent1::CreateDescriptor(); auto* EntitySearch_TestComponent2Descriptor = EntitySearch_TestComponent2::CreateDescriptor(); m_app.RegisterComponentDescriptor(EntitySearch_TestComponent1Descriptor); m_app.RegisterComponentDescriptor(EntitySearch_TestComponent2Descriptor); m_testComponentType1 = azrtti_typeid(); m_testComponentType2 = azrtti_typeid(); } void GenerateTestHierarchy() { /* * City * |_ Street (Test Component 2) * |_ Car * | |_ Passenger (Test Component 1, Test Component 2) * | |_ Passenger * |_ Car (Test Component 1) * | |_ Passenger * |_ SportsCar * |_ Passenger (Test Component 2) * |_ Passenger */ m_testComponentType1Count = 0; m_entityMap["cityId"] = CreateEditorEntity("City", AZ::EntityId()); m_entityMap["streetId"] = CreateEditorEntity("Street", m_entityMap["cityId"], false, true); m_entityMap["carId1"] = CreateEditorEntity("Car", m_entityMap["streetId"]); m_entityMap["passengerId1"] = CreateEditorEntity("Passenger", m_entityMap["carId1"], true, true); m_entityMap["passengerId2"] = CreateEditorEntity("Passenger", m_entityMap["carId1"]); m_entityMap["carId2"] = CreateEditorEntity("Car", m_entityMap["streetId"], true); m_entityMap["passengerId3"] = CreateEditorEntity("Passenger", m_entityMap["carId2"]); m_entityMap["sportsCarId"] = CreateEditorEntity("SportsCar", m_entityMap["streetId"]); m_entityMap["passengerId4"] = CreateEditorEntity("Passenger", m_entityMap["sportsCarId"], false, true); m_entityMap["passengerId5"] = CreateEditorEntity("Passenger", m_entityMap["sportsCarId"]); // Add some Components } AZ::EntityId CreateEditorEntity(const char* name, AZ::EntityId parentId, bool addTestComponent1 = false, bool addTestComponent2 = false) { AZ::Entity* entity = nullptr; UnitTest::CreateDefaultEditorEntity(name, &entity); entity->Deactivate(); if (addTestComponent1) { entity->CreateComponent(m_testComponentType1Count++, EntitySearch_TestComponent1::DefaultBoolValue); } if (addTestComponent2) { entity->CreateComponent(EntitySearch_TestComponent2::DefaultFloatValue); } entity->Activate(); // Parent AZ::TransformBus::Event(entity->GetId(), &AZ::TransformInterface::SetParent, parentId); return entity->GetId(); } void TearDown() override { m_app.Stop(); } AzToolsFramework::ToolsApplication m_app; AZ::ComponentApplication::Descriptor m_descriptor; AZStd::unordered_map m_entityMap; AZ::Uuid m_testComponentType1; AZ::Uuid m_testComponentType2; int m_testComponentType1Count; }; TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_RootEntities) { { EntityIdList rootEntities; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(rootEntities, &AzToolsFramework::EditorEntitySearchRequests::GetRootEditorEntities); EXPECT_EQ(rootEntities.size(), 1); EXPECT_EQ(rootEntities[0], m_entityMap["cityId"]); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_SearchByName_Base) { { // No filters - return all entities EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, EntitySearchFilter()); EXPECT_EQ(searchResults.size(), m_entityMap.size()); } { // Filter by name - single entity EntitySearchFilter filter; filter.m_names.push_back("Street"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["streetId"]); } { // Filter by name - multiple entities EntitySearchFilter filter; filter.m_names.push_back("Passenger"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 5); } { // Filter by name - multiple names EntitySearchFilter filter; filter.m_names.push_back("Passenger"); filter.m_names.push_back("Street"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 6); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_SearchByName_Wildcard) { { EntitySearchFilter filter; filter.m_names.push_back("Str*et"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["streetId"]); } { EntitySearchFilter filter; filter.m_names.push_back("St*t"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["streetId"]); } { EntitySearchFilter filter; filter.m_names.push_back("Str?et"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["streetId"]); } { EntitySearchFilter filter; filter.m_names.push_back("Str?t"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 0); } { EntitySearchFilter filter; filter.m_names.push_back("C*"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 3); } { EntitySearchFilter filter; filter.m_names.push_back("*"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), m_entityMap.size()); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_SearchByName_CaseSensitive) { { EntitySearchFilter filter; filter.m_names.push_back("Street"); filter.m_namesCaseSensitive = false; // Default EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["streetId"]); } { EntitySearchFilter filter; filter.m_names.push_back("street"); filter.m_namesCaseSensitive = false; // Default EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["streetId"]); } { EntitySearchFilter filter; filter.m_names.push_back("Street"); filter.m_namesCaseSensitive = true; EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["streetId"]); } { EntitySearchFilter filter; filter.m_names.push_back("street"); filter.m_namesCaseSensitive = true; EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 0); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_SearchByPath_Base) { { EntitySearchFilter filter; filter.m_names.push_back("City|Street|SportsCar"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["sportsCarId"]); } { EntitySearchFilter filter; filter.m_names.push_back("City|Street|Car|Passenger"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 3); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_SearchByPath_Wildcard) { { EntitySearchFilter filter; filter.m_names.push_back("City|*|SportsCar"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["sportsCarId"]); } { EntitySearchFilter filter; filter.m_names.push_back("City|Street|*|Passenger"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 5); } { EntitySearchFilter filter; filter.m_names.push_back("City|Street|*Car|Passenger"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 5); } { EntitySearchFilter filter; filter.m_names.push_back("City|Street|Sport*|Passenger"); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 2); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_SearchByPath_CaseSensitive) { { EntitySearchFilter filter; filter.m_names.push_back("City|Street"); filter.m_namesCaseSensitive = false; // Default EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["streetId"]); } { EntitySearchFilter filter; filter.m_names.push_back("city|street"); filter.m_namesCaseSensitive = false; // Default EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["streetId"]); } { EntitySearchFilter filter; filter.m_names.push_back("City|Street"); filter.m_namesCaseSensitive = true; EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["streetId"]); } { EntitySearchFilter filter; filter.m_names.push_back("city|street"); filter.m_namesCaseSensitive = true; EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 0); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_SearchByComponent_Base) { { EntitySearchFilter filter; filter.m_components.emplace(m_testComponentType1); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 2); } { EntitySearchFilter filter; filter.m_components.emplace(m_testComponentType2); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 3); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_SearchByComponent_Multiple) { { EntitySearchFilter filter; filter.m_components.emplace(m_testComponentType1); filter.m_components.emplace(m_testComponentType2); filter.m_mustMatchAllComponents = false; // Default EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 4); } { EntitySearchFilter filter; filter.m_components.emplace(m_testComponentType1); filter.m_components.emplace(m_testComponentType2); filter.m_mustMatchAllComponents = true; EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["passengerId1"]); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_SearchByComponent_MatchProperty) { { EntitySearchFilter filter; filter.m_components.emplace(m_testComponentType1, EntitySearchFilter::ComponentProperties{ { "Bool", EntitySearch_TestComponent1::DefaultBoolValue } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 2); } { EntitySearchFilter filter; filter.m_components.emplace(m_testComponentType1, EntitySearchFilter::ComponentProperties{ { "Int", 0 } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); } { EntitySearchFilter filter; filter.m_components.emplace(m_testComponentType1, EntitySearchFilter::ComponentProperties{ { "Bool", !EntitySearch_TestComponent1::DefaultBoolValue } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 0); } { EntitySearchFilter filter; filter.m_components.emplace(m_testComponentType1, EntitySearchFilter::ComponentProperties{ { "Int", m_entityMap.size() } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 0); } { EntitySearchFilter filter; filter.m_components.emplace(m_testComponentType1, EntitySearchFilter::ComponentProperties{ { "Float", 0.0f } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 0); } { EntitySearchFilter filter; filter.m_components.emplace(m_testComponentType2, EntitySearchFilter::ComponentProperties{ { "Bool", EntitySearch_TestComponent1::DefaultBoolValue } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 0); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_SearchByComponent_MatchMultipleProperties) { { EntitySearchFilter filter; filter.m_mustMatchAllComponents = true; filter.m_components.emplace(m_testComponentType1, EntitySearchFilter::ComponentProperties{ { "Bool", EntitySearch_TestComponent1::DefaultBoolValue } }); filter.m_components.emplace(m_testComponentType2, EntitySearchFilter::ComponentProperties{ { "Float", EntitySearch_TestComponent2::DefaultFloatValue } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); } { EntitySearchFilter filter; filter.m_mustMatchAllComponents = false; filter.m_components.emplace(m_testComponentType1, EntitySearchFilter::ComponentProperties{ { "Bool", EntitySearch_TestComponent1::DefaultBoolValue } }); filter.m_components.emplace(m_testComponentType2, EntitySearchFilter::ComponentProperties{ { "Float", EntitySearch_TestComponent2::DefaultFloatValue } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 4); } { EntitySearchFilter filter; filter.m_mustMatchAllComponents = true; filter.m_components.emplace(m_testComponentType1, EntitySearchFilter::ComponentProperties{ { "Bool", EntitySearch_TestComponent1::DefaultBoolValue }, { "Int", 0 } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); } { EntitySearchFilter filter; filter.m_mustMatchAllComponents = false; filter.m_components.emplace(m_testComponentType1, EntitySearchFilter::ComponentProperties{ { "Bool", EntitySearch_TestComponent1::DefaultBoolValue }, { "Int", 0 } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 2); } { EntitySearchFilter filter; filter.m_mustMatchAllComponents = false; filter.m_components.emplace(m_testComponentType1, EntitySearchFilter::ComponentProperties{ { "Bool", EntitySearch_TestComponent1::DefaultBoolValue }, { "Int", 0 } }); filter.m_components.emplace(m_testComponentType2, EntitySearchFilter::ComponentProperties{ { "Float", EntitySearch_TestComponent2::DefaultFloatValue } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 4); } { EntitySearchFilter filter; filter.m_mustMatchAllComponents = true; filter.m_components.emplace(m_testComponentType1, EntitySearchFilter::ComponentProperties{ { "Bool", EntitySearch_TestComponent1::DefaultBoolValue }, { "Int", 0 } }); filter.m_components.emplace(m_testComponentType2, EntitySearchFilter::ComponentProperties{ { "Float", EntitySearch_TestComponent2::DefaultFloatValue } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); } { EntitySearchFilter filter; filter.m_mustMatchAllComponents = false; filter.m_components.emplace(m_testComponentType1); filter.m_components.emplace(m_testComponentType2, EntitySearchFilter::ComponentProperties{ { "Float", EntitySearch_TestComponent2::DefaultFloatValue } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 4); } { EntitySearchFilter filter; filter.m_mustMatchAllComponents = true; filter.m_components.emplace(m_testComponentType1); filter.m_components.emplace(m_testComponentType2, EntitySearchFilter::ComponentProperties{ { "Float", EntitySearch_TestComponent2::DefaultFloatValue } }); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_SearchByAabb_Base) { { // No filters - return all entities EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, EntitySearchFilter()); EXPECT_EQ(searchResults.size(), m_entityMap.size()); } { // Filter by huge AABB - return all entities EntitySearchFilter filter; filter.m_aabb = AZ::Aabb::CreateCenterRadius(AZ::Vector3::CreateZero(), 1000.0f); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), m_entityMap.size()); } { // Filter by small AABB - return no entity EntitySearchFilter filter; filter.m_aabb = AZ::Aabb::CreateCenterRadius(AZ::Vector3::CreateOne(), 0.1f); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 0); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_Search_Roots_Base) { { EntitySearchFilter filter; filter.m_names.push_back("Passenger"); filter.m_roots.push_back(m_entityMap["carId1"]); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 2); } { EntitySearchFilter filter; filter.m_names.push_back("Passenger"); filter.m_roots.push_back(m_entityMap["carId2"]); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["passengerId3"]); } { EntitySearchFilter filter; filter.m_names.push_back("SportsCar"); filter.m_roots.push_back(m_entityMap["carId1"]); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 0); } { EntitySearchFilter filter; filter.m_names.push_back("City|Street|SportsCar|Passenger"); filter.m_roots.push_back(m_entityMap["carId1"]); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 0); } { EntitySearchFilter filter; filter.m_names.push_back("Car|Passenger"); filter.m_roots.push_back(m_entityMap["carId1"]); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 2); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_Search_Roots_NamesAreRootBased) { { EntitySearchFilter filter; filter.m_names.push_back("Car|Passenger"); // No root - Default filter.m_namesAreRootBased = false; // Default EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 3); } { EntitySearchFilter filter; filter.m_names.push_back("Car|Passenger"); // No root - Default filter.m_namesAreRootBased = true; EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 0); } { EntitySearchFilter filter; filter.m_names.push_back("Car|Passenger"); filter.m_roots.push_back(m_entityMap["streetId"]); filter.m_namesAreRootBased = false; // Default EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 3); } { EntitySearchFilter filter; filter.m_names.push_back("Car|Passenger"); filter.m_roots.push_back(m_entityMap["streetId"]); filter.m_namesAreRootBased = true; EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 3); } { EntitySearchFilter filter; filter.m_names.push_back("Car|Passenger"); filter.m_roots.push_back(m_entityMap["carId2"]); filter.m_namesAreRootBased = true; EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 0); } } TEST_F(EditorEntitySearchComponentTests, EditorEntitySearchTests_Search_MultipleFilters) { { EntitySearchFilter filter; filter.m_names.push_back("Car"); filter.m_aabb = AZ::Aabb::CreateFromMinMax(AZ::Vector3(-1.0f), AZ::Vector3(1.0f)); filter.m_components.emplace(m_testComponentType1); EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["carId2"]); } { EntitySearchFilter filter; filter.m_names.push_back("Pass*"); filter.m_roots.push_back(m_entityMap["sportsCarId"]); filter.m_components.emplace(m_testComponentType2, EntitySearchFilter::ComponentProperties{ { "Float", EntitySearch_TestComponent2::DefaultFloatValue } }); filter.m_namesAreRootBased = true; filter.m_namesCaseSensitive = true; EntityIdList searchResults; AzToolsFramework::EditorEntitySearchBus::BroadcastResult(searchResults, &AzToolsFramework::EditorEntitySearchRequests::SearchEntities, filter); EXPECT_EQ(searchResults.size(), 1); EXPECT_EQ(searchResults[0], m_entityMap["passengerId4"]); } } }