diff --git a/README.md b/README.md index c4eebab56e737b841c2557daf6c18b8996a938a4..2a0e863dd79c1827a3f257793fae9e9135b75beb 100644 --- a/README.md +++ b/README.md @@ -255,7 +255,7 @@ Converts `NET_ASAM_OPENSCENARIO::v1_3::ITransitionDynamics` object type to [mant | Dependency | Commit | Version | License | | ---------- | ------ | ------- | ------- | -| [MantleAPI](https://gitlab.eclipse.org/eclipse/openpass/mantle-api) | 5541bf1a | 14.0.0 | EPL 2.0 | +| [MantleAPI](https://gitlab.eclipse.org/eclipse/openpass/mantle-api) | de5e4930 | prepare_integration_of_v9 | EPL 2.0 | | [OpenSCENARIO API](https://github.com/RA-Consulting-GmbH/openscenario.api.test/) | 5980e88 | 1.4.0 | Apache 2.0 | | [YASE](https://gitlab.eclipse.org/eclipse/openpass/yase) | d0c0e58d | | EPL 2.0 | | [Units](https://github.com/nholthaus/units) | e27eed9 | 2.3.4 | MIT License | diff --git a/engine/BUILD.bazel b/engine/BUILD.bazel index cbc396a17cf882360e9f72672fcad7fd57c626e9..624b71ce55ac428ac0918e3eec47fd30b5517d45 100644 --- a/engine/BUILD.bazel +++ b/engine/BUILD.bazel @@ -108,6 +108,7 @@ cc_test( tags = ["test"], deps = [ ":open_scenario_engine", + ":open_scenario_engine_test_utils", ":test_utils", "@googletest//:gtest_main", "@mantle_api//:test_utils", @@ -122,6 +123,7 @@ cc_test( tags = ["test"], deps = [ ":open_scenario_engine", + ":open_scenario_engine_test_utils", "@googletest//:gtest_main", "@mantle_api//:test_utils", ], @@ -178,9 +180,9 @@ cc_test( data = [":open_scenario_engine_test_data"], tags = ["test"], deps = [ - ":test_utils", ":open_scenario_engine", ":open_scenario_engine_test_utils", + ":test_utils", "@googletest//:gtest_main", "@mantle_api//:test_utils", ], diff --git a/engine/gen/Storyboard/MotionControlAction/LaneChangeAction_base.h b/engine/gen/Storyboard/MotionControlAction/LaneChangeAction_base.h index e35c1178edccd0807b12e066a3aa324f437483d8..ba3179a7fb8cb7b869aca5086a1f58fd004f7ca5 100644 --- a/engine/gen/Storyboard/MotionControlAction/LaneChangeAction_base.h +++ b/engine/gen/Storyboard/MotionControlAction/LaneChangeAction_base.h @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -27,7 +27,7 @@ public: Entities entities; double targetLaneOffset; TransitionDynamics laneChangeActionDynamics; - std::function<mantle_api::UniqueId()> GetLaneChangeTarget; + std::function<mantle_api::LaneId()> GetLaneChangeTarget; }; struct Interfaces { @@ -48,4 +48,4 @@ protected: Interfaces mantle; }; -} // namespace OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace OpenScenarioEngine::v1_3 diff --git a/engine/include/OpenScenarioEngine/OpenScenarioEngine.h b/engine/include/OpenScenarioEngine/OpenScenarioEngine.h index d1d1f201f18297cadd5d9587c7ac8e91077efab4..af948f63e8607181a724c6836518e6888ed3739f 100644 --- a/engine/include/OpenScenarioEngine/OpenScenarioEngine.h +++ b/engine/include/OpenScenarioEngine/OpenScenarioEngine.h @@ -155,6 +155,9 @@ private: /// be used instead void ResetStochastics(); + /// Reset all routes in route repository + void ResetRoutes(); + /// Reset all entities and create new according to scenario description void ResetAndCreateEntities(); diff --git a/engine/src/Conversion/OscToMantle/ConvertScenarioLongitudinalDistance.cpp b/engine/src/Conversion/OscToMantle/ConvertScenarioLongitudinalDistance.cpp index d5fdc2f1a6b959d320097a3be83dd38202c6488b..4013080ae9ae05c4dc2cea8bdea63570be7cf2db 100644 --- a/engine/src/Conversion/OscToMantle/ConvertScenarioLongitudinalDistance.cpp +++ b/engine/src/Conversion/OscToMantle/ConvertScenarioLongitudinalDistance.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2022-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2022-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -31,10 +31,10 @@ LongitudinalDistance ConvertScenarioLongitudinalDistance(const std::shared_ptr<m if (isSetTimeGap) { - const auto& refEntity = EntityUtils::GetEntityByName(environment, ConvertScenarioEntity(entityRef)); - return longitudinalTimeGap * refEntity.GetVelocity().Length().value(); + const auto refEntity = EntityUtils::GetEntityByName(environment, ConvertScenarioEntity(entityRef)); + return longitudinalTimeGap * refEntity->GetVelocity().Length().value(); } throw std::runtime_error(R"(Warning: LongitudinalDistanceAction: please set either "distance" or "timegap")"); } -} // namespace OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace OpenScenarioEngine::v1_3 diff --git a/engine/src/Conversion/OscToMantle/ConvertScenarioPosition.cpp b/engine/src/Conversion/OscToMantle/ConvertScenarioPosition.cpp index aa7678b008133a4d17858b7579717f18c4287193..f7798ab13a20aeff0d7ed4c53a9de6711c0d3073 100644 --- a/engine/src/Conversion/OscToMantle/ConvertScenarioPosition.cpp +++ b/engine/src/Conversion/OscToMantle/ConvertScenarioPosition.cpp @@ -138,17 +138,18 @@ mantle_api::Pose ConvertRelativeLanePosition( } const auto ref_entity_name = relative_lane_position.GetEntityRef()->GetNameRef(); - if (const auto& ref_entity = environment.GetEntityRepository().Get(ref_entity_name)) + + if (const auto ref_entity = environment.GetEntityRepository().Get(ref_entity_name).lock()) { const auto d_lane = relative_lane_position.GetDLane(); const auto ds_lane = relative_lane_position.GetDsLane(); const auto offset = relative_lane_position.GetOffset(); const mantle_api::Pose pose_ref{environment.GetGeometryHelper()->TranslateGlobalPositionLocally( - ref_entity.value().get().GetPosition(), - ref_entity.value().get().GetOrientation(), - -ref_entity.value().get().GetProperties()->bounding_box.geometric_center), - ref_entity.value().get().GetOrientation()}; + ref_entity->GetPosition(), + ref_entity->GetOrientation(), + -ref_entity->GetProperties()->bounding_box.geometric_center), + ref_entity->GetOrientation()}; const auto calculated_pose = environment.GetQueryService().FindRelativeLanePoseAtDistanceFrom( pose_ref, d_lane, units::length::meter_t(ds_lane), units::length::meter_t(offset)); diff --git a/engine/src/Conversion/OscToMantle/ConvertScenarioRelativeTargetLane.cpp b/engine/src/Conversion/OscToMantle/ConvertScenarioRelativeTargetLane.cpp index 82430a7ac0e4f9628befa85649830cf5897b4e31..9fa864af6e0369a94df8cc17b491062045c5de9d 100644 --- a/engine/src/Conversion/OscToMantle/ConvertScenarioRelativeTargetLane.cpp +++ b/engine/src/Conversion/OscToMantle/ConvertScenarioRelativeTargetLane.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2022-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2022-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -23,9 +23,9 @@ mantle_api::LaneId ConvertScenarioRelativeTargetLane( const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::IRelativeTargetLane>& relativeTargetLane) { const auto relative_entity_name = relativeTargetLane->GetEntityRef()->GetNameRef(); - const auto& relative_entity = EntityUtils::GetEntityByName(environment, relative_entity_name); - const auto relative_pose = mantle_api::Pose{relative_entity.GetPosition(), - relative_entity.GetOrientation()}; + const auto relative_entity = EntityUtils::GetEntityByName(environment, relative_entity_name); + const auto relative_pose = mantle_api::Pose{relative_entity->GetPosition(), + relative_entity->GetOrientation()}; if (const auto target_lane_id = environment->GetQueryService().GetRelativeLaneId(relative_pose, relativeTargetLane->GetValue())) { @@ -36,4 +36,4 @@ mantle_api::LaneId ConvertScenarioRelativeTargetLane( relative_entity_name + "\". Please adjust the scenario."); } -} // namespace OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace OpenScenarioEngine::v1_3 diff --git a/engine/src/Conversion/OscToMantle/ConvertScenarioRoute.cpp b/engine/src/Conversion/OscToMantle/ConvertScenarioRoute.cpp index 935684ec0bfeb12c75814e758dcebf3644beb6d1..1ca5007efb95f76528c5c0deca6177733341018f 100644 --- a/engine/src/Conversion/OscToMantle/ConvertScenarioRoute.cpp +++ b/engine/src/Conversion/OscToMantle/ConvertScenarioRoute.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -15,9 +15,10 @@ #include <MantleAPI/Traffic/control_strategy.h> #include <openScenarioLib/generated/v1_3/catalog/CatalogHelperV1_3.h> -#include "Utils/Logger.h" #include <utility> +#include "Utils/Logger.h" + namespace OpenScenarioEngine::v1_3 { namespace detail @@ -47,30 +48,30 @@ std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::IRoute> ResolveChoice(const std::sh throw std::runtime_error("ConvertScenarioRoute: No route defined or referenced. Please adjust the scenario."); } -mantle_api::RouteStrategy ConvertRouteStrategy( +mantle_api::RoutingStrategy ConvertRouteStrategy( const NET_ASAM_OPENSCENARIO::v1_3::RouteStrategy::RouteStrategyEnum& route_strategy_enum) { switch (route_strategy_enum) { case NET_ASAM_OPENSCENARIO::v1_3::RouteStrategy::RouteStrategyEnum::FASTEST: - return mantle_api::RouteStrategy::kFastest; + return mantle_api::RoutingStrategy::kFastest; case NET_ASAM_OPENSCENARIO::v1_3::RouteStrategy::RouteStrategyEnum::LEAST_INTERSECTIONS: - return mantle_api::RouteStrategy::kLeastIntersections; + return mantle_api::RoutingStrategy::kLeastIntersections; case NET_ASAM_OPENSCENARIO::v1_3::RouteStrategy::RouteStrategyEnum::SHORTEST: - return mantle_api::RouteStrategy::kShortest; + return mantle_api::RoutingStrategy::kShortest; case NET_ASAM_OPENSCENARIO::v1_3::RouteStrategy::RouteStrategyEnum::RANDOM: // NOLINT(bugprone-branch-clone) [[fallthrough]]; case NET_ASAM_OPENSCENARIO::v1_3::RouteStrategy::RouteStrategyEnum::UNKNOWN: // NOLINT(bugprone-branch-clone) [[fallthrough]]; default: - return mantle_api::RouteStrategy::kUndefined; + return mantle_api::RoutingStrategy::kUndefined; } } -std::vector<mantle_api::RouteWaypoint> ConvertWaypoints(const std::shared_ptr<mantle_api::IEnvironment>& environment, const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::IRoute>& route_object) +std::vector<mantle_api::RoutingWaypoint> ConvertWaypoints(const std::shared_ptr<mantle_api::IEnvironment>& environment, const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::IRoute>& route_object) { const auto route_waypoints = route_object->GetWaypoints(); - std::vector<mantle_api::RouteWaypoint> waypoints; + std::vector<mantle_api::RoutingWaypoint> waypoints; for (size_t i = 0; i < route_waypoints.size(); ++i) { @@ -79,14 +80,14 @@ std::vector<mantle_api::RouteWaypoint> ConvertWaypoints(const std::shared_ptr<ma if (auto pose = ConvertScenarioPosition(environment, waypoint->GetPosition())) { waypoints.emplace_back( - mantle_api::RouteWaypoint{ + mantle_api::RoutingWaypoint{ pose->position, ConvertRouteStrategy(NET_ASAM_OPENSCENARIO::v1_3::RouteStrategy::GetFromLiteral(waypoint->GetRouteStrategy().GetLiteral()))}); } else { Logger::Warning("ConvertScenarioRoute: Could not convert scenario position to global position for route " + - route_object->GetName() + ", waypoint index " + std::to_string(i) + ". Omitting waypoint"); + route_object->GetName() + ", waypoint index " + std::to_string(i) + ". Omitting waypoint"); } } return waypoints; @@ -99,7 +100,7 @@ Route ConvertScenarioRoute(const std::shared_ptr<mantle_api::IEnvironment>& envi const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::ICatalogReference>& catalogReference) { route_object = detail::ResolveChoice(route_object, catalogReference); - return {route_object->GetClosed(), detail::ConvertWaypoints(environment, route_object)}; + return {route_object->GetName(), route_object->GetClosed(), detail::ConvertWaypoints(environment, route_object)}; } -} // namespace OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace OpenScenarioEngine::v1_3 diff --git a/engine/src/Conversion/OscToMantle/ConvertScenarioRoute.h b/engine/src/Conversion/OscToMantle/ConvertScenarioRoute.h index 8d01b5777258554acd79bf0709a9802687ea997f..80745cca8ff5ef908ffc5a0d989df763e70ea4fc 100644 --- a/engine/src/Conversion/OscToMantle/ConvertScenarioRoute.h +++ b/engine/src/Conversion/OscToMantle/ConvertScenarioRoute.h @@ -1,6 +1,5 @@ - /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -22,12 +21,13 @@ namespace OpenScenarioEngine::v1_3 { struct Route { + std::string name; bool closed{false}; - std::vector<mantle_api::RouteWaypoint> waypoints; + std::vector<mantle_api::RoutingWaypoint> waypoints; }; Route ConvertScenarioRoute(const std::shared_ptr<mantle_api::IEnvironment>& environment, std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::IRoute> route, const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::ICatalogReference>& catalogReference); -} // namespace OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace OpenScenarioEngine::v1_3 diff --git a/engine/src/Conversion/OscToMantle/ConvertScenarioSpeedActionTarget.cpp b/engine/src/Conversion/OscToMantle/ConvertScenarioSpeedActionTarget.cpp index f490b444f8c88a485b5c697f161acc88a95f6573..28dc8433d43a9169365c46058aada69485ef5c95 100644 --- a/engine/src/Conversion/OscToMantle/ConvertScenarioSpeedActionTarget.cpp +++ b/engine/src/Conversion/OscToMantle/ConvertScenarioSpeedActionTarget.cpp @@ -1,6 +1,5 @@ - /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -27,9 +26,10 @@ SpeedActionTarget ConvertScenarioSpeedActionTarget( if (relative_target_speed) { /// TODO: continuous need to be taken into consideration at some point as well - const auto &relative_entity_name = relative_target_speed->GetEntityRef()->GetNameRef(); + const auto& relative_entity_name = relative_target_speed->GetEntityRef()->GetNameRef(); - if (!environment->GetEntityRepository().Get(relative_entity_name).has_value()) + auto entity = environment->GetEntityRepository().Get(relative_entity_name).lock(); + if (!entity) { throw std::runtime_error( "Relative Entity with name \"" + relative_entity_name + @@ -37,7 +37,7 @@ SpeedActionTarget ConvertScenarioSpeedActionTarget( "scenario."); } - auto target_base = environment->GetEntityRepository().Get(relative_entity_name).value().get().GetVelocity(); + auto target_base = entity->GetVelocity(); units::velocity::meters_per_second_t base_magnitude{target_base.Length()}; if (relative_target_speed->GetSpeedTargetValueType() == @@ -55,4 +55,4 @@ SpeedActionTarget ConvertScenarioSpeedActionTarget( throw std::runtime_error("speedActionTarget needs to have either Relative or Absolute target speed"); } -} // namespace OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace OpenScenarioEngine::v1_3 diff --git a/engine/src/Conversion/OscToMantle/ConvertScenarioTrafficDefinition.cpp b/engine/src/Conversion/OscToMantle/ConvertScenarioTrafficDefinition.cpp index c871ea97fc191d83bdb2bb04cf8de22b88d90402..140ca4db5b5ee97fdc0d9f24bbc97372a08496e4 100644 --- a/engine/src/Conversion/OscToMantle/ConvertScenarioTrafficDefinition.cpp +++ b/engine/src/Conversion/OscToMantle/ConvertScenarioTrafficDefinition.cpp @@ -1,6 +1,5 @@ - /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -10,6 +9,7 @@ ********************************************************************************/ #include "Conversion/OscToMantle/ConvertScenarioTrafficDefinition.h" + #include "Conversion/OscToMantle/ConvertScenarioController.h" namespace OpenScenarioEngine::v1_3 @@ -23,20 +23,20 @@ mantle_api::VehicleClass ConvertVehicleCategory(NET_ASAM_OPENSCENARIO::v1_3::Veh const auto literal{vehicle_category.GetLiteral()}; const auto category{vehicle_category.GetFromLiteral(literal)}; - switch(category) + switch (category) { case NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VehicleCategoryEnum::UNKNOWN: - return mantle_api::VehicleClass::kInvalid; + return mantle_api::VehicleClass::kUnknown; case NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VehicleCategoryEnum::BICYCLE: return mantle_api::VehicleClass::kBicycle; case NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VehicleCategoryEnum::BUS: return mantle_api::VehicleClass::kBus; case NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VehicleCategoryEnum::CAR: - return mantle_api::VehicleClass::kMedium_car; + return mantle_api::VehicleClass::kMediumCar; case NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VehicleCategoryEnum::MOTORBIKE: - return mantle_api::VehicleClass::kMotorbike; + return mantle_api::VehicleClass::kMotorcycle; case NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VehicleCategoryEnum::SEMITRAILER: - return mantle_api::VehicleClass::kSemitrailer; + return mantle_api::VehicleClass::kSemiTrailer; case NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VehicleCategoryEnum::TRAILER: return mantle_api::VehicleClass::kTrailer; case NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VehicleCategoryEnum::TRAIN: @@ -44,11 +44,11 @@ mantle_api::VehicleClass ConvertVehicleCategory(NET_ASAM_OPENSCENARIO::v1_3::Veh case NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VehicleCategoryEnum::TRAM: return mantle_api::VehicleClass::kTram; case NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VehicleCategoryEnum::TRUCK: - return mantle_api::VehicleClass::kHeavy_truck; + return mantle_api::VehicleClass::kHeavyTruck; case NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VehicleCategoryEnum::VAN: - return mantle_api::VehicleClass::kDelivery_van; + return mantle_api::VehicleClass::kDeliveryVan; default: - return mantle_api::VehicleClass::kInvalid; + return mantle_api::VehicleClass::kOther; } } @@ -56,12 +56,12 @@ VehicleCategoryDistribution ConvertVehicleCategoryDistributionEntry(std::shared_ { VehicleCategoryDistribution vehicle_category_distribution{}; - if(entry->IsSetCategory()) + if (entry->IsSetCategory()) { vehicle_category_distribution.category = ConvertVehicleCategory(entry->GetCategory()); } - if(entry->IsSetWeight()) + if (entry->IsSetWeight()) { vehicle_category_distribution.weight = entry->GetWeight(); } @@ -73,33 +73,33 @@ ControllerDistribution ConvertControllerDistributionEntry(std::shared_ptr<NET_AS { ControllerDistribution controller_distribution{}; - if(entry->IsSetWeight()) + if (entry->IsSetWeight()) { controller_distribution.weight = entry->GetWeight(); } controller_distribution.controller = ConvertScenarioController(entry->GetController(), entry->GetCatalogReference()); - + return controller_distribution; } -} // namespace detail +} // namespace detail TrafficDefinition ConvertScenarioTrafficDefinition(const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::ITrafficDefinition>& osc_traffic_definition) { - if(osc_traffic_definition->GetVehicleCategoryDistribution()->GetVehicleCategoryDistributionEntries().empty()) + if (osc_traffic_definition->GetVehicleCategoryDistribution()->GetVehicleCategoryDistributionEntries().empty()) { throw std::runtime_error("ConvertScenarioTrafficDefinition : the traffic definition has no vehicle distribution"); } - if(osc_traffic_definition->GetControllerDistribution()->GetControllerDistributionEntries().empty()) + if (osc_traffic_definition->GetControllerDistribution()->GetControllerDistributionEntries().empty()) { throw std::runtime_error("ConvertScenarioTrafficDefinition : the traffic definition has no controller distribution"); } std::vector<VehicleCategoryDistribution> vehicle_category_distribution_entries; - for(const auto& vehicle_category_distribution_entry : osc_traffic_definition->GetVehicleCategoryDistribution()->GetVehicleCategoryDistributionEntries()) + for (const auto& vehicle_category_distribution_entry : osc_traffic_definition->GetVehicleCategoryDistribution()->GetVehicleCategoryDistributionEntries()) { auto converted{detail::ConvertVehicleCategoryDistributionEntry(vehicle_category_distribution_entry)}; vehicle_category_distribution_entries.push_back(std::move(converted)); @@ -107,7 +107,7 @@ TrafficDefinition ConvertScenarioTrafficDefinition(const std::shared_ptr<NET_ASA std::vector<ControllerDistribution> controller_distribution_entries; - for(const auto& controller_distribution_entry : osc_traffic_definition->GetControllerDistribution()->GetControllerDistributionEntries()) + for (const auto& controller_distribution_entry : osc_traffic_definition->GetControllerDistribution()->GetControllerDistributionEntries()) { auto converted{detail::ConvertControllerDistributionEntry(controller_distribution_entry)}; controller_distribution_entries.push_back(std::move(converted)); @@ -116,4 +116,4 @@ TrafficDefinition ConvertScenarioTrafficDefinition(const std::shared_ptr<NET_ASA return {osc_traffic_definition->GetName(), vehicle_category_distribution_entries, controller_distribution_entries}; } -} // namespace OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace OpenScenarioEngine::v1_3 diff --git a/engine/src/OpenScenarioEngine.cpp b/engine/src/OpenScenarioEngine.cpp index 76bd104dbbcfb3e116c90c64e42b95c0062dd992..d15b30dd18b54c3ecde6b3c106747fa7ba087a58 100644 --- a/engine/src/OpenScenarioEngine.cpp +++ b/engine/src/OpenScenarioEngine.cpp @@ -154,6 +154,7 @@ void OpenScenarioEngine::Init() void OpenScenarioEngine::SetupDynamicContent() { ResetStochastics(); + ResetRoutes(); ResetAndCreateEntities(); ResetAndCreateControllers(); ResetAndCreateStoryboard(); @@ -319,6 +320,11 @@ std::unique_ptr<mantle_api::MapDetails> OpenScenarioEngine::GetMapDetails() cons return map_details; } +void OpenScenarioEngine::ResetRoutes() +{ + environment_->GetRouteRepository().Reset(); +} + void OpenScenarioEngine::ResetAndCreateEntities() { if (!scenario_definition_ptr_->GetEntities()) diff --git a/engine/src/Storyboard/ByEntityCondition/DistanceCondition_impl.cpp b/engine/src/Storyboard/ByEntityCondition/DistanceCondition_impl.cpp index 5582e59b4538a8f0b452343afb5fdfdb8ab3cebd..98ee3d94d4c696de7065cb8f6b87ee88ba75b607 100644 --- a/engine/src/Storyboard/ByEntityCondition/DistanceCondition_impl.cpp +++ b/engine/src/Storyboard/ByEntityCondition/DistanceCondition_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -62,9 +62,9 @@ bool DistanceCondition::IsSatisfied() const if (values.relativeDistanceType == RelativeDistanceType::kLongitudinal && values.coordinateSystem == CoordinateSystem::kEntity) { - const auto& triggeringEntity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); + const auto triggeringEntity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); const auto distance = EntityUtils::CalculateRelativeLongitudinalDistance( - mantle.environment, triggeringEntity, pose.value().position); + mantle.environment, *triggeringEntity, pose.value().position); return values.rule.IsSatisfied(distance.value()); } diff --git a/engine/src/Storyboard/ByEntityCondition/ReachPositionCondition_impl.cpp b/engine/src/Storyboard/ByEntityCondition/ReachPositionCondition_impl.cpp index a5de60868897762e94e5474d0916ae6630099fc9..ac33311b08c25bafeb76d78109e7c738a76a36e6 100644 --- a/engine/src/Storyboard/ByEntityCondition/ReachPositionCondition_impl.cpp +++ b/engine/src/Storyboard/ByEntityCondition/ReachPositionCondition_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -25,15 +25,15 @@ bool ReachPositionCondition::IsSatisfied() const return false; } - const auto& entity = mantle.environment->GetEntityRepository().Get(values.triggeringEntity); + auto entity = mantle.environment->GetEntityRepository().Get(values.triggeringEntity).lock(); if (!entity) { Logger::Warning("ReachPositionCondition: ReachPositionCondition cannot be satisfied (entity undefined)."); return false; } - auto current_position = entity->get().GetPosition(); + auto current_position = entity->GetPosition(); return (position->position - current_position).Length().value() <= values.tolerance; } -} // namespace OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace OpenScenarioEngine::v1_3 diff --git a/engine/src/Storyboard/ByEntityCondition/RelativeDistanceCondition_impl.cpp b/engine/src/Storyboard/ByEntityCondition/RelativeDistanceCondition_impl.cpp index 33cbb81efb591e7f49aada16131fb6431b58951a..ff46fc4bc5e22075188c96756d5314b39076872a 100644 --- a/engine/src/Storyboard/ByEntityCondition/RelativeDistanceCondition_impl.cpp +++ b/engine/src/Storyboard/ByEntityCondition/RelativeDistanceCondition_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -20,23 +20,23 @@ bool RelativeDistanceCondition::IsSatisfied() const { if (values.coordinateSystem == CoordinateSystem::kEntity) { - const auto& triggeringEntity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); - const auto& referencedEntity = EntityUtils::GetEntityByName(mantle.environment, values.entityRef); + const auto triggeringEntity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); + const auto referencedEntity = EntityUtils::GetEntityByName(mantle.environment, values.entityRef); if (values.relativeDistanceType == RelativeDistanceType::kLongitudinal) { const auto distance = values.freespace ? EntityUtils::CalculateLongitudinalFreeSpaceDistance( - mantle.environment, triggeringEntity, referencedEntity) + mantle.environment, *triggeringEntity, *referencedEntity) : EntityUtils::CalculateRelativeLongitudinalDistance( - mantle.environment, triggeringEntity, referencedEntity); + mantle.environment, *triggeringEntity, *referencedEntity); return values.rule.IsSatisfied(distance.value()); } if (values.relativeDistanceType == RelativeDistanceType::kLateral && values.freespace) { const auto distance = EntityUtils::CalculateLateralFreeSpaceDistance( - mantle.environment, triggeringEntity, referencedEntity); + mantle.environment, *triggeringEntity, *referencedEntity); return values.rule.IsSatisfied(distance.value()); } } diff --git a/engine/src/Storyboard/ByEntityCondition/RelativeSpeedCondition_impl.cpp b/engine/src/Storyboard/ByEntityCondition/RelativeSpeedCondition_impl.cpp index f2084a483aabc9f8dae36babe5fc336302271e42..c2a0646684bd84915dcb08df6319a4ec2fd4118d 100644 --- a/engine/src/Storyboard/ByEntityCondition/RelativeSpeedCondition_impl.cpp +++ b/engine/src/Storyboard/ByEntityCondition/RelativeSpeedCondition_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -16,14 +16,14 @@ namespace OpenScenarioEngine::v1_3 { bool RelativeSpeedCondition::IsSatisfied() const { - const auto& triggeringEntity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); - const auto triggeringVelocity = triggeringEntity.GetVelocity().Length(); + const auto triggeringEntity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); + const auto triggeringVelocity = triggeringEntity->GetVelocity().Length(); - const auto& referencedEntity = EntityUtils::GetEntityByName(mantle.environment, values.entityRef); - const auto referencedVelocity = referencedEntity.GetVelocity().Length(); + const auto referencedEntity = EntityUtils::GetEntityByName(mantle.environment, values.entityRef); + const auto referencedVelocity = referencedEntity->GetVelocity().Length(); const auto relativeSpeed = triggeringVelocity - referencedVelocity; return values.rule.IsSatisfied(relativeSpeed.value()); } -} // namespace OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace OpenScenarioEngine::v1_3 diff --git a/engine/src/Storyboard/ByEntityCondition/SpeedCondition_impl.cpp b/engine/src/Storyboard/ByEntityCondition/SpeedCondition_impl.cpp index 59048e5326e70bcf133bbb75325cf6e6dc364bfb..deedd88ea0e6b99d37aac43d5a7c62a45503677c 100644 --- a/engine/src/Storyboard/ByEntityCondition/SpeedCondition_impl.cpp +++ b/engine/src/Storyboard/ByEntityCondition/SpeedCondition_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -16,8 +16,8 @@ namespace OpenScenarioEngine::v1_3 { bool SpeedCondition::IsSatisfied() const { - const auto& triggeringEntity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); - const auto speed = triggeringEntity.GetVelocity().Length(); + const auto triggeringEntity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); + const auto speed = triggeringEntity->GetVelocity().Length(); return values.rule.IsSatisfied(speed.value()); } diff --git a/engine/src/Storyboard/ByEntityCondition/TimeHeadwayCondition_impl.cpp b/engine/src/Storyboard/ByEntityCondition/TimeHeadwayCondition_impl.cpp index 4aa696516bd1cb8af0119a46ee84dc1dbb7f7834..24b9bfbfa458083e09d4d58129941dc5ae27d513 100644 --- a/engine/src/Storyboard/ByEntityCondition/TimeHeadwayCondition_impl.cpp +++ b/engine/src/Storyboard/ByEntityCondition/TimeHeadwayCondition_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -31,21 +31,21 @@ bool TimeHeadwayCondition::IsSatisfied() const return false; } - const auto& ref_entity = EntityUtils::GetEntityByName(mantle.environment, values.entityRef); - const auto& trigger_entity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); + const auto ref_entity = EntityUtils::GetEntityByName(mantle.environment, values.entityRef); + const auto trigger_entity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); units::length::meter_t distance{}; if (values.coordinateSystem == CoordinateSystem::kEntity) { distance = values.freespace - ? EntityUtils::CalculateLongitudinalFreeSpaceDistance(mantle.environment, trigger_entity, ref_entity) - : EntityUtils::CalculateRelativeLongitudinalDistance(mantle.environment, trigger_entity, ref_entity); + ? EntityUtils::CalculateLongitudinalFreeSpaceDistance(mantle.environment, *trigger_entity, *ref_entity) + : EntityUtils::CalculateRelativeLongitudinalDistance(mantle.environment, *trigger_entity, *ref_entity); } else if (values.coordinateSystem == CoordinateSystem::kLane) { const auto longitudinal_lane_distance = - mantle.environment->GetQueryService().GetLongitudinalLaneDistanceBetweenPositions(trigger_entity.GetPosition(), - ref_entity.GetPosition()); + mantle.environment->GetQueryService().GetLongitudinalLaneDistanceBetweenPositions(trigger_entity->GetPosition(), + ref_entity->GetPosition()); if (!longitudinal_lane_distance.has_value()) { throw std::runtime_error( @@ -57,18 +57,18 @@ bool TimeHeadwayCondition::IsSatisfied() const if (values.freespace) { const auto trigger_entity_lane_orientation = - mantle.environment->GetQueryService().GetLaneOrientation(trigger_entity.GetPosition()); + mantle.environment->GetQueryService().GetLaneOrientation(trigger_entity->GetPosition()); const auto trigger_entity_corners_along_lane = EntityUtils::GetCornerPositionsInLocalSortedByLongitudinalDistance( - mantle.environment, trigger_entity, trigger_entity.GetPosition(), trigger_entity_lane_orientation); + mantle.environment, *trigger_entity, trigger_entity->GetPosition(), trigger_entity_lane_orientation); const auto ref_entity_lane_pose = mantle.environment->GetQueryService().FindLanePoseAtDistanceFrom( - {trigger_entity.GetPosition(), trigger_entity.GetOrientation()}, + {trigger_entity->GetPosition(), trigger_entity->GetOrientation()}, distance, mantle_api::Direction::kForward); const auto ref_entity_corners_along_lane = EntityUtils::GetCornerPositionsInLocalSortedByLongitudinalDistance( - mantle.environment, ref_entity, ref_entity.GetPosition(), ref_entity_lane_pose.value().orientation); + mantle.environment, *ref_entity, ref_entity->GetPosition(), ref_entity_lane_pose.value().orientation); distance = distance - (units::math::abs(trigger_entity_corners_along_lane.front().x) + units::math::abs(ref_entity_corners_along_lane.back().x)); @@ -80,7 +80,7 @@ bool TimeHeadwayCondition::IsSatisfied() const throw std::runtime_error("TimeHeadwayCondition: The given CoordinateSystem is not supported. Only \"entity\" and \"lane\" coordinate systems are supported for now."); } - const auto trigger_entity_velocity = trigger_entity.GetVelocity().Length(); + const auto trigger_entity_velocity = trigger_entity->GetVelocity().Length(); const auto time_headway = trigger_entity_velocity > limits::kAcceptableVelocityMin ? distance / trigger_entity_velocity : limits::kTimeHeadwayMax; diff --git a/engine/src/Storyboard/ByEntityCondition/TimeToCollisionCondition_impl.cpp b/engine/src/Storyboard/ByEntityCondition/TimeToCollisionCondition_impl.cpp index 6cbea0fe8b903cca724d68ddca888adf862e6dd9..bdd08568cf0948bae31b88665f58579d09bb60cd 100644 --- a/engine/src/Storyboard/ByEntityCondition/TimeToCollisionCondition_impl.cpp +++ b/engine/src/Storyboard/ByEntityCondition/TimeToCollisionCondition_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -47,9 +47,9 @@ units::time::second_t TTCCalculation::operator()(const std::optional<mantle_api: bool TimeToCollisionCondition::IsSatisfied() const { - const auto& triggeringEntity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); + const auto triggeringEntity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); const auto ttc = std::visit( - TTCCalculation(mantle.environment, triggeringEntity), + TTCCalculation(mantle.environment, *triggeringEntity), values.timeToCollisionConditionTarget); return values.rule.IsSatisfied(ttc.value()); } diff --git a/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp b/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp index 11e1a10b1615575dcf64ac895702726b318a3837..1e6e35aff7db2334b4bd8bb13db4892c6fb0d17d 100644 --- a/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp +++ b/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2025 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -19,9 +19,9 @@ namespace OpenScenarioEngine::v1_3 bool TraveledDistanceCondition::IsSatisfied() { - const auto& entity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); + const auto entity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity); - auto current_position = entity.GetPosition(); + auto current_position = entity->GetPosition(); if (!last_position_.has_value()) { diff --git a/engine/src/Storyboard/GenericAction/AcquirePositionAction_impl.cpp b/engine/src/Storyboard/GenericAction/AcquirePositionAction_impl.cpp index 2c38bb5aea8981949154f2d55f3076b5542debd4..3445be9fd02f380e54975bddc1d7ada1e5a97c27 100644 --- a/engine/src/Storyboard/GenericAction/AcquirePositionAction_impl.cpp +++ b/engine/src/Storyboard/GenericAction/AcquirePositionAction_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -20,39 +20,25 @@ namespace OpenScenarioEngine::v1_3 { -namespace detail -{ -mantle_api::RouteDefinition GenerateRouteDefinition( - const std::shared_ptr<mantle_api::IEnvironment>& environment, - std::string&& entity_name, - mantle_api::Vec3<units::length::meter_t>&& position) -{ - const auto& entity = EntityUtils::GetEntityByName(environment, entity_name); - const auto& current_pos = entity.GetPosition(); - - return {{{std::move(current_pos), mantle_api::RouteStrategy::kShortest}, - {std::move(position), mantle_api::RouteStrategy::kShortest}}}; -} -} // namespace detail - bool AcquirePositionAction::Step() { const auto position = values.GetPosition(); if (!position) { - throw std::runtime_error("AcquirePositionAction: Target position has no value (potentially outside of world)."); + throw std::runtime_error("AcquirePositionAction: Target position has no value (potentially outside of road)."); } for (const auto& actor : values.entities) { - const auto& entity = EntityUtils::GetEntityByName(mantle.environment, actor); - const auto& current_pos = entity.GetPosition(); + auto entity = EntityUtils::GetEntityByName(mantle.environment, actor); + const auto& current_pos = entity->GetPosition(); - mantle_api::RouteDefinition route_definition{ - {{std::move(current_pos), mantle_api::RouteStrategy::kShortest}, - {std::move(position->position), mantle_api::RouteStrategy::kShortest}}}; + mantle_api::RoutingDefinition routing_definition{ + {{std::move(current_pos), mantle_api::RoutingStrategy::kShortest}, + {std::move(position->position), mantle_api::RoutingStrategy::kShortest}}}; - mantle.environment->AssignRoute(entity.GetUniqueId(), route_definition); + auto route = mantle.environment->GetRouteRepository().Create(entity->GetName(), routing_definition); + entity->SetRoute(route); } return true; } diff --git a/engine/src/Storyboard/GenericAction/ActivateControllerAction_impl.cpp b/engine/src/Storyboard/GenericAction/ActivateControllerAction_impl.cpp index 92d6399a9f5f17f99a4141f4230f75d68fea1c25..909ef1370f9b6c48968d1ce251cb9902c7a485a9 100644 --- a/engine/src/Storyboard/GenericAction/ActivateControllerAction_impl.cpp +++ b/engine/src/Storyboard/GenericAction/ActivateControllerAction_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -24,9 +24,9 @@ bool ActivateControllerAction::Step() { // entities might have been despawned, leading to a dangling reference to the controllers // so we check if the entity is still part of the simulation, before we access the controllers - if (auto entity_ref = entity_repository.Get(entity_name)) + if (auto entity = entity_repository.Get(entity_name).lock()) { - const auto entity_id = entity_ref->get().GetUniqueId(); + const auto entity_id = entity->GetUniqueId(); if (const auto& entity_controllers = ose_services.controllerService->GetControllers(entity_id)) { auto controller_id = ose_services.controllerService->GetControllerId( diff --git a/engine/src/Storyboard/GenericAction/AssignControllerAction_impl.cpp b/engine/src/Storyboard/GenericAction/AssignControllerAction_impl.cpp index 8b43a9bedc14a91020824b48c23e2a4931df6ed0..a151ce84c2fb0dfa68220598a8f1d79a32729dc6 100644 --- a/engine/src/Storyboard/GenericAction/AssignControllerAction_impl.cpp +++ b/engine/src/Storyboard/GenericAction/AssignControllerAction_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -19,12 +19,12 @@ bool AssignControllerAction::Step() for (const auto& entity_name : values.entities) { // TODO: How do we incorporate Longitudinal and Lateral here? - auto& entity = EntityUtils::GetEntityByName(mantle.environment, entity_name); - auto& controller = mantle.environment->GetControllerRepository().Create( + auto entity = EntityUtils::GetEntityByName(mantle.environment, entity_name); + auto controller = mantle.environment->GetControllerRepository().Create( std::make_unique<mantle_api::ExternalControllerConfig>(values.controller)); - mantle.environment->AddEntityToController(entity, controller.GetUniqueId()); + mantle.environment->AddEntityToController(*entity, controller.lock()->GetUniqueId()); } return true; } -} // namespace OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace OpenScenarioEngine::v1_3 diff --git a/engine/src/Storyboard/GenericAction/AssignRouteAction_impl.cpp b/engine/src/Storyboard/GenericAction/AssignRouteAction_impl.cpp index 083c3716a62f308c6df8429aedbc6605f1efe3a9..4cbd93f39288c694e1e47e9e0464e502338bb096 100644 --- a/engine/src/Storyboard/GenericAction/AssignRouteAction_impl.cpp +++ b/engine/src/Storyboard/GenericAction/AssignRouteAction_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -19,15 +19,11 @@ namespace OpenScenarioEngine::v1_3 { bool AssignRouteAction::Step() { - if (values.route.closed) - { - Logger::Error("AssignRouteAction: Closed routes not supported yet"); - } - for (const auto& actor : values.entities) { - const auto& entity = EntityUtils::GetEntityByName(mantle.environment, actor); - mantle.environment->AssignRoute(entity.GetUniqueId(), {values.route.waypoints}); + auto entity = EntityUtils::GetEntityByName(mantle.environment, actor); + auto route = mantle.environment->GetRouteRepository().Create(values.route.name, {values.route.waypoints, values.route.closed}); + entity->SetRoute(route); } return true; } diff --git a/engine/src/Storyboard/GenericAction/LightStateAction_impl.cpp b/engine/src/Storyboard/GenericAction/LightStateAction_impl.cpp index e993a670c377e3961a1b5fe6266f3baf529650b1..5b50aa1e02235c6358dafc7b6f3c1edd14483efd 100644 --- a/engine/src/Storyboard/GenericAction/LightStateAction_impl.cpp +++ b/engine/src/Storyboard/GenericAction/LightStateAction_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -28,9 +28,9 @@ void LightStateAction::SetControlStrategy() control_strategy_->light_state = values.lightState; for (const auto& actor : values.entities) { - auto& entity = EntityUtils::GetEntityByName(mantle.environment, actor); + auto entity = EntityUtils::GetEntityByName(mantle.environment, actor); mantle.environment->UpdateControlStrategies( - entity.GetUniqueId(), + entity->GetUniqueId(), {control_strategy_}); } } diff --git a/engine/src/Storyboard/GenericAction/TeleportAction_impl.cpp b/engine/src/Storyboard/GenericAction/TeleportAction_impl.cpp index 9fd0d6255dcfc8f52f32a0c61f0a5ed08ffbf0c0..3787cbc27d6f1ade08a860ba95890d69ea812f68 100644 --- a/engine/src/Storyboard/GenericAction/TeleportAction_impl.cpp +++ b/engine/src/Storyboard/GenericAction/TeleportAction_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2022 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -11,6 +11,7 @@ #include "Storyboard/GenericAction/TeleportAction_impl.h" +#include "Utils/EntityUtils.h" #include "Utils/Logger.h" namespace OpenScenarioEngine::v1_3 @@ -26,19 +27,13 @@ bool TeleportAction::Step() for (auto actor : values.entities) { - auto entity_tmp = mantle.environment->GetEntityRepository().Get(actor); + auto entity = EntityUtils::GetEntityByName(mantle.environment, actor); - if (!entity_tmp.has_value()) - { - throw std::runtime_error("Actor '" + actor + "' in TeleportAction does not exist. Please adjust scenario."); - } - - mantle_api::IEntity &entity = mantle.environment->GetEntityRepository().Get(actor).value().get(); auto position = mantle.environment->GetGeometryHelper()->TranslateGlobalPositionLocally( global_position->position, global_position->orientation, - entity.GetProperties()->bounding_box.geometric_center); - if (const auto properties = dynamic_cast<mantle_api::StaticObjectProperties *>(entity.GetProperties())) + entity->GetProperties()->bounding_box.geometric_center); + if (const auto properties = dynamic_cast<mantle_api::StaticObjectProperties*>(entity->GetProperties())) { position = mantle.environment->GetQueryService().GetUpwardsShiftedLanePosition(position, properties->vertical_offset(), true); @@ -49,8 +44,8 @@ bool TeleportAction::Step() // This method calculates the position of supplementary signs based on the main sign's orientation. // Therefore, the main sign's orientation must be set first to ensure correct supplementary sign positioning. // Refer to issue https://gitlab.eclipse.org/eclipse/openpass/gt-gen-core/-/issues/21 for more details. - entity.SetOrientation(global_position->orientation); - entity.SetPosition(position); + entity->SetOrientation(global_position->orientation); + entity->SetPosition(position); } return true; } diff --git a/engine/src/Storyboard/GenericAction/TrafficSinkAction_impl.cpp b/engine/src/Storyboard/GenericAction/TrafficSinkAction_impl.cpp index 3a9f6799b3ac4b6e017396e01a2575872224de8d..2c914f6b48964dc72619a43e282b634775835774 100644 --- a/engine/src/Storyboard/GenericAction/TrafficSinkAction_impl.cpp +++ b/engine/src/Storyboard/GenericAction/TrafficSinkAction_impl.cpp @@ -36,7 +36,7 @@ static constexpr double EPSILON_RADIUS{1E-3}; return (target_position - current_position).Length().value() <= radius + EPSILON_RADIUS; } -[[nodiscard]] bool IsVehicleOrPedestrian(const std::unique_ptr<mantle_api::IEntity>& entity) +[[nodiscard]] bool IsVehicleOrPedestrian(const std::shared_ptr<mantle_api::IEntity>& entity) { return dynamic_cast<mantle_api::IVehicle*>(entity.get()) || dynamic_cast<mantle_api::IPedestrian*>(entity.get()); @@ -133,8 +133,9 @@ bool TrafficSinkAction::Step() std::vector<mantle_api::UniqueId> affected_entity_ids; auto& entity_repository = mantle_.environment->GetEntityRepository(); - for (const auto& entity : entity_repository.GetEntities()) + for (const auto& entity_wp : entity_repository.GetEntities()) { + auto entity = entity_wp.lock(); if (detail::IsVehicleOrPedestrian(entity) && detail::WithinRadius(entity->GetPosition(), position.value(), values_.radius)) { diff --git a/engine/src/Storyboard/GenericAction/TrafficSwarmAction_impl.cpp b/engine/src/Storyboard/GenericAction/TrafficSwarmAction_impl.cpp index 16deb16a337f49cc38b86a9824d2d0ffee0ee849..56b7eece1e7336efc473fad849eb80f7fc6e2c42 100644 --- a/engine/src/Storyboard/GenericAction/TrafficSwarmAction_impl.cpp +++ b/engine/src/Storyboard/GenericAction/TrafficSwarmAction_impl.cpp @@ -148,8 +148,8 @@ bool TrafficSwarmAction::Step() mantle_api::Pose TrafficSwarmAction::GetSpawningAreaPose() const { mantle_api::Pose spawning_area_pose; - spawning_area_pose.position = central_entity_.GetPosition(); - spawning_area_pose.orientation = central_entity_.GetOrientation(); + spawning_area_pose.position = central_entity_->GetPosition(); + spawning_area_pose.orientation = central_entity_->GetOrientation(); if (values_.offset > 0.0 || values_.offset < 0.0) { @@ -184,7 +184,7 @@ void TrafficSwarmAction::DespawnEntities() for (size_t i{0}; i < entity_and_controller_id_list_.size(); ++i) { const auto entity_iterator{std::find_if(entities.cbegin(), entities.cend(), [this, &i](auto& entity) - { return entity_and_controller_id_list_.at(i).first == entity->GetUniqueId(); })}; + { return entity_and_controller_id_list_.at(i).first == entity.lock()->GetUniqueId(); })}; if (entity_iterator == std::end(entities)) { @@ -192,7 +192,7 @@ void TrafficSwarmAction::DespawnEntities() continue; } - const bool entity_is_outside_spawning_area{IsPointOutsideOfEllipse(entity_iterator.base()->get()->GetPosition(), + const bool entity_is_outside_spawning_area{IsPointOutsideOfEllipse(entity_iterator.base()->lock()->GetPosition(), spawning_area_pose.position, units::length::meter_t(values_.semiMajorAxis), units::length::meter_t(values_.semiMinorAxis), @@ -226,7 +226,7 @@ units::velocity::meters_per_second_t TrafficSwarmAction::GetSpawnedVehicleSpeed( void TrafficSwarmAction::SpawnEntities() { const auto speed_range{values_.initialSpeedRange.value()}; - const auto central_entity_speed{central_entity_.GetVelocity().Length().value()}; + const auto central_entity_speed{central_entity_->GetVelocity().Length().value()}; const auto spawning_positions{mantle_.environment->GetTrafficSwarmService().GetAvailableSpawningPoses()}; for (const auto& [spawning_pose, relative_position] : spawning_positions) @@ -235,20 +235,20 @@ void TrafficSwarmAction::SpawnEntities() const auto vehicle_properties{mantle_.environment->GetTrafficSwarmService().GetVehicleProperties(vehicle_classification)}; const auto vehicle_speed{GetSpawnedVehicleSpeed(relative_position, central_entity_speed, speed_range.lowerLimit, speed_range.upperLimit)}; - auto& entity{mantle_.environment->GetEntityRepository().Create("traffic-swarm-entity-" + std::to_string(spawned_entities_count_ + 1), vehicle_properties)}; - entity.SetPosition(spawning_pose.position); - entity.SetOrientation(spawning_pose.orientation); - entity.SetVelocity(detail::GetVelocityVector(vehicle_speed, spawning_pose.orientation)); + auto entity{mantle_.environment->GetEntityRepository().Create("traffic-swarm-entity-" + std::to_string(spawned_entities_count_ + 1), vehicle_properties).lock()}; + entity->SetPosition(spawning_pose.position); + entity->SetOrientation(spawning_pose.orientation); + entity->SetVelocity(detail::GetVelocityVector(vehicle_speed, spawning_pose.orientation)); const auto controller_configuration{GetControllerConfiguration()}; auto external_controller_config{std::make_unique<mantle_api::ExternalControllerConfig>(controller_configuration)}; mantle_.environment->GetTrafficSwarmService().UpdateControllerConfig(external_controller_config, vehicle_speed); - auto& controller{mantle_.environment->GetControllerRepository().Create(std::move(external_controller_config))}; - controller.ChangeState(mantle_api::IController::LateralState::kActivate, mantle_api::IController::LongitudinalState::kActivate); + auto controller{mantle_.environment->GetControllerRepository().Create(std::move(external_controller_config)).lock()}; + controller->ChangeState(mantle_api::IController::LateralState::kActivate, mantle_api::IController::LongitudinalState::kActivate); - mantle_.environment->AddEntityToController(entity, controller.GetUniqueId()); + mantle_.environment->AddEntityToController(*entity, controller->GetUniqueId()); - entity_and_controller_id_list_.push_back({entity.GetUniqueId(), controller.GetUniqueId()}); + entity_and_controller_id_list_.push_back({entity->GetUniqueId(), controller->GetUniqueId()}); spawned_entities_count_++; } diff --git a/engine/src/Storyboard/GenericAction/TrafficSwarmAction_impl.h b/engine/src/Storyboard/GenericAction/TrafficSwarmAction_impl.h index f57a15592eeb956b0034abda5225fc4e816aca20..3e8bbb89b4fce310460b1208bdad29df0e8a7c50 100644 --- a/engine/src/Storyboard/GenericAction/TrafficSwarmAction_impl.h +++ b/engine/src/Storyboard/GenericAction/TrafficSwarmAction_impl.h @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -37,9 +37,9 @@ private: double vehicle_category_distribution_weights_sum_{0.0}; double controller_distribution_weights_sum_{0.0}; - mantle_api::IEntity& central_entity_; + std::shared_ptr<mantle_api::IEntity> central_entity_; size_t spawned_entities_count_{0}; std::vector<std::pair<mantle_api::UniqueId, mantle_api::UniqueId>> entity_and_controller_id_list_; }; -} // namespace OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace OpenScenarioEngine::v1_3 diff --git a/engine/src/Storyboard/GenericAction/VisibilityAction_impl.cpp b/engine/src/Storyboard/GenericAction/VisibilityAction_impl.cpp index 1e97c5eda96875d24bba6abda17394101cf2ad75..bcf067bdddeb761b8aab1580cce62c22d2c6333e 100644 --- a/engine/src/Storyboard/GenericAction/VisibilityAction_impl.cpp +++ b/engine/src/Storyboard/GenericAction/VisibilityAction_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -18,9 +18,9 @@ bool VisibilityAction::Step() { for (const auto& entity : values.entities) { - auto& entityRef = EntityUtils::GetEntityByName(mantle.environment, entity); + auto entityRef = EntityUtils::GetEntityByName(mantle.environment, entity); mantle_api::EntityVisibilityConfig vis_config{values.graphics, values.traffic, values.sensors, values.sensorReferenceSet}; - entityRef.SetVisibility(vis_config); + entityRef->SetVisibility(vis_config); } return true; } diff --git a/engine/src/Storyboard/MotionControlAction/FollowTrajectoryAction_impl.cpp b/engine/src/Storyboard/MotionControlAction/FollowTrajectoryAction_impl.cpp index 97f3bb412fe6bb1a47e48a2761783fe79843b03a..0f030206d2a5b70af912de36febcc5e0201a1f6c 100644 --- a/engine/src/Storyboard/MotionControlAction/FollowTrajectoryAction_impl.cpp +++ b/engine/src/Storyboard/MotionControlAction/FollowTrajectoryAction_impl.cpp @@ -31,8 +31,8 @@ mantle_api::Trajectory ConvertPolyLine( const std::string& entity, TrajectoryRef trajectoryRef) { - const auto& refEntity = EntityUtils::GetEntityByName(environment, entity); - const auto geometric_center = refEntity.GetProperties()->bounding_box.geometric_center; + const auto refEntity = EntityUtils::GetEntityByName(environment, entity); + const auto geometric_center = refEntity->GetProperties()->bounding_box.geometric_center; // modifies the copy of the trajectory ref! for (auto& polyLinePoint : std::get<mantle_api::PolyLine>(trajectoryRef->type)) @@ -50,8 +50,8 @@ mantle_api::Trajectory ConvertClothoidSpline( const std::string& entity, TrajectoryRef trajectoryRef) { - const auto& refEntity = EntityUtils::GetEntityByName(environment, entity); - const auto geometric_center = refEntity.GetProperties()->bounding_box.geometric_center; + const auto refEntity = EntityUtils::GetEntityByName(environment, entity); + const auto geometric_center = refEntity->GetProperties()->bounding_box.geometric_center; auto& clothoid_spline = std::get<mantle_api::ClothoidSpline>(trajectoryRef->type); @@ -120,17 +120,17 @@ void FollowTrajectoryAction::SetControlStrategy() return; } control_strategy->trajectory = *trajectory; - const auto entity_id = mantle.environment->GetEntityRepository().Get(entity)->get().GetUniqueId(); + const auto entity_id = EntityUtils::GetEntityByName(mantle.environment, entity)->GetUniqueId(); mantle.environment->UpdateControlStrategies(entity_id, {control_strategy}); } } bool FollowTrajectoryAction::HasControlStrategyGoalBeenReached(const std::string& actor) { - if (auto entity = mantle.environment->GetEntityRepository().Get(actor)) + if (auto entity = mantle.environment->GetEntityRepository().Get(actor).lock()) { return mantle.environment->HasControlStrategyGoalBeenReached( - entity.value().get().GetUniqueId(), + entity->GetUniqueId(), mantle_api::ControlStrategyType::kFollowTrajectory); } return false; diff --git a/engine/src/Storyboard/MotionControlAction/LaneChangeAction_impl.cpp b/engine/src/Storyboard/MotionControlAction/LaneChangeAction_impl.cpp index b1a0399da28ca822930c9a4bc209a183f33c7712..0fc1f0856db8f70187b66712af45984291944fba 100644 --- a/engine/src/Storyboard/MotionControlAction/LaneChangeAction_impl.cpp +++ b/engine/src/Storyboard/MotionControlAction/LaneChangeAction_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -24,10 +24,10 @@ void LaneChangeAction::SetControlStrategy() SetupControlStrategy(); for (const auto& actor : values.entities) { - if (auto entity = mantle.environment->GetEntityRepository().Get(actor)) + if (auto entity = mantle.environment->GetEntityRepository().Get(actor).lock()) { mantle.environment->UpdateControlStrategies( - entity.value().get().GetUniqueId(), + entity->GetUniqueId(), {control_strategy_}); } else @@ -40,10 +40,10 @@ void LaneChangeAction::SetControlStrategy() bool LaneChangeAction::HasControlStrategyGoalBeenReached(const std::string& actor) { - if (auto entity = mantle.environment->GetEntityRepository().Get(actor)) + if (auto entity = mantle.environment->GetEntityRepository().Get(actor).lock()) { return mantle.environment->HasControlStrategyGoalBeenReached( - entity.value().get().GetUniqueId(), + entity->GetUniqueId(), control_strategy_->type); } diff --git a/engine/src/Storyboard/MotionControlAction/LaneOffsetAction_impl.cpp b/engine/src/Storyboard/MotionControlAction/LaneOffsetAction_impl.cpp index c3d894024b91e815e8cdb756df9b3aa87489d2f1..319b70af048e0acfa2c2b11ac00c68e6ec894f31 100644 --- a/engine/src/Storyboard/MotionControlAction/LaneOffsetAction_impl.cpp +++ b/engine/src/Storyboard/MotionControlAction/LaneOffsetAction_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2025, Ansys, Inc. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -26,18 +26,18 @@ void LaneOffsetAction::SetControlStrategy() for (const auto& actor : values.entities) { control_strategy_->offset = values.GetLaneOffsetTarget(actor); - auto& entity = EntityUtils::GetEntityByName(mantle.environment, actor); + auto entity = EntityUtils::GetEntityByName(mantle.environment, actor); mantle.environment->UpdateControlStrategies( - entity.GetUniqueId(), + entity->GetUniqueId(), {control_strategy_}); } } bool LaneOffsetAction::HasControlStrategyGoalBeenReached(const std::string& actor) { - auto& entity = EntityUtils::GetEntityByName(mantle.environment, actor); + auto entity = EntityUtils::GetEntityByName(mantle.environment, actor); return mantle.environment->HasControlStrategyGoalBeenReached( - entity.GetUniqueId(), + entity->GetUniqueId(), control_strategy_->type); } diff --git a/engine/src/Storyboard/MotionControlAction/LateralDistanceAction_impl.cpp b/engine/src/Storyboard/MotionControlAction/LateralDistanceAction_impl.cpp index e2d5c0e2e47e86fcd70066d7b39e32209c68c401..837b6ef43fb9bbbf4fd7752237c785697015550a 100644 --- a/engine/src/Storyboard/MotionControlAction/LateralDistanceAction_impl.cpp +++ b/engine/src/Storyboard/MotionControlAction/LateralDistanceAction_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -297,8 +297,8 @@ void LateralDistanceAction::SetControlStrategy() " Please adjust the scenario."); } - const auto& ref_entity = EntityUtils::GetEntityByName(mantle_.environment, values_.entityRef); - auto ref_entity_lane_ids = mantle_.environment->GetQueryService().GetLaneIdsAtPosition(ref_entity.GetPosition()); + const auto ref_entity = EntityUtils::GetEntityByName(mantle_.environment, values_.entityRef); + auto ref_entity_lane_ids = mantle_.environment->GetQueryService().GetLaneIdsAtPosition(ref_entity->GetPosition()); if (ref_entity_lane_ids.empty()) { Logger::Warning( @@ -306,9 +306,9 @@ void LateralDistanceAction::SetControlStrategy() "Given entities have not been updated for LateralDistanceAction."); return; } - ref_entity_lane_id_ = static_cast<mantle_api::LaneId>(ref_entity_lane_ids.front()); + ref_entity_lane_id_ = ref_entity_lane_ids.front(); - auto desired_distance = GetDesiredDistance(ref_entity); + auto desired_distance = GetDesiredDistance(*ref_entity); if (!desired_distance) { Logger::Warning( @@ -320,22 +320,22 @@ void LateralDistanceAction::SetControlStrategy() for (const auto& entity : values_.entities) { - auto& actor_entity = EntityUtils::GetEntityByName(mantle_.environment, entity); - const auto& ref_entity_lane_orientation = mantle_.environment->GetQueryService().GetLaneOrientation(ref_entity.GetPosition()); - auto target_position = GetTargetPosition(actor_entity, ref_entity_lane_orientation); + auto actor_entity = EntityUtils::GetEntityByName(mantle_.environment, entity); + const auto& ref_entity_lane_orientation = mantle_.environment->GetQueryService().GetLaneOrientation(ref_entity->GetPosition()); + auto target_position = GetTargetPosition(*actor_entity, ref_entity_lane_orientation); if (!target_position) { Logger::Warning("LateralDistanceAction: The pose for the entity with name \"" + entity + "\" could not be resolved. It has not been updated for LateralDistanceAction."); return; } - actor_entity.SetPosition(target_position.value()); + actor_entity->SetPosition(target_position.value()); } } bool LateralDistanceAction::HasControlStrategyGoalBeenReached(const std::string& actor) { - if (auto entity = mantle_.environment->GetEntityRepository().Get(actor)) + if (!mantle_.environment->GetEntityRepository().Get(actor).expired()) { return (!values_.dynamicConstraints.has_value() && !values_.continuous); } diff --git a/engine/src/Storyboard/MotionControlAction/LateralDistanceAction_impl.h b/engine/src/Storyboard/MotionControlAction/LateralDistanceAction_impl.h index 0d3c2db9a5f0c30264da4c8d98473535551bff59..6dfba8e3d7755f12514b6f4ad61c94ee70c59906 100644 --- a/engine/src/Storyboard/MotionControlAction/LateralDistanceAction_impl.h +++ b/engine/src/Storyboard/MotionControlAction/LateralDistanceAction_impl.h @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -149,7 +149,7 @@ private: const mantle_api::Orientation3<units::angle::radian_t>& ref_entity_lane_orientation) const; units::length::meter_t desired_distance_{}; - mantle_api::LaneId ref_entity_lane_id_{}; + mantle_api::UniqueId ref_entity_lane_id_{}; mantle_api::LateralDisplacementDirection direction_from_centerline_{}; public: diff --git a/engine/src/Storyboard/MotionControlAction/LongitudinalDistanceAction_impl.cpp b/engine/src/Storyboard/MotionControlAction/LongitudinalDistanceAction_impl.cpp index 7deaf674b82416dab64ee4caccf1d7e552932721..b8f54cfbb4bef0c8c2281a6a2b9f5dddb0133745 100644 --- a/engine/src/Storyboard/MotionControlAction/LongitudinalDistanceAction_impl.cpp +++ b/engine/src/Storyboard/MotionControlAction/LongitudinalDistanceAction_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -21,8 +21,8 @@ void LongitudinalDistanceAction::SetControlStrategy() { for (const auto& entity : values_.entities) { - const auto& refEntity = EntityUtils::GetEntityByName(mantle_.environment, values_.entityRef); - auto& actorEntity = EntityUtils::GetEntityByName(mantle_.environment, entity); + const auto refEntity = EntityUtils::GetEntityByName(mantle_.environment, values_.entityRef); + auto actorEntity = EntityUtils::GetEntityByName(mantle_.environment, entity); auto requested_distance = values_.GetLongitudinalDistance(); if (values_.freespace) @@ -32,25 +32,25 @@ void LongitudinalDistanceAction::SetControlStrategy() "only for a straight road in the lane coordinate system and when the orientation of both " "entities is aligned with the lane centerline."); - const auto refLength = refEntity.GetProperties()->bounding_box.dimension.length; - const auto actorLength = actorEntity.GetProperties()->bounding_box.dimension.length; + const auto refLength = refEntity->GetProperties()->bounding_box.dimension.length; + const auto actorLength = actorEntity->GetProperties()->bounding_box.dimension.length; requested_distance += refLength.value() / 2 + actorLength.value() / 2; } - const mantle_api::Pose poseRef{refEntity.GetPosition(), refEntity.GetOrientation()}; + const mantle_api::Pose poseRef{refEntity->GetPosition(), refEntity->GetOrientation()}; if (const auto lanePose = mantle_.environment->GetQueryService().FindLanePoseAtDistanceFrom( poseRef, units::length::meter_t(requested_distance), values_.longitudinalDisplacement)) { // longitudinal distance and lateral shift is calculated using entity ref as object reference. // actor pose is currently discarded in the calculations. - const auto verticalOffset = actorEntity.GetProperties()->bounding_box.dimension.height / 2.0; + const auto verticalOffset = actorEntity->GetProperties()->bounding_box.dimension.height / 2.0; const auto positionOnRoad = mantle_.environment->GetQueryService().GetUpwardsShiftedLanePosition( lanePose.value().position, verticalOffset.value(), true); - actorEntity.SetPosition(positionOnRoad); - actorEntity.SetOrientation(lanePose.value().orientation); - auto refEntitySpeed = refEntity.GetVelocity().Length(); - mantle_api::SetSpeed(&actorEntity, refEntitySpeed); + actorEntity->SetPosition(positionOnRoad); + actorEntity->SetOrientation(lanePose.value().orientation); + auto refEntitySpeed = refEntity->GetVelocity().Length(); + mantle_api::SetSpeed(actorEntity.get(), refEntitySpeed); } else { @@ -59,7 +59,7 @@ void LongitudinalDistanceAction::SetControlStrategy() } auto control_strategy = std::make_shared<mantle_api::KeepVelocityControlStrategy>(); - const auto entity_id = mantle_.environment->GetEntityRepository().Get(entity)->get().GetUniqueId(); + const auto entity_id = actorEntity->GetUniqueId(); mantle_.environment->UpdateControlStrategies(entity_id, {control_strategy}); } @@ -67,7 +67,7 @@ void LongitudinalDistanceAction::SetControlStrategy() bool LongitudinalDistanceAction::HasControlStrategyGoalBeenReached(const std::string& actor) { - if (auto entity = mantle_.environment->GetEntityRepository().Get(actor)) + if (!mantle_.environment->GetEntityRepository().Get(actor).expired()) { return (!values_.dynamicConstraints.has_value() && !values_.continuous); } diff --git a/engine/src/Storyboard/MotionControlAction/MotionControlAction.h b/engine/src/Storyboard/MotionControlAction/MotionControlAction.h index b23550a834d73f1b70f34aff441d857bd26a9d97..0d13723b459d7fdba17de1ec102a3c709519a281 100644 --- a/engine/src/Storyboard/MotionControlAction/MotionControlAction.h +++ b/engine/src/Storyboard/MotionControlAction/MotionControlAction.h @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -45,19 +45,20 @@ public: { if (action_.HasControlStrategyGoalBeenReached(actor)) { - if (const auto &entity = environment->GetEntityRepository().Get(actor); entity) + auto entity_ref = environment->GetEntityRepository().Get(actor); + if (auto entity = entity_ref.lock()) { const auto movement_domain = action_.GetMovementDomain(); if (movement_domain == mantle_api::MovementDomain::kLongitudinal || movement_domain == mantle_api::MovementDomain::kBoth) { environment->UpdateControlStrategies( - entity.value().get().GetUniqueId(), + entity->GetUniqueId(), {std::make_shared<mantle_api::KeepVelocityControlStrategy>()}); } if (movement_domain == mantle_api::MovementDomain::kLateral || movement_domain == mantle_api::MovementDomain::kBoth) { environment->UpdateControlStrategies( - entity.value().get().GetUniqueId(), + entity->GetUniqueId(), {std::make_shared<mantle_api::KeepLaneOffsetControlStrategy>()}); } } diff --git a/engine/src/Storyboard/MotionControlAction/SpeedAction_impl.cpp b/engine/src/Storyboard/MotionControlAction/SpeedAction_impl.cpp index 044cee98781f6e6de39a31c69045ca173ec1abc8..517187284e16afcf8c428e79e6756f71b3775640 100644 --- a/engine/src/Storyboard/MotionControlAction/SpeedAction_impl.cpp +++ b/engine/src/Storyboard/MotionControlAction/SpeedAction_impl.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2022 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -32,10 +32,7 @@ namespace detail { Velocity GetYOfVelocityPolynomial( units::time::second_t x, - const std::tuple<units::unit_t<units::compound_unit<units::velocity::meters_per_second, units::inverse<units::cubed<units::time::second>>>>, - units::unit_t<units::compound_unit<units::velocity::meters_per_second, units::inverse<units::squared<units::time::second>>>>, - units::unit_t<units::compound_unit<units::velocity::meters_per_second, units::inverse<units::time::second>>>, - units::unit_t<units::velocity::meters_per_second>>& polynomial) + const mantle_api::SplineSection<units::velocity::meters_per_second>::Polynomial& polynomial) { const auto& [a, b, c, d] = polynomial; return x * (x * (a * x + b) + c) + d; @@ -93,7 +90,7 @@ void AddFinalSquaredAccelerationSplineSection(std::vector<mantle_api::SplineSect const auto is_second_section{spline_sections.size() == 1}; const auto time_offset{is_second_section ? 0.0_ms : spline_sections.back().start_time}; - const auto speed_offset{is_second_section ? start_speed : std::get<3>(spline_sections.back().polynomial)}; + const auto speed_offset{is_second_section ? start_speed : spline_sections.back().polynomial.a0}; squared_acceleration_section.start_time = time_offset + (units::math::abs(squared_acceleration_section_start_speed - speed_offset) / target_acceleration); squared_acceleration_section.end_time = squared_acceleration_section.start_time + squared_acceleration_section_duration; @@ -119,7 +116,7 @@ void AddFinalSquaredDecelerationSplineSection(std::vector<mantle_api::SplineSect const auto is_second_section{spline_sections.size() == 1}; const auto time_offset{is_second_section ? 0.0_ms : spline_sections.back().start_time}; - const auto speed_offset{is_second_section ? start_speed : std::get<3>(spline_sections.back().polynomial)}; + const auto speed_offset{is_second_section ? start_speed : spline_sections.back().polynomial.a0}; squared_deceleration_section.start_time = time_offset + ((squared_deceleration_section_start_speed - speed_offset) / target_acceleration); squared_deceleration_section.end_time = squared_deceleration_section.start_time + squared_deceleration_section_duration; @@ -219,8 +216,8 @@ void SpeedAction::SetControlStrategy() case mantle_api::Shape::kStep: for (const auto& entityRef : values.entities) { - auto& entity = EntityUtils::GetEntityByName(mantle.environment, entityRef); - mantle_api::SetSpeed(&entity, values.GetSpeedActionTarget()); + auto entity = EntityUtils::GetEntityByName(mantle.environment, entityRef); + mantle_api::SetSpeed(entity.get(), values.GetSpeedActionTarget()); } break; case mantle_api::Shape::kCubic: @@ -247,8 +244,8 @@ void SpeedAction::SetControlStrategy() bool SpeedAction::HasControlStrategyGoalBeenReached(const std::string& actor) { - auto entity = mantle.environment->GetEntityRepository().Get(actor); - if (!entity.has_value()) + auto entity = mantle.environment->GetEntityRepository().Get(actor).lock(); + if (!entity) { return false; } @@ -256,7 +253,7 @@ bool SpeedAction::HasControlStrategyGoalBeenReached(const std::string& actor) const auto& shape = values.speedActionDynamics.transitionDynamics.shape; return (shape == mantle_api::Shape::kStep) || (shape == mantle_api::Shape::kLinear && mantle.environment->HasControlStrategyGoalBeenReached( - entity.value().get().GetUniqueId(), + entity->GetUniqueId(), mantle_api::ControlStrategyType::kFollowVelocitySpline)); } @@ -277,8 +274,8 @@ void SpeedAction::SetSpline(mantle_api::UniqueId entity_id, void SpeedAction::SetLinearVelocitySplineControlStrategy(const std::string& actor) { - auto& entity = EntityUtils::GetEntityByName(mantle.environment, actor); - const auto start_speed{entity.GetVelocity().Length()}; + auto entity = EntityUtils::GetEntityByName(mantle.environment, actor); + const auto start_speed{entity->GetVelocity().Length()}; const auto target_speed = values.GetSpeedActionTarget(); mantle_api::SplineSection<units::velocity::meters_per_second> spline_section; @@ -287,8 +284,8 @@ void SpeedAction::SetLinearVelocitySplineControlStrategy(const std::string& acto if (mantle_api::AlmostEqual(start_speed, target_speed)) { spline_section.end_time = 0.0_ms; - std::get<3>(spline_section.polynomial) = start_speed; - SetSpline(entity.GetUniqueId(), target_speed, {spline_section}); + spline_section.polynomial.a0 = start_speed; + SetSpline(entity->GetUniqueId(), target_speed, {spline_section}); return; } if (values.speedActionDynamics.transitionDynamics.dimension == mantle_api::Dimension::kTime) @@ -297,14 +294,14 @@ void SpeedAction::SetLinearVelocitySplineControlStrategy(const std::string& acto auto target_acceleration{(target_speed - start_speed) / duration}; spline_section.end_time = duration; - std::get<2>(spline_section.polynomial) = target_acceleration; - std::get<3>(spline_section.polynomial) = start_speed; - SetSpline(entity.GetUniqueId(), target_speed, {spline_section}); + spline_section.polynomial.a1 = target_acceleration; + spline_section.polynomial.a0 = start_speed; + SetSpline(entity->GetUniqueId(), target_speed, {spline_section}); return; } if (values.speedActionDynamics.transitionDynamics.dimension == mantle_api::Dimension::kRate) { - const auto performance{detail::GetVehiclePerformance(entity)}; + const auto performance{detail::GetVehiclePerformance(*entity)}; const Acceleration target_acceleration{std::abs(values.speedActionDynamics.transitionDynamics.value)}; if (values.speedActionDynamics.followingMode.has_value() && (values.speedActionDynamics.followingMode.value() == FollowingMode::kFollow)) @@ -314,14 +311,14 @@ void SpeedAction::SetLinearVelocitySplineControlStrategy(const std::string& acto target_speed, target_acceleration)}; - SetSpline(entity.GetUniqueId(), target_speed, spline_sections); + SetSpline(entity->GetUniqueId(), target_speed, spline_sections); } else { spline_section.end_time = units::math::abs(target_speed - start_speed) / target_acceleration; - std::get<2>(spline_section.polynomial) = units::math::copysign(target_acceleration, target_speed - start_speed); - std::get<3>(spline_section.polynomial) = start_speed; - SetSpline(entity.GetUniqueId(), target_speed, {spline_section}); + spline_section.polynomial.a1 = units::math::copysign(target_acceleration, target_speed - start_speed); + spline_section.polynomial.a0 = start_speed; + SetSpline(entity->GetUniqueId(), target_speed, {spline_section}); } return; @@ -338,9 +335,9 @@ void SpeedAction::SetLinearVelocitySplineControlStrategy(const std::string& acto (2 * values.speedActionDynamics.transitionDynamics.value)}; spline_section.end_time = duration; - std::get<2>(spline_section.polynomial) = units::math::copysign(target_acceleration, target_speed - entity.GetVelocity().Length()); - std::get<3>(spline_section.polynomial) = start_speed; - SetSpline(entity.GetUniqueId(), target_speed, {spline_section}); + spline_section.polynomial.a1 = units::math::copysign(target_acceleration, target_speed - entity->GetVelocity().Length()); + spline_section.polynomial.a0 = start_speed; + SetSpline(entity->GetUniqueId(), target_speed, {spline_section}); return; } throw std::runtime_error("Dimension must be either kTime, kRate, or kDistance"); diff --git a/engine/src/Utils/ControllerCreator.cpp b/engine/src/Utils/ControllerCreator.cpp index 669a8875ef48bd39ca7c89fc0204f4021326f8f7..a7b1ca3bc4a6a8c4dff33fca36fa0228fcea195f 100644 --- a/engine/src/Utils/ControllerCreator.cpp +++ b/engine/src/Utils/ControllerCreator.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 @@ -139,8 +139,8 @@ void ControllerCreator::CreateControllers(const std::vector<std::shared_ptr<NET_ continue; } - const auto entity = environment_.GetEntityRepository().Get(entity_name); - if (!entity.has_value()) + const auto entity = environment_.GetEntityRepository().Get(entity_name).lock(); + if (!entity) { throw std::runtime_error("ControllerCreator: Trying to create controller for unavailable entity \"" + entity_name + "\""); } @@ -183,9 +183,9 @@ void ControllerRegistrar::CreateDefaultController() default_config->control_strategies.push_back(std::make_unique<mantle_api::KeepVelocityControlStrategy>()); default_config->control_strategies.push_back(std::make_unique<mantle_api::KeepLaneOffsetControlStrategy>()); default_config->name = CONTROLLER_NAME_DEFAULT; - auto& controller = controller_repository_.Create(std::move(default_config)); - controller.ChangeState(mantle_api::IController::LateralState::kActivate, mantle_api::IController::LongitudinalState::kActivate); - RegisterDefaultController(controller); + auto controller = controller_repository_.Create(std::move(default_config)).lock(); + controller->ChangeState(mantle_api::IController::LateralState::kActivate, mantle_api::IController::LongitudinalState::kActivate); + RegisterDefaultController(*controller); } void ControllerRegistrar::CreateUserDefinedControllers(bool control_override) @@ -198,9 +198,9 @@ void ControllerRegistrar::CreateUserDefinedControllers(bool control_override) external_config->name = CONTROLLER_NAME_OVERRIDE; Logger::Info("ControllerRegistrar: Setting up external controller \"" + external_config->name + "\" for entity \"" + entity_name_ + "\""); - auto& controller = controller_repository_.Create(std::move(external_config)); - RegisterUserDefinedController(controller); - controller_service_->ChangeState(entity_.GetUniqueId(), controller.GetUniqueId(), mantle_api::IController::LateralState::kActivate, mantle_api::IController::LongitudinalState::kActivate); + auto controller = controller_repository_.Create(std::move(external_config)).lock(); + RegisterUserDefinedController(*controller); + controller_service_->ChangeState(entity_.GetUniqueId(), controller->GetUniqueId(), mantle_api::IController::LateralState::kActivate, mantle_api::IController::LongitudinalState::kActivate); } } else @@ -211,8 +211,8 @@ void ControllerRegistrar::CreateUserDefinedControllers(bool control_override) auto external_config = detail::CreateExternalControllerConfig(controller_name, object_controller); Logger::Info("ControllerRegistrar: Setting up external controller \"" + external_config->name + "\" for entity \"" + entity_name_ + "\""); - auto& controller = controller_repository_.Create(std::move(external_config)); - RegisterUserDefinedController(controller); + auto controller = controller_repository_.Create(std::move(external_config)).lock(); + RegisterUserDefinedController(*controller); } } } diff --git a/engine/src/Utils/ControllerService.cpp b/engine/src/Utils/ControllerService.cpp index adafe058a3d75698ac18588c70d710fa38caade0..a4dc05da5fa26d140ea2baac5e60c2879c8c7b81 100644 --- a/engine/src/Utils/ControllerService.cpp +++ b/engine/src/Utils/ControllerService.cpp @@ -93,9 +93,9 @@ std::vector<mantle_api::UniqueId> ControllerService::GetControllerIds(mantle_api controller_ids.reserve(1 + controllers->user_defined.size()); std::transform( - std::begin(controllers->user_defined), - std::end(controllers->user_defined), - std::back_inserter(controller_ids), + std::begin(controllers->user_defined), + std::end(controllers->user_defined), + std::back_inserter(controller_ids), [](const auto& user_defined_controller) { return user_defined_controller.first; diff --git a/engine/src/Utils/EntityCreator.cpp b/engine/src/Utils/EntityCreator.cpp index 0042a031930b199b38da083b660b1e576511ed42..12d30f9ebd6e390eb02b8cc5e229a4cdd7b6cdbb 100644 --- a/engine/src/Utils/EntityCreator.cpp +++ b/engine/src/Utils/EntityCreator.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -24,14 +24,14 @@ std::map<NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VehicleCategoryEnum, mant {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::UNKNOWN, mantle_api::VehicleClass::kOther}, {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::BICYCLE, mantle_api::VehicleClass::kBicycle}, {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::BUS, mantle_api::VehicleClass::kBus}, - {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::CAR, mantle_api::VehicleClass::kMedium_car}, - {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::MOTORBIKE, mantle_api::VehicleClass::kMotorbike}, - {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::SEMITRAILER, mantle_api::VehicleClass::kSemitrailer}, + {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::CAR, mantle_api::VehicleClass::kMediumCar}, + {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::MOTORBIKE, mantle_api::VehicleClass::kMotorcycle}, + {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::SEMITRAILER, mantle_api::VehicleClass::kSemiTrailer}, {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::TRAILER, mantle_api::VehicleClass::kTrailer}, {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::TRAIN, mantle_api::VehicleClass::kTrain}, {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::TRAM, mantle_api::VehicleClass::kTram}, - {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::TRUCK, mantle_api::VehicleClass::kHeavy_truck}, - {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VAN, mantle_api::VehicleClass::kDelivery_van}}; + {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::TRUCK, mantle_api::VehicleClass::kHeavyTruck}, + {NET_ASAM_OPENSCENARIO::v1_3::VehicleCategory::VAN, mantle_api::VehicleClass::kDeliveryVan}}; std::map<NET_ASAM_OPENSCENARIO::v1_3::PedestrianCategory::PedestrianCategoryEnum, mantle_api::EntityType> map_entity_type{{NET_ASAM_OPENSCENARIO::v1_3::PedestrianCategory::UNKNOWN, mantle_api::EntityType::kOther}, diff --git a/engine/src/Utils/EntityUtils.cpp b/engine/src/Utils/EntityUtils.cpp index 513600075541d4c81bdbd2a14dd3f77e63a70ec9..8d507b835293e7fcf78886e197a25456154391a3 100644 --- a/engine/src/Utils/EntityUtils.cpp +++ b/engine/src/Utils/EntityUtils.cpp @@ -190,12 +190,12 @@ units::length::meter_t EntityUtils::CalculateRelativeLongitudinalDistance( return units::math::abs(local_position.x); } -mantle_api::IEntity& EntityUtils::GetEntityByName(const std::shared_ptr<mantle_api::IEnvironment>& environment, - const std::string& entity_name) +std::shared_ptr<mantle_api::IEntity> EntityUtils::GetEntityByName(const std::shared_ptr<mantle_api::IEnvironment>& environment, + const std::string& entity_name) { - if (auto entity = environment->GetEntityRepository().Get(entity_name); entity) + if (auto entity = environment->GetEntityRepository().Get(entity_name).lock()) { - return entity.value().get(); + return entity; } throw std::runtime_error("EntityUtils: Entity with name \"" + entity_name + "\" does not exist. Please adjust the scenario."); @@ -205,19 +205,16 @@ void EntityUtils::RemoveEntity(const std::shared_ptr<mantle_api::IEnvironment>& const mantle_api::UniqueId& entity_id, const std::vector<mantle_api::UniqueId>& controller_ids) { - for (const auto id : controller_ids) + for (const auto& id : controller_ids) { environment->RemoveEntityFromController(entity_id, id); environment->GetControllerRepository().Delete(id); } - const auto& ref_host_entity = environment->GetEntityRepository().GetHost(); - if (ref_host_entity) + const auto host_entity = environment->GetEntityRepository().GetHost(); + if (const auto valid_host_entity = host_entity.lock(); entity_id == valid_host_entity->GetUniqueId()) { - if (entity_id == ref_host_entity.value().get().GetUniqueId()) - { - throw std::runtime_error("EntityUtils::RemoveEntity: Removing Ego entity is considered invalid. Please adjust the scenario."); - } + throw std::runtime_error("EntityUtils::RemoveEntity: Removing Ego entity is considered invalid. Please adjust the scenario."); } environment->GetEntityRepository().Delete(entity_id); } diff --git a/engine/src/Utils/EntityUtils.h b/engine/src/Utils/EntityUtils.h index 828a08a2a20a252658455d32f7a8350f38c1c799..cc1d5187a089a3d47c1e4317267301cb7e4b2820 100644 --- a/engine/src/Utils/EntityUtils.h +++ b/engine/src/Utils/EntityUtils.h @@ -101,8 +101,9 @@ public: /// @brief Get entity object from a given name /// @param environment environment interface /// @param entity_name name of the entity - static mantle_api::IEntity& GetEntityByName(const std::shared_ptr<mantle_api::IEnvironment>& environment, - const std::string& entity_name); + /// @throw If an entity with entity_name doesn't exist + static std::shared_ptr<mantle_api::IEntity> GetEntityByName(const std::shared_ptr<mantle_api::IEnvironment>& environment, + const std::string& entity_name); /// @brief Remove entity object /// @param environment environment interface diff --git a/engine/tests/Conversion/OscToMantle/ConvertScenarioAbsoluteTargetLaneTest.cpp b/engine/tests/Conversion/OscToMantle/ConvertScenarioAbsoluteTargetLaneTest.cpp index fd94349a094b1bc24e1a7f360c55bb38260b48c8..2e47f1d2f91f375a63ccc82185ec3ca6f79d64bb 100644 --- a/engine/tests/Conversion/OscToMantle/ConvertScenarioAbsoluteTargetLaneTest.cpp +++ b/engine/tests/Conversion/OscToMantle/ConvertScenarioAbsoluteTargetLaneTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,7 +8,6 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include <openScenarioLib/generated/v1_3/impl/ApiClassImplV1_3.h> @@ -21,5 +20,5 @@ TEST(ConvertScenarioAbsoluteTargetLaneTest, GivenNumberOfTheTargetLaneAsString_T const auto id = OpenScenarioEngine::v1_3::ConvertScenarioAbsoluteTargetLane(absolute_target_lane_); - ASSERT_EQ(mantle_api::UniqueId(10), id); -} \ No newline at end of file + ASSERT_EQ(mantle_api::LaneId(10), id); +} diff --git a/engine/tests/Conversion/OscToMantle/ConvertScenarioLaneOffsetTargetTest.cpp b/engine/tests/Conversion/OscToMantle/ConvertScenarioLaneOffsetTargetTest.cpp index 539d0ae309b81b00d1246979d6791c8fdf2d18c2..ba078330e05cad6d79413834498b0f3a043debab 100644 --- a/engine/tests/Conversion/OscToMantle/ConvertScenarioLaneOffsetTargetTest.cpp +++ b/engine/tests/Conversion/OscToMantle/ConvertScenarioLaneOffsetTargetTest.cpp @@ -8,7 +8,6 @@ ********************************************************************************/ #include <MantleAPI/Common/orientation.h> #include <MantleAPI/Common/vector.h> -#include <MantleAPI/Test/test_utils.h> #include <gmock/gmock.h> #include <gtest/gtest.h> #include <openScenarioLib/generated/v1_3/api/ApiClassInterfacesV1_3.h> @@ -17,6 +16,7 @@ #include <stdexcept> #include "Conversion/OscToMantle/ConvertScenarioLaneOffsetTarget.h" +#include "TestUtils.h" #include "gmock/gmock.h" using OpenScenarioEngine::v1_3::ConvertScenarioLaneOffsetTarget; @@ -61,17 +61,17 @@ class LaneOffsetTargetTest : public ::testing::Test { protected: std::shared_ptr<NiceMock<MockLaneOffsetTarget>> mock_lane_offset_target_{nullptr}; - std::shared_ptr<NiceMock<mantle_api::MockEnvironment>> mock_environment_{nullptr}; + std::shared_ptr<NiceMock<testing::OpenScenarioEngine::v1_3::FakeEnvironment>> fake_environment_{nullptr}; void SetUp() override { mock_lane_offset_target_ = std::make_shared<NiceMock<MockLaneOffsetTarget>>(); - mock_environment_ = std::make_shared<NiceMock<mantle_api::MockEnvironment>>(); + fake_environment_ = std::make_shared<NiceMock<testing::OpenScenarioEngine::v1_3::FakeEnvironment>>(); } }; TEST_F(LaneOffsetTargetTest, GivenOscNoTargetOffsets_WhenConvert_ThenThrowError) { - EXPECT_THROW(ConvertScenarioLaneOffsetTarget(mock_environment_, mock_lane_offset_target_, "vehicle1"), std::runtime_error); + EXPECT_THROW(ConvertScenarioLaneOffsetTarget(fake_environment_, mock_lane_offset_target_, "vehicle1"), std::runtime_error); } TEST_F(LaneOffsetTargetTest, GivenOscAbsoluteLaneOffsetTarget_WhenConvert_ThenConvertedToAbsoluteLaneOffset) @@ -83,7 +83,7 @@ TEST_F(LaneOffsetTargetTest, GivenOscAbsoluteLaneOffsetTarget_WhenConvert_ThenCo ON_CALL(*absolute_target_offset, IsSetValue()).WillByDefault(Return(true)); ON_CALL(*absolute_target_offset, GetValue()).WillByDefault(Return(expected_offset.value())); - EXPECT_THAT(ConvertScenarioLaneOffsetTarget(mock_environment_, mock_lane_offset_target_, "vehicle1"), Eq(expected_offset)); + EXPECT_THAT(ConvertScenarioLaneOffsetTarget(fake_environment_, mock_lane_offset_target_, "vehicle1"), Eq(expected_offset)); } TEST_F(LaneOffsetTargetTest, GivenOscAbsoluteLaneOffsetTargetButNoValue_WhenConvert_ThenThrowError) @@ -91,7 +91,7 @@ TEST_F(LaneOffsetTargetTest, GivenOscAbsoluteLaneOffsetTargetButNoValue_WhenConv auto absolute_target_offset_with_no_value = std::make_shared<NiceMock<MockAbsoluteTargetLaneOffset>>(); ON_CALL(*mock_lane_offset_target_, IsSetAbsoluteTargetLaneOffset()).WillByDefault(Return(true)); ON_CALL(*mock_lane_offset_target_, GetAbsoluteTargetLaneOffset()).WillByDefault(Return(absolute_target_offset_with_no_value)); - EXPECT_THROW(ConvertScenarioLaneOffsetTarget(mock_environment_, mock_lane_offset_target_, "vehicle1"), std::runtime_error); + EXPECT_THROW(ConvertScenarioLaneOffsetTarget(fake_environment_, mock_lane_offset_target_, "vehicle1"), std::runtime_error); } TEST_F(LaneOffsetTargetTest, GivenOscRelativeLaneOffsetTarget_WhenConvert_ThenThrowError) @@ -101,5 +101,5 @@ TEST_F(LaneOffsetTargetTest, GivenOscRelativeLaneOffsetTarget_WhenConvert_ThenTh ON_CALL(*mock_lane_offset_target_, IsSetRelativeTargetLaneOffset()).WillByDefault(Return(true)); ON_CALL(*mock_lane_offset_target_, GetRelativeTargetLaneOffset()).WillByDefault(Return(relative_target_offset)); - EXPECT_THAT(ConvertScenarioLaneOffsetTarget(mock_environment_, mock_lane_offset_target_, "vehicle1"), Eq(0.0_m)); + EXPECT_THAT(ConvertScenarioLaneOffsetTarget(fake_environment_, mock_lane_offset_target_, "vehicle1"), Eq(0.0_m)); } diff --git a/engine/tests/Conversion/OscToMantle/ConvertScenarioPositionTest.cpp b/engine/tests/Conversion/OscToMantle/ConvertScenarioPositionTest.cpp index 1629ea0cbc895489fd0e0cbab89d92c4cb0d6b52..355bbbb8be0764a1b01b8f0db8fa943929673579 100644 --- a/engine/tests/Conversion/OscToMantle/ConvertScenarioPositionTest.cpp +++ b/engine/tests/Conversion/OscToMantle/ConvertScenarioPositionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,11 +8,23 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> +#include <openScenarioLib/generated/v1_3/api/EnumerationsV1_3.h> #include <openScenarioLib/generated/v1_3/impl/ApiClassImplV1_3.h> #include "Conversion/OscToMantle/ConvertScenarioPosition.h" +#include "TestUtils.h" + +// Fix Windows build because ABSOLUTE and RELATIVE are defined as macros in windows.h +#ifdef ABSOLUTE +#define ABSOLUTE_WAS_SET ABSOLUTE +#undef ABSOLUTE +#endif + +#ifdef RELATIVE +#define RELATIVE_WAS_SET RELATIVE +#undef RELATIVE +#endif using namespace units::literals; @@ -45,7 +57,7 @@ protected: { geo_pos->SetLatitudeDeg(42.123); geo_pos->SetLongitudeDeg(11.65874); - EXPECT_CALL(dynamic_cast<mantle_api::MockConverter&>(*(mockEnvironment->GetConverter())), + EXPECT_CALL(dynamic_cast<mantle_api::MockCoordConverter&>(*(fakeEnvironment->GetConverter())), Convert(mantle_api::Position{lat_lon_position_deg})) .Times(1) .WillRepeatedly(testing::Return(expected_position_)); @@ -56,7 +68,7 @@ protected: geo_pos->SetLongitude(0.5); if (!set_degree) { - EXPECT_CALL(dynamic_cast<mantle_api::MockConverter&>(*(mockEnvironment->GetConverter())), + EXPECT_CALL(dynamic_cast<mantle_api::MockCoordConverter&>(*(fakeEnvironment->GetConverter())), Convert(mantle_api::Position{lat_lon_position_})) .Times(1) .WillRepeatedly(testing::Return(expected_position_)); @@ -80,7 +92,7 @@ protected: NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext type = NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::ABSOLUTE) const { - EXPECT_CALL(dynamic_cast<mantle_api::MockConverter&>(*(mockEnvironment->GetConverter())), + EXPECT_CALL(dynamic_cast<mantle_api::MockCoordConverter&>(*(fakeEnvironment->GetConverter())), Convert(testing::_)) .Times(1) .WillRepeatedly(testing::Return(expected_position_)); @@ -107,7 +119,7 @@ protected: NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext type = NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::ABSOLUTE) const { - EXPECT_CALL(dynamic_cast<mantle_api::MockConverter&>(*(mockEnvironment->GetConverter())), + EXPECT_CALL(dynamic_cast<mantle_api::MockCoordConverter&>(*(fakeEnvironment->GetConverter())), Convert(testing::_)) .Times(1) .WillRepeatedly(testing::Return(expected_position_)); @@ -167,7 +179,7 @@ protected: double distance_{10.0}; double offset_{0.0}; - std::shared_ptr<mantle_api::MockEnvironment> mockEnvironment{std::make_shared<mantle_api::MockEnvironment>()}; + std::shared_ptr<testing::OpenScenarioEngine::v1_3::FakeEnvironment> fakeEnvironment{std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>()}; private: std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::IOrientationWriter> GetOrientationWriter( @@ -188,27 +200,27 @@ TEST_F(ConvertScenarioPositionTest, GivenWorldPositionWithOrientation_WhenConverting_ThenPositionConvertedAndOrientationSet) { auto pos = GetWorldPosition(); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_position_, pose->position); - ASSERT_EQ(mantle_api::Orientation3<units::angle::radian_t>(4_rad, 5_rad, 6_rad), pose->orientation); + ASSERT_EQ((mantle_api::Orientation3<units::angle::radian_t>{4_rad, 5_rad, 6_rad}), pose->orientation); } TEST_F(ConvertScenarioPositionTest, GivenGeoPositionInRadWithNoOrientation_WhenConverting_ThenPositionConvertedAndOrientationZero) { auto pos = GetGeoPosition(); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_position_, pose->position); - ASSERT_EQ(mantle_api::Orientation3<units::angle::radian_t>(0_rad, 0_rad, 0_rad), pose->orientation); + ASSERT_EQ((mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad}), pose->orientation); } TEST_F(ConvertScenarioPositionTest, GivenGeoPositionInDegree_WhenConverting_ThenPositionConverted) { auto pos = GetGeoPosition(std::nullopt, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::ABSOLUTE, true, false); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_position_, pose->position); } @@ -217,7 +229,7 @@ TEST_F(ConvertScenarioPositionTest, GivenGeoPositionInRadAndDegree_WhenConverting_ThenDegreePositionConverted) { auto pos = GetGeoPosition(std::nullopt, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::ABSOLUTE, true, true); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_position_, pose->position); } @@ -226,7 +238,7 @@ TEST_F(ConvertScenarioPositionTest, GivenGeoPositionWithoutLatLon_WhenConverting_ThenThrow) { auto pos = GetGeoPosition(std::nullopt, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::ABSOLUTE, false, false); - EXPECT_ANY_THROW(OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos)); + EXPECT_ANY_THROW(OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos)); } TEST_F(ConvertScenarioPositionTest, @@ -235,7 +247,7 @@ TEST_F(ConvertScenarioPositionTest, mantle_api::Orientation3<units::angle::radian_t> expected_orientation{1.2_rad, 2.3_rad, 5.0_rad}; auto pos = GetGeoPosition(expected_orientation, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::ABSOLUTE); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_orientation, pose->orientation); } @@ -245,13 +257,13 @@ TEST_F(ConvertScenarioPositionTest, { mantle_api::Orientation3<units::angle::radian_t> lane_orientation{10_rad, 11_rad, 12_rad}; mantle_api::Orientation3<units::angle::radian_t> expected_orientation{1.2_rad, 2.3_rad, 5.0_rad}; - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(mockEnvironment->GetQueryService()), + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fakeEnvironment->GetQueryService()), GetLaneOrientation(expected_position_)) .Times(1) .WillRepeatedly(testing::Return(lane_orientation)); auto pos = GetGeoPosition(expected_orientation, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::RELATIVE); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_orientation + lane_orientation, pose->orientation); } @@ -260,33 +272,33 @@ TEST_F(ConvertScenarioPositionTest, GivenGeoPositionOnRoad_WhenConverting_ThenAltitudeOnRoadSurface) { auto pos = GetGeoPosition(); - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(mockEnvironment->GetQueryService()), + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fakeEnvironment->GetQueryService()), IsPositionOnLane(expected_position_)) .Times(1) .WillRepeatedly(testing::Return(true)); - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(mockEnvironment->GetQueryService()), + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fakeEnvironment->GetQueryService()), GetLaneHeightAtPosition(expected_position_)) .Times(1) .WillRepeatedly(testing::Return(5_m)); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); - EXPECT_EQ(mantle_api::Vec3<units::length::meter_t>(1_m, 2_m, 5_m), pose->position); + EXPECT_EQ((mantle_api::Vec3<units::length::meter_t>{1_m, 2_m, 5_m}), pose->position); } TEST_F(ConvertScenarioPositionTest, GivenGeoPositionNotOnRoad_WhenConverting_ThenDefaultAltitude) { auto pos = GetGeoPosition(); - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(mockEnvironment->GetQueryService()), + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fakeEnvironment->GetQueryService()), IsPositionOnLane(expected_position_)) .Times(1) .WillRepeatedly(testing::Return(false)); - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(mockEnvironment->GetQueryService()), + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fakeEnvironment->GetQueryService()), GetLaneHeightAtPosition(expected_position_)) .Times(0); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); EXPECT_EQ(expected_position_, pose->position); } @@ -295,23 +307,23 @@ TEST_F(ConvertScenarioPositionTest, GivenRelativeLanePositionWithNoOrientation_WhenConverting_ThenPositionConvertedAndOrientationZero) { auto pos = GetRelativeLanePosition(); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); - ASSERT_EQ(mantle_api::Vec3<units::length::meter_t>(0_m, 0_m, 0_m), pose->position); - ASSERT_EQ(mantle_api::Orientation3<units::angle::radian_t>(0_rad, 0_rad, 0_rad), pose->orientation); + ASSERT_EQ((mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m}), pose->position); + ASSERT_EQ((mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad}), pose->orientation); } TEST_F(ConvertScenarioPositionTest, GivenRelativeLanePositionWithAbsoluteOrientation_WhenConverting_ThenOrientationIsReturnedUnchanged) { mantle_api::Orientation3<units::angle::radian_t> expected_orientation{1.2_rad, 2.3_rad, 5.0_rad}; - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(mockEnvironment->GetQueryService()), + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fakeEnvironment->GetQueryService()), GetLaneOrientation(testing::_)) .Times(0); auto pos = GetRelativeLanePosition(0, expected_orientation, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::ABSOLUTE); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_orientation, pose->orientation); } @@ -320,16 +332,16 @@ TEST_F(ConvertScenarioPositionTest, GivenRelativeLanePositionWithDSValueAndAbsoluteOrientation_WhenConverting_ThenReturnEmptyPose) { mantle_api::Orientation3<units::angle::radian_t> expected_orientation{0_rad, 0_rad, 0_rad}; - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(mockEnvironment->GetQueryService()), + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fakeEnvironment->GetQueryService()), GetLaneOrientation(testing::_)) .Times(0); auto pos = GetRelativeLanePosition(10, expected_orientation, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::ABSOLUTE); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_orientation, pose->orientation); - ASSERT_EQ(mantle_api::Vec3<units::length::meter_t>(0_m, 0_m, 0_m), pose->position); + ASSERT_EQ((mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m}), pose->position); } TEST_F(ConvertScenarioPositionTest, @@ -337,14 +349,14 @@ TEST_F(ConvertScenarioPositionTest, { mantle_api::Orientation3<units::angle::radian_t> lane_orientation{10_rad, 11_rad, 12_rad}; mantle_api::Orientation3<units::angle::radian_t> expected_orientation{1.2_rad, 2.3_rad, 5.0_rad}; - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(mockEnvironment->GetQueryService()), + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fakeEnvironment->GetQueryService()), GetLaneOrientation(testing::_)) .Times(1) .WillRepeatedly(testing::Return(lane_orientation)); auto pos = GetRelativeLanePosition(0, expected_orientation, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::RELATIVE); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(lane_orientation + expected_orientation, pose->orientation); } @@ -352,28 +364,27 @@ TEST_F(ConvertScenarioPositionTest, TEST_F(ConvertScenarioPositionTest, GivenRelativeLanePositionWithDSValueAndRelativeOrientation_WhenConverting_ThenReturnEmptyPose) { - mantle_api::Orientation3<units::angle::radian_t> lane_orientation{10_rad, 11_rad, 12_rad}; mantle_api::Orientation3<units::angle::radian_t> expected_orientation{0_rad, 0_rad, 0_rad}; - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(mockEnvironment->GetQueryService()), + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fakeEnvironment->GetQueryService()), GetLaneOrientation(testing::_)) .Times(0); auto pos = GetRelativeLanePosition(10, expected_orientation, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::RELATIVE); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_orientation, pose->orientation); - ASSERT_EQ(mantle_api::Vec3<units::length::meter_t>(0_m, 0_m, 0_m), pose->position); + ASSERT_EQ((mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m}), pose->position); } TEST_F(ConvertScenarioPositionTest, GivenLanePositionWithNoOrientation_WhenConverting_ThenPositionConvertedAndOrientationZero) { auto pos = GetLanePosition(); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_position_, pose->position); - ASSERT_EQ(mantle_api::Orientation3<units::angle::radian_t>(0_rad, 0_rad, 0_rad), pose->orientation); + ASSERT_EQ((mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad}), pose->orientation); } TEST_F(ConvertScenarioPositionTest, @@ -382,7 +393,7 @@ TEST_F(ConvertScenarioPositionTest, mantle_api::Orientation3<units::angle::radian_t> expected_orientation{1.2_rad, 2.3_rad, 5.0_rad}; auto pos = GetLanePosition(expected_orientation, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::ABSOLUTE); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_orientation, pose->orientation); } @@ -392,13 +403,13 @@ TEST_F(ConvertScenarioPositionTest, { mantle_api::Orientation3<units::angle::radian_t> lane_orientation{10_rad, 11_rad, 12_rad}; mantle_api::Orientation3<units::angle::radian_t> expected_orientation{1.2_rad, 2.3_rad, 5.0_rad}; - EXPECT_CALL(dynamic_cast<mantle_api::MockConverter&>(*(mockEnvironment->GetConverter())), + EXPECT_CALL(dynamic_cast<mantle_api::MockCoordConverter&>(*(fakeEnvironment->GetConverter())), GetLaneOrientation(testing::_)) .Times(1) .WillRepeatedly(testing::Return(lane_orientation)); auto pos = GetLanePosition(expected_orientation, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::RELATIVE); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_orientation + lane_orientation, pose->orientation); } @@ -409,7 +420,7 @@ TEST_F(ConvertScenarioPositionTest, mantle_api::Orientation3<units::angle::radian_t> expected_orientation{1.2_rad, 2.3_rad, 5.0_rad}; auto pos = GetRoadPosition(expected_orientation, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::ABSOLUTE); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_orientation, pose->orientation); } @@ -419,13 +430,23 @@ TEST_F(ConvertScenarioPositionTest, { mantle_api::Orientation3<units::angle::radian_t> road_orientation{10_rad, 11_rad, 12_rad}; mantle_api::Orientation3<units::angle::radian_t> expected_orientation{1.2_rad, 2.3_rad, 5.0_rad}; - EXPECT_CALL(dynamic_cast<mantle_api::MockConverter&>(*(mockEnvironment->GetConverter())), + EXPECT_CALL(dynamic_cast<mantle_api::MockCoordConverter&>(*(fakeEnvironment->GetConverter())), GetRoadOrientation(testing::_)) .Times(1) .WillRepeatedly(testing::Return(road_orientation)); auto pos = GetRoadPosition(expected_orientation, NET_ASAM_OPENSCENARIO::v1_3::ReferenceContext::RELATIVE); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mockEnvironment, pos); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fakeEnvironment, pos); ASSERT_EQ(expected_orientation + road_orientation, pose->orientation); } + +#ifdef ABSOLUTE_WAS_SET +#define ABSOLUTE ABSOLUTE_WAS_SET +#undef ABSOLUTE_WAS_SET +#endif + +#ifdef RELATIVE_WAS_SET +#define RELATIVE RELATIVE_WAS_SET +#undef RELATIVE_WAS_SET +#endif diff --git a/engine/tests/Conversion/OscToMantle/ConvertScenarioRelativeTargetLaneTest.cpp b/engine/tests/Conversion/OscToMantle/ConvertScenarioRelativeTargetLaneTest.cpp index d0a841955d889208f6c8adbf9cab51cc5bd6ab26..0bd011ef3a0bf3fbbc25ddf025c386536d2acd08 100644 --- a/engine/tests/Conversion/OscToMantle/ConvertScenarioRelativeTargetLaneTest.cpp +++ b/engine/tests/Conversion/OscToMantle/ConvertScenarioRelativeTargetLaneTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,11 +8,11 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include <openScenarioLib/generated/v1_3/impl/ApiClassImplV1_3.h> #include "Conversion/OscToMantle/ConvertScenarioRelativeTargetLane.h" +#include "TestUtils.h" using namespace units::literals; using namespace mantle_api; @@ -22,7 +22,7 @@ TEST(ConvertScenarioRelativeTargetLaneTest, GivenNoRelativeEntity_ThenThrowError auto namedRef = std::make_shared<NET_ASAM_OPENSCENARIO::INamedReference<NET_ASAM_OPENSCENARIO::v1_3::IEntity>>(); auto relativeTargetLane = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::RelativeTargetLaneImpl>(); relativeTargetLane->SetEntityRef(namedRef); - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); - auto uniqueId = OpenScenarioEngine::v1_3::ConvertScenarioRelativeTargetLane(mockEnvironment, relativeTargetLane); + auto fakeEnvironment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); + auto uniqueId = OpenScenarioEngine::v1_3::ConvertScenarioRelativeTargetLane(fakeEnvironment, relativeTargetLane); EXPECT_EQ(mantle_api::UniqueId(0), uniqueId); } diff --git a/engine/tests/Conversion/OscToMantle/ConvertScenarioSpeedActionTargetTest.cpp b/engine/tests/Conversion/OscToMantle/ConvertScenarioSpeedActionTargetTest.cpp index 0ee431c3b5f326dd72d85ce3b0aed670932e5a26..79f44dc5a6729fd3a52cd5531b8cc21f7049fd8e 100644 --- a/engine/tests/Conversion/OscToMantle/ConvertScenarioSpeedActionTargetTest.cpp +++ b/engine/tests/Conversion/OscToMantle/ConvertScenarioSpeedActionTargetTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,12 +8,13 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> +#include <MantleAPI/Execution/mock_environment.h> #include <gtest/gtest.h> #include <openScenarioLib/generated/v1_3/api/ApiClassInterfacesV1_3.h> #include <openScenarioLib/generated/v1_3/impl/ApiClassImplV1_3.h> #include "Conversion/OscToMantle/ConvertScenarioSpeedActionTarget.h" +#include "TestUtils.h" using namespace units::literals; @@ -42,7 +43,7 @@ TEST(ConvertScenarioSpeedActionTargetTest, GivenAbsoluteTargetSpeed_ThenConvertT TEST(ConvertScenarioSpeedActionTargetTest, GivenRelativeTargetSpeedAndDeltaValueType_ThenConvertToSpeedActionTarget) { - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); + auto fakeEnvironment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); auto namedRef = std::make_shared<NET_ASAM_OPENSCENARIO::INamedReference<NET_ASAM_OPENSCENARIO::v1_3::IEntity>>(); auto relativeTargetSpeed = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::RelativeTargetSpeedImpl>(); relativeTargetSpeed->SetEntityRef(namedRef); @@ -52,13 +53,13 @@ TEST(ConvertScenarioSpeedActionTargetTest, GivenRelativeTargetSpeedAndDeltaValue auto speed_action_target = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::SpeedActionTargetImpl>(); speed_action_target->SetRelativeTargetSpeed(relativeTargetSpeed); - auto trajectoryTimeReference = OpenScenarioEngine::v1_3::ConvertScenarioSpeedActionTarget(mockEnvironment, speed_action_target); + auto trajectoryTimeReference = OpenScenarioEngine::v1_3::ConvertScenarioSpeedActionTarget(fakeEnvironment, speed_action_target); EXPECT_EQ(trajectoryTimeReference, 1.0_mps); } TEST(ConvertScenarioSpeedActionTargetTest, GivenRelativeTargetSpeedAndFactorValueType_ThenConvertToSpeedActionTarget) { - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); + auto fakeEnvironment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); auto namedRef = std::make_shared<NET_ASAM_OPENSCENARIO::INamedReference<NET_ASAM_OPENSCENARIO::v1_3::IEntity>>(); @@ -70,6 +71,6 @@ TEST(ConvertScenarioSpeedActionTargetTest, GivenRelativeTargetSpeedAndFactorValu auto speed_action_target = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::SpeedActionTargetImpl>(); speed_action_target->SetRelativeTargetSpeed(relativeTargetSpeed); - auto trajectoryTimeReference = OpenScenarioEngine::v1_3::ConvertScenarioSpeedActionTarget(mockEnvironment, speed_action_target); + auto trajectoryTimeReference = OpenScenarioEngine::v1_3::ConvertScenarioSpeedActionTarget(fakeEnvironment, speed_action_target); EXPECT_EQ(trajectoryTimeReference, 0.0_mps); -} \ No newline at end of file +} diff --git a/engine/tests/Conversion/OscToMantle/ConvertScenarioTimeReferenceTest.cpp b/engine/tests/Conversion/OscToMantle/ConvertScenarioTimeReferenceTest.cpp index a6d820c76ad52100ed2fa70cad536e75928b6881..29d277c684ad2e77a0cd8b3b80f1f662c6e7682d 100644 --- a/engine/tests/Conversion/OscToMantle/ConvertScenarioTimeReferenceTest.cpp +++ b/engine/tests/Conversion/OscToMantle/ConvertScenarioTimeReferenceTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,7 +8,6 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include <openScenarioLib/generated/v1_3/impl/ApiClassImplV1_3.h> @@ -36,4 +35,4 @@ TEST(ConvertScenarioTimeReferenceTest, GetTimingFromTimeReference_ThenConvertToM ASSERT_EQ(1.0, timeReference->scale); ASSERT_EQ(units::time::second_t(2.0), timeReference->offset); -} \ No newline at end of file +} diff --git a/engine/tests/Conversion/OscToMantle/ConvertScenarioTimeToCollisionConditionTargetTest.cpp b/engine/tests/Conversion/OscToMantle/ConvertScenarioTimeToCollisionConditionTargetTest.cpp index d9df35caa69fd370b6ad1ee2bf3727d18a132d7e..90f6aefeac8d2dd7957fd064409c2e0757ec65cd 100644 --- a/engine/tests/Conversion/OscToMantle/ConvertScenarioTimeToCollisionConditionTargetTest.cpp +++ b/engine/tests/Conversion/OscToMantle/ConvertScenarioTimeToCollisionConditionTargetTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,7 +8,6 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include <openScenarioLib/generated/v1_3/impl/ApiClassImplV1_3.h> @@ -42,4 +41,4 @@ TEST_F(ConvertScenarioTimeToCollisionConditionTargetTest, GetThePosition_ThenCon auto absolute_target_lane_ = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::TimeToCollisionConditionTargetImpl>(); // TODO: Implement once TTC issue is resolved. } -} // namespace testing::OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace testing::OpenScenarioEngine::v1_3 diff --git a/engine/tests/Conversion/OscToMantle/ConvertScenarioTrafficDefinitionTest.cpp b/engine/tests/Conversion/OscToMantle/ConvertScenarioTrafficDefinitionTest.cpp index c0667efc832dab9209f55365eeef1f47cd014813..9736ab5bf977c98b27e3c5173f4b5501a38ee167 100644 --- a/engine/tests/Conversion/OscToMantle/ConvertScenarioTrafficDefinitionTest.cpp +++ b/engine/tests/Conversion/OscToMantle/ConvertScenarioTrafficDefinitionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -175,17 +175,17 @@ TEST(ConvertScenarioTrafficDefinition, GivenTrafficDefinitionImplementation_When ASSERT_EQ(detail::kTrafficDefinitionName, converted.name); - ASSERT_EQ(converted.vehicle_category_distribution_entries.at(0).category, mantle_api::VehicleClass::kInvalid); + ASSERT_EQ(converted.vehicle_category_distribution_entries.at(0).category, mantle_api::VehicleClass::kUnknown); ASSERT_EQ(converted.vehicle_category_distribution_entries.at(1).category, mantle_api::VehicleClass::kBicycle); ASSERT_EQ(converted.vehicle_category_distribution_entries.at(2).category, mantle_api::VehicleClass::kBus); - ASSERT_EQ(converted.vehicle_category_distribution_entries.at(3).category, mantle_api::VehicleClass::kMedium_car); - ASSERT_EQ(converted.vehicle_category_distribution_entries.at(4).category, mantle_api::VehicleClass::kMotorbike); - ASSERT_EQ(converted.vehicle_category_distribution_entries.at(5).category, mantle_api::VehicleClass::kSemitrailer); + ASSERT_EQ(converted.vehicle_category_distribution_entries.at(3).category, mantle_api::VehicleClass::kMediumCar); + ASSERT_EQ(converted.vehicle_category_distribution_entries.at(4).category, mantle_api::VehicleClass::kMotorcycle); + ASSERT_EQ(converted.vehicle_category_distribution_entries.at(5).category, mantle_api::VehicleClass::kSemiTrailer); ASSERT_EQ(converted.vehicle_category_distribution_entries.at(6).category, mantle_api::VehicleClass::kTrailer); ASSERT_EQ(converted.vehicle_category_distribution_entries.at(7).category, mantle_api::VehicleClass::kTrain); ASSERT_EQ(converted.vehicle_category_distribution_entries.at(8).category, mantle_api::VehicleClass::kTram); - ASSERT_EQ(converted.vehicle_category_distribution_entries.at(9).category, mantle_api::VehicleClass::kHeavy_truck); - ASSERT_EQ(converted.vehicle_category_distribution_entries.at(10).category, mantle_api::VehicleClass::kDelivery_van); + ASSERT_EQ(converted.vehicle_category_distribution_entries.at(9).category, mantle_api::VehicleClass::kHeavyTruck); + ASSERT_EQ(converted.vehicle_category_distribution_entries.at(10).category, mantle_api::VehicleClass::kDeliveryVan); for (size_t i{0}; i < converted.vehicle_category_distribution_entries.size(); ++i) { diff --git a/engine/tests/Conversion/OscToMantle/ConvertScenarioTrajectoryRefTest.cpp b/engine/tests/Conversion/OscToMantle/ConvertScenarioTrajectoryRefTest.cpp index 6a223eef6016c734b1041fd1731c9a6bed591af2..dac046f5a8cbd9d69d42568d2020448ee969d6dc 100644 --- a/engine/tests/Conversion/OscToMantle/ConvertScenarioTrajectoryRefTest.cpp +++ b/engine/tests/Conversion/OscToMantle/ConvertScenarioTrajectoryRefTest.cpp @@ -8,7 +8,7 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> +#include <MantleAPI/Execution/mock_environment.h> #include <gtest/gtest.h> #include <openScenarioLib/generated/v1_3/api/ApiClassInterfacesV1_3.h> #include <openScenarioLib/generated/v1_3/impl/ApiClassImplV1_3.h> @@ -205,10 +205,12 @@ class ConvertScenarioTrajectoryRefTestShapeParam : public ConvertScenarioTraject }; INSTANTIATE_TEST_CASE_P( - ConvertScenarioTrajectoryRefTestShapeInstParam, - ConvertScenarioTrajectoryRefTestShapeParam, - ::testing::Values([](std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::ShapeImpl> shape){shape->SetClothoid(std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::ClothoidImpl>());}, - [](std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::ShapeImpl> shape){shape->SetNurbs(std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::NurbsImpl>());})); + ConvertScenarioTrajectoryRefTestShapeInstParam, + ConvertScenarioTrajectoryRefTestShapeParam, + ::testing::Values([](std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::ShapeImpl> shape) + { shape->SetClothoid(std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::ClothoidImpl>()); }, + [](std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::ShapeImpl> shape) + { shape->SetNurbs(std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::NurbsImpl>()); })); TEST_P(ConvertScenarioTrajectoryRefTestShapeParam, GivenUnsupportedShape_ThenException) { diff --git a/engine/tests/Node/ByEntityConditionNodeTest.cpp b/engine/tests/Node/ByEntityConditionNodeTest.cpp index 1c5a5b618ff08711e61631ef7e22333198931747..4601422dec6d67c1a0ff6cd93004198d1be6796b 100644 --- a/engine/tests/Node/ByEntityConditionNodeTest.cpp +++ b/engine/tests/Node/ByEntityConditionNodeTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -65,7 +65,7 @@ TEST_F(OpenScenarioEngineLibraryTestBase, GivenTriggeringEntitiesRuleAll_WhenCon TEST_F(OpenScenarioEngineLibraryTestBase, GivenByEntityConditionNode_WhenTick_ThenReturnAlwaysChildStatus) { - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(env_->GetEntityRepository().Get("Ego").value().get()), GetVelocity()) + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(*env_->GetEntityRepository().Get("Ego").lock()), GetVelocity()) .WillOnce(::testing::Return(mantle_api::Vec3<units::velocity::meters_per_second_t>{0.0_mps, 0_mps, 0_mps})) .WillOnce(::testing::Return(mantle_api::Vec3<units::velocity::meters_per_second_t>{10.0_mps, 0_mps, 0_mps})) .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::velocity::meters_per_second_t>{0.0_mps, 0_mps, 0_mps})); diff --git a/engine/tests/Node/ConditionNodeTest.cpp b/engine/tests/Node/ConditionNodeTest.cpp index 0f4b4e5cb5e55f68ff145739ac42a4f25076c853..81f639a21f1f7ad47d20bf81607083b7422e946f 100644 --- a/engine/tests/Node/ConditionNodeTest.cpp +++ b/engine/tests/Node/ConditionNodeTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,7 +8,7 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> +#include <MantleAPI/Execution/mock_environment.h> #include <agnostic_behavior_tree/decorator/data_declaration_node.h> #include <gtest/gtest.h> @@ -20,8 +20,8 @@ using namespace mantle_api; using namespace units::literals; -using testing::OpenScenarioEngine::v1_3::FakeActionNode; using testing::Return; +using testing::OpenScenarioEngine::v1_3::FakeActionNode; using namespace NET_ASAM_OPENSCENARIO::v1_3; @@ -366,4 +366,4 @@ TEST(ConditionNode, GivenNoEdge_WhenChildConditionIsFullfilled_Succeeds) ASSERT_THAT(root.executeTick(), yase::NodeStatus::kSuccess); ASSERT_THAT(root.executeTick(), yase::NodeStatus::kRunning); ASSERT_THAT(root.executeTick(), yase::NodeStatus::kSuccess); -} \ No newline at end of file +} diff --git a/engine/tests/Node/EntityConditionNodeTest.cpp b/engine/tests/Node/EntityConditionNodeTest.cpp index 69a934f0df3c45f3ec26fcaf6fdc86df3c789ead..0ecca6e08650f171ba38f03d8fdbce87f089197c 100644 --- a/engine/tests/Node/EntityConditionNodeTest.cpp +++ b/engine/tests/Node/EntityConditionNodeTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -35,7 +35,7 @@ std::shared_ptr<OpenScenarioEngine::v1_3::Node::EntityConditionNode> CreateEntit TEST_F(OpenScenarioEngineLibraryTestBase, GivenEntityConditionNode_WhenTick_ThenReturnAlwaysChildStatus) { - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(env_->GetEntityRepository().Get("Ego").value().get()), GetVelocity()) + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(*env_->GetEntityRepository().Get("Ego").lock()), GetVelocity()) .WillOnce(::testing::Return(mantle_api::Vec3<units::velocity::meters_per_second_t>{0.0_mps, 0_mps, 0_mps})) .WillOnce(::testing::Return(mantle_api::Vec3<units::velocity::meters_per_second_t>{10.0_mps, 0_mps, 0_mps})) .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::velocity::meters_per_second_t>{0.0_mps, 0_mps, 0_mps})); diff --git a/engine/tests/OpenScenarioEngineTest.cpp b/engine/tests/OpenScenarioEngineTest.cpp index 0735928cd878208366b8851806a58f48671b6b40..b5e79d95b45b3d4317c61ae62b0439dd3a35bcd0 100644 --- a/engine/tests/OpenScenarioEngineTest.cpp +++ b/engine/tests/OpenScenarioEngineTest.cpp @@ -9,7 +9,6 @@ * SPDX-License-Identifier: EPL-2.0 *******************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gmock/gmock.h> #include <gtest/gtest.h> #include <openScenarioLib/generated/v1_3/catalog/CatalogHelperV1_3.h> @@ -40,8 +39,8 @@ protected: void SetUp() override { OpenScenarioEngineTestBase::SetUp(); - ON_CALL(controller_, GetName()).WillByDefault(ReturnRef(controller_name)); - ON_CALL(controller_, GetUniqueId()).WillByDefault(Return(1234)); + ON_CALL(*controller_, GetName()).WillByDefault(ReturnRef(controller_name)); + ON_CALL(*controller_, GetUniqueId()).WillByDefault(Return(mantle_api::UniqueId(1234))); } std::string controller_name{"TestController"s}; @@ -251,16 +250,27 @@ TEST_F(OpenScenarioEngineTest, GivenScenarioWithUsedArea_WhenCallInit_ThenMapDet EXPECT_TRUE(IsMapDetailsWithLatLon(*scenario_info.map_details)); } +TEST_F(OpenScenarioEngineTest, GivenEngine_WhenSetupDynamicContent_ThenRouteRepositoryIsReset) +{ + std::string xosc_file_path{GetScenariosPath(test_info_->file()) + default_xosc_scenario_}; + OpenScenarioEngine::v1_3::OpenScenarioEngine engine(xosc_file_path, env_); + + EXPECT_CALL(dynamic_cast<mantle_api::MockRouteRepository&>(env_->GetRouteRepository()), Reset()).Times(1); + + engine.Init(); + engine.SetupDynamicContent(); +} + TEST_F(OpenScenarioEngineTest, GivenScenarioWithEntities_WhenInitScenario_ThenCreateIsCalledInEnvironmentForEveryEntity) { std::string xosc_file_path{GetScenariosPath(test_info_->file()) + default_xosc_scenario_}; OpenScenarioEngine::v1_3::OpenScenarioEngine engine(xosc_file_path, env_); - mantle_api::MockVehicle mock_vehicle{}; + auto mock_vehicle = std::make_shared<mantle_api::MockVehicle>(); mantle_api::VehicleProperties ego_properties{}; ego_properties.type = mantle_api::EntityType::kVehicle; - ego_properties.classification = mantle_api::VehicleClass::kMedium_car; + ego_properties.classification = mantle_api::VehicleClass::kMediumCar; ego_properties.model = "medium_car"; ego_properties.bounding_box.dimension.length = 5.0_m; ego_properties.bounding_box.dimension.width = 2.0_m; @@ -279,12 +289,13 @@ TEST_F(OpenScenarioEngineTest, GivenScenarioWithEntities_WhenInitScenario_ThenCr ego_properties.rear_axle.max_steering = 0_rad; ego_properties.rear_axle.track_width = 1.68_m; ego_properties.rear_axle.wheel_diameter = 0.8_m; + ego_properties.properties["custom_property"] = "5"; ego_properties.is_host = true; EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), Create(std::string("Ego"), ego_properties)) .Times(1) - .WillRepeatedly(ReturnRef(mock_vehicle)); + .WillRepeatedly(Return(mock_vehicle)); EXPECT_NO_THROW(engine.Init()); engine.SetupDynamicContent(); @@ -296,22 +307,22 @@ TEST_F(OpenScenarioEngineTest, std::string xosc_file_path{GetScenariosPath(test_info_->file()) + default_xosc_scenario_}; OpenScenarioEngine::v1_3::OpenScenarioEngine engine(xosc_file_path, env_); - mantle_api::MockController mock_default_controller; + auto mock_default_controller = std::make_shared<mantle_api::MockController>(); const mantle_api::UniqueId DEFAULT_CONTROLLER_ID{1234}; const std::string DEFAULT_CONTROLLER_NAME{"TestDefaultController"}; - ON_CALL(mock_default_controller, GetUniqueId()).WillByDefault(Return(DEFAULT_CONTROLLER_ID)); - ON_CALL(mock_default_controller, GetName()).WillByDefault(ReturnRef(DEFAULT_CONTROLLER_NAME)); + ON_CALL(*mock_default_controller, GetUniqueId()).WillByDefault(Return(DEFAULT_CONTROLLER_ID)); + ON_CALL(*mock_default_controller, GetName()).WillByDefault(ReturnRef(DEFAULT_CONTROLLER_NAME)); - mantle_api::MockController mock_user_defined_controller; + auto mock_user_defined_controller = std::make_shared<mantle_api::MockController>(); const mantle_api::UniqueId USER_DEFINED_CONTROLLER_ID{5678}; const std::string USER_DEFINED_CONTROLLER_NAME{"TestUserDefinedController"}; - ON_CALL(mock_user_defined_controller, GetUniqueId()).WillByDefault(Return(USER_DEFINED_CONTROLLER_ID)); - ON_CALL(mock_user_defined_controller, GetName()).WillByDefault(ReturnRef(USER_DEFINED_CONTROLLER_NAME)); + ON_CALL(*mock_user_defined_controller, GetUniqueId()).WillByDefault(Return(USER_DEFINED_CONTROLLER_ID)); + ON_CALL(*mock_user_defined_controller, GetName()).WillByDefault(ReturnRef(USER_DEFINED_CONTROLLER_NAME)); mantle_api::InternalControllerConfig internal_config_actual; mantle_api::ExternalControllerConfig external_config_actual; ON_CALL(env_->GetControllerRepository(), Create(_)) - .WillByDefault(::testing::Invoke([&](std::unique_ptr<mantle_api::IControllerConfig> received_controller) -> mantle_api::IController& + .WillByDefault(::testing::Invoke([&](std::unique_ptr<mantle_api::IControllerConfig> received_controller) -> std::weak_ptr<mantle_api::IController> { if (auto internal = dynamic_cast<mantle_api::InternalControllerConfig*>(received_controller.get())) { @@ -352,7 +363,7 @@ TEST_F(OpenScenarioEngineTest, GivenScenarioWithInitTeleportAction_WhenInitAndSt std::string xosc_file_path{GetScenariosPath(test_info_->file()) + default_xosc_scenario_}; OpenScenarioEngine::v1_3::OpenScenarioEngine engine(xosc_file_path, env_); - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), SetPosition(_)) .Times(1); diff --git a/engine/tests/Storyboard/ByEntityCondition/DistanceConditionTest.cpp b/engine/tests/Storyboard/ByEntityCondition/DistanceConditionTest.cpp index f89602ac75637736181a94e513e7ea32666a20b4..1ce9a5b12e9153294f8317b744b4f46e408caafd 100644 --- a/engine/tests/Storyboard/ByEntityCondition/DistanceConditionTest.cpp +++ b/engine/tests/Storyboard/ByEntityCondition/DistanceConditionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,11 +8,11 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include "Conversion/OscToMantle/ConvertScenarioRule.h" #include "Storyboard/ByEntityCondition/DistanceCondition_impl.h" +#include "TestUtils.h" #include "TestUtils/TestLogger.h" using namespace mantle_api; @@ -28,16 +28,17 @@ protected: void SetUp() override { LOGGER = std::make_unique<testing::OpenScenarioEngine::v1_3::TestLogger>(); - mock_environment_ = std::make_shared<MockEnvironment>(); + fake_environment_ = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); reference_pose_ = {{10.0_m, 20.0_m, 30.0_m}, {}}; } - std::shared_ptr<MockEnvironment> mock_environment_; + std::shared_ptr<testing::OpenScenarioEngine::v1_3::FakeEnvironment> fake_environment_; Pose reference_pose_; OpenScenarioEngine::v1_3::DistanceCondition::Values condition_values_{.triggeringEntity = "vehicle", .alongRoute = false, .freespace = false, - .GetPosition = [&]() { return reference_pose_; }, + .GetPosition = [&]() + { return reference_pose_; }, .coordinateSystem = OpenScenarioEngine::v1_3::CoordinateSystem::kEntity, .relativeDistanceType = OpenScenarioEngine::v1_3::RelativeDistanceType::kLongitudinal, .rule = OpenScenarioEngine::v1_3::Rule(NET_ASAM_OPENSCENARIO::v1_3::Rule::RuleEnum::LESS_OR_EQUAL, 10.0)}; @@ -50,7 +51,7 @@ TEST_F(DistanceConditionTestFixture, GivenUnsupportedCoordinateSystem_WhenDistan condition_values_.coordinateSystem = OpenScenarioEngine::v1_3::CoordinateSystem::kUnknown; OpenScenarioEngine::v1_3::DistanceCondition distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); distance_condition.IsSatisfied(); @@ -63,7 +64,7 @@ TEST_F(DistanceConditionTestFixture, GivenUnsupportedRelativeDistanceType_WhenDi condition_values_.relativeDistanceType = OpenScenarioEngine::v1_3::RelativeDistanceType::kLateral; OpenScenarioEngine::v1_3::DistanceCondition distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); distance_condition.IsSatisfied(); @@ -83,7 +84,7 @@ TEST_F( condition_values_.rule = rule; OpenScenarioEngine::v1_3::DistanceCondition distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); ASSERT_TRUE(distance_condition.IsSatisfied()); } @@ -94,7 +95,7 @@ TEST_F( condition_values_.freespace = true; OpenScenarioEngine::v1_3::DistanceCondition distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); ASSERT_TRUE(distance_condition.IsSatisfied()); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kError); @@ -109,6 +110,6 @@ TEST_F( condition_values_.rule = rule; OpenScenarioEngine::v1_3::DistanceCondition distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); ASSERT_FALSE(distance_condition.IsSatisfied()); } diff --git a/engine/tests/Storyboard/ByEntityCondition/ReachPositionConditionTest.cpp b/engine/tests/Storyboard/ByEntityCondition/ReachPositionConditionTest.cpp index 00237a12f8588e961f756382fbaee365eba713a5..074889829d64cabba6488ebebac897dd03a7e34d 100644 --- a/engine/tests/Storyboard/ByEntityCondition/ReachPositionConditionTest.cpp +++ b/engine/tests/Storyboard/ByEntityCondition/ReachPositionConditionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,10 +8,10 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include "Storyboard/ByEntityCondition/ReachPositionCondition_impl.h" +#include "TestUtils.h" using namespace mantle_api; using namespace units::literals; @@ -21,8 +21,9 @@ TEST(ReachPositionCondition_UnitTest, GivenPositionWithinTolerance_ReturnsTrue) OpenScenarioEngine::v1_3::ReachPositionCondition reachPositionCondition({{""}, 4, - []() { return std::make_optional<Pose>({{1.0_m, 2.0_m, 3.0_m}, {}}); }}, - {std::make_shared<MockEnvironment>()}); + []() + { return std::make_optional<Pose>({{1.0_m, 2.0_m, 3.0_m}, {}}); }}, + {std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>()}); ASSERT_TRUE(reachPositionCondition.IsSatisfied()); } @@ -32,8 +33,9 @@ TEST(ReachPositionCondition_UnitTest, GivenPositionOutsideTolerance_ReturnFalse) OpenScenarioEngine::v1_3::ReachPositionCondition reachPositionCondition({{""}, 1.2, - []() { return std::make_optional<Pose>({{1.0_m, 2.0_m, 3.0_m}, {}}); }}, - {std::make_shared<MockEnvironment>()}); + []() + { return std::make_optional<Pose>({{1.0_m, 2.0_m, 3.0_m}, {}}); }}, + {std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>()}); ASSERT_FALSE(reachPositionCondition.IsSatisfied()); -} \ No newline at end of file +} diff --git a/engine/tests/Storyboard/ByEntityCondition/RelativeDistanceConditionTest.cpp b/engine/tests/Storyboard/ByEntityCondition/RelativeDistanceConditionTest.cpp index a51170060fd7dfd1a48fb34ebbbb170b4a8214f2..307b92e86d937015c0e563d475d9875581aa692f 100644 --- a/engine/tests/Storyboard/ByEntityCondition/RelativeDistanceConditionTest.cpp +++ b/engine/tests/Storyboard/ByEntityCondition/RelativeDistanceConditionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -9,11 +9,11 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include "Conversion/OscToMantle/ConvertScenarioRule.h" #include "Storyboard/ByEntityCondition/RelativeDistanceCondition_impl.h" +#include "TestUtils.h" #include "TestUtils/TestLogger.h" using namespace mantle_api; @@ -29,15 +29,15 @@ class RelativeDistanceConditionTestFixture : public ::testing::Test protected: void SetUp() override { - mock_environment_ = std::make_shared<MockEnvironment>(); + fake_environment_ = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); } mantle_api::MockVehicle& GET_VEHICLE_MOCK_WITH_NAME(const std::string& name) { - return dynamic_cast<mantle_api::MockVehicle&>(mock_environment_->GetEntityRepository().Get(name).value().get()); + return dynamic_cast<mantle_api::MockVehicle&>(*fake_environment_->GetEntityRepository().Get(name).lock()); } - std::shared_ptr<MockEnvironment> mock_environment_; + std::shared_ptr<testing::OpenScenarioEngine::v1_3::FakeEnvironment> fake_environment_; OpenScenarioEngine::v1_3::RelativeDistanceCondition::Values condition_values_{.triggeringEntity = "vehicle1", .freespace = true, .entityRef = "Ego", @@ -60,7 +60,7 @@ TEST_F(RelativeDistanceConditionTestFixture, GivenConditionWithLateralDistanceWi .WillRepeatedly(Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); OpenScenarioEngine::v1_3::RelativeDistanceCondition relative_distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); // Note: The actual return value of the condition is not being checked, // as the MockEnvironment cannot calculate relative distances correctly. [[maybe_unused]] auto _ = relative_distance_condition.IsSatisfied(); @@ -82,7 +82,7 @@ TEST_F( .WillRepeatedly(Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); OpenScenarioEngine::v1_3::RelativeDistanceCondition relative_distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); // Note: The actual return value of the condition is not being checked, // as the MockEnvironment cannot calculate relative distances correctly. [[maybe_unused]] auto _ = relative_distance_condition.IsSatisfied(); @@ -102,7 +102,7 @@ TEST_F( .WillRepeatedly(Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); OpenScenarioEngine::v1_3::RelativeDistanceCondition relative_distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); // Note: The actual return value of the condition is not being checked, // as the MockEnvironment cannot calculate relative distances correctly. [[maybe_unused]] auto _ = relative_distance_condition.IsSatisfied(); @@ -114,10 +114,10 @@ protected: void SetUp() override { LOGGER = std::make_unique<testing::OpenScenarioEngine::v1_3::TestLogger>(); - mock_environment_ = std::make_shared<MockEnvironment>(); + fake_environment_ = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); } - std::shared_ptr<MockEnvironment> mock_environment_; + std::shared_ptr<testing::OpenScenarioEngine::v1_3::FakeEnvironment> fake_environment_; OpenScenarioEngine::v1_3::RelativeDistanceCondition::Values condition_values_{.triggeringEntity = "vehicle1", .freespace = true, .entityRef = "Ego", @@ -138,7 +138,7 @@ TEST_P( std::tie(condition_values_.coordinateSystem, condition_values_.freespace, condition_values_.relativeDistanceType) = GetParam(); OpenScenarioEngine::v1_3::RelativeDistanceCondition relative_distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_FALSE(relative_distance_condition.IsSatisfied()); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kError); diff --git a/engine/tests/Storyboard/ByEntityCondition/RelativeSpeedConditionTest.cpp b/engine/tests/Storyboard/ByEntityCondition/RelativeSpeedConditionTest.cpp index 7ef1585a160769917007da6109937f5234ef2ba0..14b85fe5fabe8567695f621dee08bdda206db374 100644 --- a/engine/tests/Storyboard/ByEntityCondition/RelativeSpeedConditionTest.cpp +++ b/engine/tests/Storyboard/ByEntityCondition/RelativeSpeedConditionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -9,13 +9,13 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include "Conversion/OscToMantle/ConvertScenarioRule.h" #include "Storyboard/ByEntityCondition/RelativeSpeedCondition_impl.h" +#include "TestUtils.h" -using namespace mantle_api; +using namespace testing::OpenScenarioEngine::v1_3; using units::literals::operator""_mps; class RelativeSpeedConditionTestFixture : public ::testing::Test @@ -23,10 +23,10 @@ class RelativeSpeedConditionTestFixture : public ::testing::Test protected: void SetUp() override { - mock_environment_ = std::make_shared<MockEnvironment>(); + fake_environment_ = std::make_shared<FakeEnvironment>(); } - std::shared_ptr<MockEnvironment> mock_environment_; + std::shared_ptr<FakeEnvironment> fake_environment_; OpenScenarioEngine::v1_3::RelativeSpeedCondition::Values condition_values_{.triggeringEntity = "vehicle1", .entityRef = "Ego", .rule = OpenScenarioEngine::v1_3::Rule(NET_ASAM_OPENSCENARIO::v1_3::Rule::RuleEnum::EQUAL_TO, 10.0)}; @@ -35,7 +35,7 @@ protected: TEST_F(RelativeSpeedConditionTestFixture, GivenMockedEntities_WhenCheckingCondition_ThenDoesNotThrow) { OpenScenarioEngine::v1_3::RelativeSpeedCondition relativeSpeedCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_NO_THROW([[maybe_unused]] auto _ = relativeSpeedCondition.IsSatisfied()); } @@ -43,14 +43,14 @@ TEST_F(RelativeSpeedConditionTestFixture, GivenMockedEntities_WhenCheckingCondit TEST_F(RelativeSpeedConditionTestFixture, GivenSatisfcatoryVelocities_WhenCheckingCondition_ThenReturnsTrue) { OpenScenarioEngine::v1_3::RelativeSpeedCondition relativeSpeedCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); // Note: It would be better to have to two distinct ON_CALL statements, one for each entity/MockVehicle to define their respective velocities. // However, this is currently not possible, as the MockEntityRepository always returns an empty entity on Get(). // This could be circumvented by returning a proper entity via the mocked GetImpl() function, but it is not straightforward to create such an entity, // as it would have to implement the complete IVehicle interface. - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(mock_environment_->GetEntityRepository().Get(condition_values_.entityRef).value().get()), + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*fake_environment_->GetEntityRepository().Get(condition_values_.entityRef).lock()), GetVelocity()) .WillOnce(::testing::Return(mantle_api::Vec3<units::velocity::meters_per_second_t>{20.0_mps, 0_mps, 0_mps})) .WillOnce(::testing::Return(mantle_api::Vec3<units::velocity::meters_per_second_t>{10.0_mps, 0_mps, 0_mps})); @@ -61,17 +61,17 @@ TEST_F(RelativeSpeedConditionTestFixture, GivenSatisfcatoryVelocities_WhenChecki TEST_F(RelativeSpeedConditionTestFixture, GivenUnsatisfcatoryVelocities_WhenCheckingCondition_ThenReturnsFalse) { OpenScenarioEngine::v1_3::RelativeSpeedCondition relativeSpeedCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); // Note: It would be better to have to two distinct ON_CALL statements, one for each entity/MockVehicle to define their respective velocities. // However, this is currently not possible, as the MockEntityRepository always returns an empty entity on Get(). // This could be circumvented by returning a proper entity via the mocked GetImpl() function, but it is not straightforward to create such an entity, // as it would have to implement the complete IVehicle interface. - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(mock_environment_->GetEntityRepository().Get(condition_values_.entityRef).value().get()), + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*fake_environment_->GetEntityRepository().Get(condition_values_.entityRef).lock()), GetVelocity()) .WillOnce(::testing::Return(mantle_api::Vec3<units::velocity::meters_per_second_t>{15.0_mps, 0_mps, 0_mps})) .WillOnce(::testing::Return(mantle_api::Vec3<units::velocity::meters_per_second_t>{10.0_mps, 0_mps, 0_mps})); EXPECT_THAT(relativeSpeedCondition.IsSatisfied(), false); -} \ No newline at end of file +} diff --git a/engine/tests/Storyboard/ByEntityCondition/SpeedConditionTest.cpp b/engine/tests/Storyboard/ByEntityCondition/SpeedConditionTest.cpp index 205820fda0e04cae2458b1b0718adc506ca592db..db058103198ea09468f34cfe5be0059672fb9cc9 100644 --- a/engine/tests/Storyboard/ByEntityCondition/SpeedConditionTest.cpp +++ b/engine/tests/Storyboard/ByEntityCondition/SpeedConditionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,12 +8,12 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include <openScenarioLib/generated/v1_3/impl/ApiClassImplV1_3.h> #include "Conversion/OscToMantle/ConvertScenarioRule.h" #include "Storyboard/ByEntityCondition/SpeedCondition.h" +#include "TestUtils.h" #include "TestUtils/FakeCompositeNode.h" using namespace mantle_api; @@ -24,13 +24,13 @@ class SpeedConditionTestFixture : public ::testing::Test protected: void SetUp() override { - mock_environment_ = std::make_shared<MockEnvironment>(); + fake_environment_ = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); osc_api_speed_condition_ = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::SpeedConditionImpl>(); osc_api_speed_condition_->SetRule(NET_ASAM_OPENSCENARIO::v1_3::Rule::RuleEnum::LESS_THAN); osc_api_speed_condition_->SetValue(1.0); } - std::shared_ptr<MockEnvironment> mock_environment_; + std::shared_ptr<testing::OpenScenarioEngine::v1_3::FakeEnvironment> fake_environment_; OpenScenarioEngine::v1_3::SpeedCondition::Values condition_values_{.triggeringEntity = "vehicle1", .rule = OpenScenarioEngine::v1_3::Rule(NET_ASAM_OPENSCENARIO::v1_3::Rule::RuleEnum::LESS_THAN, 1.0)}; std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::SpeedConditionImpl> osc_api_speed_condition_{nullptr}; @@ -38,7 +38,7 @@ protected: TEST_F(SpeedConditionTestFixture, GivenSpeedConditionNodeWithoutEntityBrokerInParentBlackboard_WhenCheckingCondition_ThenDoesNotThrow) { - auto fake_composite_node = testing::OpenScenarioEngine::v1_3::FakeCompositeNode(mock_environment_); + auto fake_composite_node = testing::OpenScenarioEngine::v1_3::FakeCompositeNode(fake_environment_); auto speed_condition = std::make_shared<OpenScenarioEngine::v1_3::Node::SpeedCondition>(osc_api_speed_condition_); fake_composite_node.addChild(speed_condition); fake_composite_node.distributeData(); @@ -49,7 +49,7 @@ TEST_F(SpeedConditionTestFixture, GivenSpeedConditionNodeWithoutEntityBrokerInPa TEST_F(SpeedConditionTestFixture, GivenSpeedConditionNodeWithEntityBrokerInParentBlackboard_WhenCheckingCondition_ThenEntityBrokerContainsTriggeringEntity) { - auto fake_composite_node = testing::OpenScenarioEngine::v1_3::FakeCompositeNode(mock_environment_, true); + auto fake_composite_node = testing::OpenScenarioEngine::v1_3::FakeCompositeNode(fake_environment_, true); auto speed_condition = std::make_shared<OpenScenarioEngine::v1_3::Node::SpeedCondition>(osc_api_speed_condition_); fake_composite_node.addChild(speed_condition); fake_composite_node.distributeData(); @@ -62,7 +62,7 @@ TEST_F(SpeedConditionTestFixture, GivenSpeedConditionNodeWithEntityBrokerInParen TEST_F(SpeedConditionTestFixture, GivenSpeedConditionImplWithMockedEntities_WhenCheckingCondition_ThenDoesNotThrow) { OpenScenarioEngine::v1_3::SpeedCondition speedCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_NO_THROW([[maybe_unused]] auto _ = speedCondition.IsSatisfied()); } @@ -70,9 +70,9 @@ TEST_F(SpeedConditionTestFixture, GivenSpeedConditionImplWithMockedEntities_When TEST_F(SpeedConditionTestFixture, GivenSpeedConditionImplWithSatisfcatoryVelocity_WhenCheckingCondition_ThenReturnsTrue) { OpenScenarioEngine::v1_3::SpeedCondition speedCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(mock_environment_->GetEntityRepository().Get(condition_values_.triggeringEntity).value().get()), + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(*fake_environment_->GetEntityRepository().Get(condition_values_.triggeringEntity).lock()), GetVelocity()) .WillOnce(::testing::Return(mantle_api::Vec3<units::velocity::meters_per_second_t>{0.0_mps, 0_mps, 0_mps})); @@ -82,9 +82,9 @@ TEST_F(SpeedConditionTestFixture, GivenSpeedConditionImplWithSatisfcatoryVelocit TEST_F(SpeedConditionTestFixture, GivenSpeedConditionImplWithUnsatisfcatoryVelocity_WhenCheckingCondition_ThenReturnsFalse) { OpenScenarioEngine::v1_3::SpeedCondition speedCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(mock_environment_->GetEntityRepository().Get(condition_values_.triggeringEntity).value().get()), + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(*fake_environment_->GetEntityRepository().Get(condition_values_.triggeringEntity).lock()), GetVelocity()) .WillOnce(::testing::Return(mantle_api::Vec3<units::velocity::meters_per_second_t>{10.0_mps, 0_mps, 0_mps})); diff --git a/engine/tests/Storyboard/ByEntityCondition/TimeHeadwayConditionTest.cpp b/engine/tests/Storyboard/ByEntityCondition/TimeHeadwayConditionTest.cpp index 89ee7348ae99dd8733060e80c08ae41ed62b6aae..e325b35b9b0c36a2e8378320c1504423b532fa42 100644 --- a/engine/tests/Storyboard/ByEntityCondition/TimeHeadwayConditionTest.cpp +++ b/engine/tests/Storyboard/ByEntityCondition/TimeHeadwayConditionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -9,11 +9,11 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include "Conversion/OscToMantle/ConvertScenarioRule.h" #include "Storyboard/ByEntityCondition/TimeHeadwayCondition_impl.h" +#include "TestUtils.h" #include "TestUtils/TestLogger.h" #include "Utils/Constants.h" @@ -32,10 +32,10 @@ protected: void SetUp() override { LOGGER = std::make_unique<testing::OpenScenarioEngine::v1_3::TestLogger>(); - mock_environment_ = std::make_shared<MockEnvironment>(); + fake_environment_ = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); } - std::shared_ptr<MockEnvironment> mock_environment_; + std::shared_ptr<testing::OpenScenarioEngine::v1_3::FakeEnvironment> fake_environment_; OpenScenarioEngine::v1_3::TimeHeadwayCondition::Values condition_values_{.triggeringEntity = "Vehicle1", .alongRoute = false, .freespace = false, @@ -52,7 +52,7 @@ TEST_F(TimeHeadwayConditionTestFixture, condition_values_.relativeDistanceType = OpenScenarioEngine::v1_3::RelativeDistanceType::kLateral; auto time_headway_condition = OpenScenarioEngine::v1_3::TimeHeadwayCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_FALSE(time_headway_condition.IsSatisfied()); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kError); @@ -65,7 +65,7 @@ TEST_F(TimeHeadwayConditionTestFixture, condition_values_.relativeDistanceType = OpenScenarioEngine::v1_3::RelativeDistanceType::kEuclidian_distance; auto time_headway_condition = OpenScenarioEngine::v1_3::TimeHeadwayCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_FALSE(time_headway_condition.IsSatisfied()); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kError); @@ -78,7 +78,7 @@ TEST_F(TimeHeadwayConditionTestFixture, condition_values_.coordinateSystem = OpenScenarioEngine::v1_3::CoordinateSystem::kTrajectory; auto time_headway_condition = OpenScenarioEngine::v1_3::TimeHeadwayCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_FALSE(time_headway_condition.IsSatisfied()); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kError); @@ -91,7 +91,7 @@ TEST_F(TimeHeadwayConditionTestFixture, condition_values_.coordinateSystem = OpenScenarioEngine::v1_3::CoordinateSystem::kRoad; auto time_headway_condition = OpenScenarioEngine::v1_3::TimeHeadwayCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_FALSE(time_headway_condition.IsSatisfied()); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kError); @@ -103,14 +103,14 @@ TEST_F(TimeHeadwayConditionTestFixture, { condition_values_.coordinateSystem = OpenScenarioEngine::v1_3::CoordinateSystem::kLane; - auto& mocked_query_service = dynamic_cast<const mantle_api::MockQueryService&>(mock_environment_->GetQueryService()); + auto& mocked_query_service = dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fake_environment_->GetQueryService()); EXPECT_CALL(mocked_query_service, GetLongitudinalLaneDistanceBetweenPositions(_, _)) .Times(1) .WillRepeatedly(Return(std::nullopt)); auto time_headway_condition = OpenScenarioEngine::v1_3::TimeHeadwayCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_THROW(time_headway_condition.IsSatisfied(), std::runtime_error); } @@ -125,15 +125,15 @@ TEST_F( condition_values_.rule = rule; condition_values_.coordinateSystem = OpenScenarioEngine::v1_3::CoordinateSystem::kEntity; - auto& mocked_geo_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*(mock_environment_->GetGeometryHelper())); - auto& mocked_entity = dynamic_cast<mantle_api::MockVehicle&>(mock_environment_->GetEntityRepository().Get("").value().get()); + auto& mocked_geo_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*(fake_environment_->GetGeometryHelper())); + auto& mocked_entity = dynamic_cast<mantle_api::MockVehicle&>(*fake_environment_->GetEntityRepository().Get("").lock()); EXPECT_CALL(mocked_geo_helper, TranslateGlobalPositionLocally(_, _, _)) .WillRepeatedly(Return(mantle_api::Vec3<units::length::meter_t>{10.0_m, 0_m, 0_m})); EXPECT_CALL(mocked_entity, GetVelocity()) .WillOnce(Return(TriggeringEntityVelocity{0.0_mps, 0.0_mps, 0.0_mps})); auto time_headway_condition = OpenScenarioEngine::v1_3::TimeHeadwayCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_EQ(time_headway_condition.IsSatisfied(), true); } @@ -208,8 +208,8 @@ TEST_P(TimeHeadwayConditionTestForCoordinateSystem, condition_values_.rule = rule; condition_values_.coordinateSystem = OpenScenarioEngine::v1_3::CoordinateSystem::kEntity; - auto& mocked_geo_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*(mock_environment_->GetGeometryHelper())); - auto& mocked_entity = dynamic_cast<mantle_api::MockVehicle&>(mock_environment_->GetEntityRepository().Get("").value().get()); + auto& mocked_geo_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*(fake_environment_->GetGeometryHelper())); + auto& mocked_entity = dynamic_cast<mantle_api::MockVehicle&>(*fake_environment_->GetEntityRepository().Get("").lock()); // Test though stubbed function TranslateGlobalPositionLocally that is used by both // CalculateLongitudinalFreeSpaceDistance and CalculateRelativeLongitudinalDistance @@ -218,7 +218,7 @@ TEST_P(TimeHeadwayConditionTestForCoordinateSystem, EXPECT_CALL(mocked_entity, GetVelocity()).WillOnce(Return(triggering_entity_velocity_)); auto time_headway_condition = OpenScenarioEngine::v1_3::TimeHeadwayCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_EQ(time_headway_condition.IsSatisfied(), expected_satisfied_status_); } @@ -230,9 +230,9 @@ TEST_P(TimeHeadwayConditionTestForCoordinateSystemWithFreespaceTrue, condition_values_.rule = rule; condition_values_.coordinateSystem = OpenScenarioEngine::v1_3::CoordinateSystem::kLane; - auto& mocked_query_service = dynamic_cast<const mantle_api::MockQueryService&>(mock_environment_->GetQueryService()); - auto& mocked_entity = dynamic_cast<mantle_api::MockVehicle&>(mock_environment_->GetEntityRepository().Get("").value().get()); - auto& mocked_geo_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*(mock_environment_->GetGeometryHelper())); + auto& mocked_query_service = dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fake_environment_->GetQueryService()); + auto& mocked_entity = dynamic_cast<mantle_api::MockVehicle&>(*fake_environment_->GetEntityRepository().Get("").lock()); + auto& mocked_geo_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*(fake_environment_->GetGeometryHelper())); EXPECT_CALL(mocked_entity, GetVelocity()).WillOnce(Return(triggering_entity_velocity_)); @@ -261,7 +261,7 @@ TEST_P(TimeHeadwayConditionTestForCoordinateSystemWithFreespaceTrue, .WillRepeatedly(Return(other_corner)); auto time_headway_condition = OpenScenarioEngine::v1_3::TimeHeadwayCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_EQ(time_headway_condition.IsSatisfied(), expected_satisfied_status_); } @@ -273,8 +273,8 @@ TEST_P(TimeHeadwayConditionTestForCoordinateSystemWithFreespaceFalse, condition_values_.rule = rule; condition_values_.coordinateSystem = OpenScenarioEngine::v1_3::CoordinateSystem::kLane; - auto& mocked_query_service = dynamic_cast<const mantle_api::MockQueryService&>(mock_environment_->GetQueryService()); - auto& mocked_entity = dynamic_cast<mantle_api::MockVehicle&>(mock_environment_->GetEntityRepository().Get("").value().get()); + auto& mocked_query_service = dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fake_environment_->GetQueryService()); + auto& mocked_entity = dynamic_cast<mantle_api::MockVehicle&>(*fake_environment_->GetEntityRepository().Get("").lock()); EXPECT_CALL(mocked_entity, GetVelocity()).WillOnce(Return(triggering_entity_velocity_)); @@ -282,7 +282,7 @@ TEST_P(TimeHeadwayConditionTestForCoordinateSystemWithFreespaceFalse, .WillOnce(Return(relative_distance_)); auto time_headway_condition = OpenScenarioEngine::v1_3::TimeHeadwayCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_EQ(time_headway_condition.IsSatisfied(), expected_satisfied_status_); } diff --git a/engine/tests/Storyboard/ByEntityCondition/TimeToCollisionConditionTest.cpp b/engine/tests/Storyboard/ByEntityCondition/TimeToCollisionConditionTest.cpp index 59d662a67b957cad904c72c3b3286a5a1bd4121d..a7e51cac47cc71c179decc380ac556e106b29d96 100644 --- a/engine/tests/Storyboard/ByEntityCondition/TimeToCollisionConditionTest.cpp +++ b/engine/tests/Storyboard/ByEntityCondition/TimeToCollisionConditionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -9,11 +9,11 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include "Conversion/OscToMantle/ConvertScenarioRule.h" #include "Storyboard/ByEntityCondition/TimeToCollisionCondition_impl.h" +#include "TestUtils.h" #include "TestUtils/TestLogger.h" using namespace mantle_api; @@ -28,10 +28,10 @@ protected: void SetUp() override { LOGGER = std::make_unique<testing::OpenScenarioEngine::v1_3::TestLogger>(); - mock_environment_ = std::make_shared<MockEnvironment>(); + fake_environment_ = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); } - std::shared_ptr<MockEnvironment> mock_environment_; + std::shared_ptr<testing::OpenScenarioEngine::v1_3::FakeEnvironment> fake_environment_; OpenScenarioEngine::v1_3::TimeToCollisionCondition::Values condition_values_{ .triggeringEntity = "vehicle1", @@ -48,7 +48,7 @@ protected: TEST_F(TimeToCollisionConditionTestFixture, GivenEmptyTtcTarget_WhenCheckingCondition_ThenThrows) { OpenScenarioEngine::v1_3::TimeToCollisionCondition timeToCollisionCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_THROW(std::ignore = timeToCollisionCondition.IsSatisfied(), std::runtime_error); } @@ -60,7 +60,7 @@ TEST_F(TimeToCollisionConditionTestFixture, GivenPoseWithTtcTarget_WhenCheckingC condition_values_.timeToCollisionConditionTarget = OpenScenarioEngine::v1_3::TimeToCollisionConditionTarget{pose}; OpenScenarioEngine::v1_3::TimeToCollisionCondition timeToCollisionCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_TRUE(timeToCollisionCondition.IsSatisfied()); @@ -73,7 +73,7 @@ TEST_F(TimeToCollisionConditionTestFixture, GivenInvalidPoseWithTtcTarget_WhenCh condition_values_.timeToCollisionConditionTarget = OpenScenarioEngine::v1_3::TimeToCollisionConditionTarget{std::nullopt}; OpenScenarioEngine::v1_3::TimeToCollisionCondition timeToCollisionCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_THROW(std::ignore = timeToCollisionCondition.IsSatisfied(), std::runtime_error); } @@ -84,7 +84,7 @@ TEST_F(TimeToCollisionConditionTestFixture, GivenEntityWithTtcTarget_WhenCheckin condition_values_.timeToCollisionConditionTarget = OpenScenarioEngine::v1_3::TimeToCollisionConditionTarget{"ego"}; OpenScenarioEngine::v1_3::TimeToCollisionCondition timeToCollisionCondition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_TRUE(timeToCollisionCondition.IsSatisfied()); diff --git a/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp b/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp index 07417f459115d64f525f2eff18ed7ecd47ce2ac1..e30de93d01b325110cf75fa25242606216ee284d 100644 --- a/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp +++ b/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp @@ -1,5 +1,6 @@ /******************************************************************************** * Copyright (c) 2025 Ansys, Inc. + * Copyright (c) 2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,10 +9,10 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include "Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h" +#include "TestUtils.h" #include "TestUtils/TestLogger.h" using namespace mantle_api; @@ -25,12 +26,12 @@ class TraveledDistanceConditionTestFixture : public ::testing::Test protected: void SetUp() override { - mock_environment_ = std::make_shared<MockEnvironment>(); - auto &entity_ref = mock_environment_->GetEntityRepository().Get(condition_values_.triggeringEntity)->get(); - entity_under_test_ = dynamic_cast<MockVehicle *>(&entity_ref); + fake_environment_ = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); + auto entity_ref = fake_environment_->GetEntityRepository().Get(condition_values_.triggeringEntity).lock(); + entity_under_test_ = dynamic_cast<MockVehicle *>(entity_ref.get()); } - std::shared_ptr<MockEnvironment> mock_environment_; + std::shared_ptr<MockEnvironment> fake_environment_; MockVehicle *entity_under_test_; OpenScenarioEngine::v1_3::TraveledDistanceCondition::Values condition_values_{.triggeringEntity = "vehicle1", .value = 5.0}; @@ -39,7 +40,7 @@ protected: TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithMockedEntities_WhenCheckingCondition_ThenDoesNotThrow) { OpenScenarioEngine::v1_3::TraveledDistanceCondition traveled_distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_NO_THROW([[maybe_unused]] auto _ = traveled_distance_condition.IsSatisfied()); } @@ -47,7 +48,7 @@ TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithMockedEntities_Wh TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithNoMovement_WhenCheckingCondition_ThenReturnsFalse) { OpenScenarioEngine::v1_3::TraveledDistanceCondition traveled_distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_CALL(*entity_under_test_, GetPosition()) .WillOnce(Return(TestPosition{0_m, 0_m, 0_m})); @@ -58,7 +59,7 @@ TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithNoMovement_WhenCh TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithSatisfcatoryTraveledDistance_WhenCheckingCondition_ThenReturnsTrue) { OpenScenarioEngine::v1_3::TraveledDistanceCondition traveled_distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_CALL(*entity_under_test_, GetPosition()) .WillOnce(Return(TestPosition{1_m, 1_m, 1_m})) @@ -72,7 +73,7 @@ TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithSatisfcatoryTrave TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithUnsatisfcatoryTraveledDistance_WhenCheckingCondition_ThenReturnsFalse) { OpenScenarioEngine::v1_3::TraveledDistanceCondition traveled_distance_condition(condition_values_, - {mock_environment_}); + {fake_environment_}); EXPECT_CALL(*entity_under_test_, GetPosition()) .WillOnce(Return(TestPosition{1_m, 1_m, 1_m})) diff --git a/engine/tests/Storyboard/ByValueCondition/SimulationTimeConditionTest.cpp b/engine/tests/Storyboard/ByValueCondition/SimulationTimeConditionTest.cpp index 093020209808e8eed0398ba9fb9aec7453317678..f4157770e31ee0d733d90bee81b68ea2197cbb04 100644 --- a/engine/tests/Storyboard/ByValueCondition/SimulationTimeConditionTest.cpp +++ b/engine/tests/Storyboard/ByValueCondition/SimulationTimeConditionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -9,7 +9,7 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> +#include <MantleAPI/Execution/mock_environment.h> #include <gtest/gtest.h> #include "Conversion/OscToMantle/ConvertScenarioRule.h" @@ -61,4 +61,4 @@ TEST_F(SimulationTimeConditionTestFixture, GivenUnsatisfactorySimulationTime_Whe {mock_environment_}); EXPECT_FALSE(simulationTimeCondition.IsSatisfied()); -} \ No newline at end of file +} diff --git a/engine/tests/Storyboard/ByValueCondition/UserDefinedValueConditionTest.cpp b/engine/tests/Storyboard/ByValueCondition/UserDefinedValueConditionTest.cpp index 36d2eec96668de8a5b48d91a47944c30543672e9..c1022857661feae0eafb422c8691b4ef9e7e6e76 100644 --- a/engine/tests/Storyboard/ByValueCondition/UserDefinedValueConditionTest.cpp +++ b/engine/tests/Storyboard/ByValueCondition/UserDefinedValueConditionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -9,15 +9,15 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> +#include <MantleAPI/Execution/mock_environment.h> #include <gtest/gtest.h> #include "Storyboard/ByValueCondition/UserDefinedValueCondition_impl.h" using namespace mantle_api; using namespace units::literals; -using testing::Return; using testing::_; +using testing::Return; class UserDefinedValueConditionTestFixture : public ::testing::Test { diff --git a/engine/tests/Storyboard/GenericAction/AcquirePositionActionTest.cpp b/engine/tests/Storyboard/GenericAction/AcquirePositionActionTest.cpp index fca08970b1259ed9bef691ec52f070392a0a2658..1a67001153cf1ff1f18eae14f8ec4524879fcd2f 100644 --- a/engine/tests/Storyboard/GenericAction/AcquirePositionActionTest.cpp +++ b/engine/tests/Storyboard/GenericAction/AcquirePositionActionTest.cpp @@ -9,7 +9,7 @@ ********************************************************************************/ #include <MantleAPI/Common/position.h> -#include <MantleAPI/Test/test_utils.h> +#include <MantleAPI/Map/mock_route.h> #include <gmock/gmock.h> #include <gtest/gtest.h> @@ -17,6 +17,7 @@ #include <stdexcept> #include "Storyboard/GenericAction/AcquirePositionAction_impl.h" +#include "TestUtils.h" using testing::_; using testing::Return; @@ -27,46 +28,48 @@ using testing::SizeIs; using namespace mantle_api; using namespace units::literals; using namespace OpenScenarioEngine::v1_3; +using namespace testing::OpenScenarioEngine::v1_3; TEST(AcquirePositionAction, Stepping_FinishesImmediately) { AcquirePositionAction acquirePositionAction( - {std::vector<std::string>{}, []() -> mantle_api::Pose { return {}; }}, + {std::vector<std::string>{}, []() -> mantle_api::Pose + { return {}; }}, {std::make_shared<MockEnvironment>()}); ASSERT_TRUE(acquirePositionAction.Step()); } TEST(AcquirePositionAction, GivenValidTargetPosition_SetsRouteDefinitionFromCurrentToTargetPosition) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); - auto& mockEntityRepository = static_cast<MockEntityRepository&>(mockEnvironment->GetEntityRepository()); - const auto& host_optional = mockEntityRepository.GetHost(); - ASSERT_TRUE(host_optional.has_value()); - MockVehicle* mockHostVehiclePtr{dynamic_cast<MockVehicle*>(&host_optional.value().get())}; - ASSERT_NE(mockHostVehiclePtr, nullptr) << "Failed to cast host to MockVehicle."; - MockVehicle& mockHostVehicle = *mockHostVehiclePtr; - - RouteDefinition route_definition{}; - EXPECT_CALL(*mockEnvironment, AssignRoute(_, _)).WillOnce(SaveArg<1>(&route_definition)); + auto fakeEnvironment = std::make_shared<FakeEnvironment>(); + auto& mockEntityRepository = static_cast<MockEntityRepository&>(fakeEnvironment->GetEntityRepository()); + auto& mockHostVehicle = static_cast<MockVehicle&>(*mockEntityRepository.GetHost().lock()); Vec3<units::length::meter_t> current_position{1.2_m, 2.3_m, 4.5_m}; ON_CALL(mockHostVehicle, GetPosition()).WillByDefault(Return(current_position)); Pose target_pose{{5.6_m, 6.7_m, 7.8_m}, {}}; AcquirePositionAction acquirePositionAction( - {std::vector<std::string>{"Vehicle1"}, [&] { return target_pose; }}, - {mockEnvironment}); + {std::vector<std::string>{"Vehicle1"}, [&] + { return target_pose; }}, + {fakeEnvironment}); + + RoutingDefinition expected_routing_definition; + expected_routing_definition.routing_waypoints.push_back({current_position, RoutingStrategy::kShortest}); + expected_routing_definition.routing_waypoints.push_back({target_pose.position, RoutingStrategy::kShortest}); + std::shared_ptr<mantle_api::MockRoute> mock_route{std::make_shared<mantle_api::MockRoute>()}; + EXPECT_CALL(dynamic_cast<mantle_api::MockRouteRepository&>(fakeEnvironment->GetRouteRepository()), Create(_, expected_routing_definition)).WillOnce([mock_route](testing::Unused, testing::Unused) + { return mock_route; }); + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*fakeEnvironment->GetEntityRepository().Get("Vehicle1").lock()), SetRoute(_)); acquirePositionAction.Step(); - ASSERT_THAT(route_definition.waypoints, SizeIs(2)); - EXPECT_THAT(route_definition.waypoints[0].waypoint, current_position); - EXPECT_THAT(route_definition.waypoints[1].waypoint, target_pose.position); } TEST(AcquirePositionAction, GivenInvalidTargetPosition_Throws) { AcquirePositionAction acquirePositionAction( - {{{}, [] { return std::nullopt; }}, + {{{}, [] + { return std::nullopt; }}, {std::make_shared<MockEnvironment>()}}); ASSERT_THROW(acquirePositionAction.Step(), std::runtime_error); diff --git a/engine/tests/Storyboard/GenericAction/ActivateControllerActionTest.cpp b/engine/tests/Storyboard/GenericAction/ActivateControllerActionTest.cpp index d8f36438c199f7772857bd0cb570b74e42b30714..c68c4e9419c2249a061fbcfe027c966b1b27d0b3 100644 --- a/engine/tests/Storyboard/GenericAction/ActivateControllerActionTest.cpp +++ b/engine/tests/Storyboard/GenericAction/ActivateControllerActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2022-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2022-2025< Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,13 +8,11 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> -#include <MantleAPI/Traffic/i_controller.h> #include <gmock/gmock.h> #include <gtest/gtest.h> -#include "MantleAPI/Common/i_identifiable.h" #include "Storyboard/GenericAction/ActivateControllerAction_impl.h" +#include "TestUtils.h" #include "TestUtils/MockControllerService.h" #include "gmock/gmock.h" @@ -45,25 +43,25 @@ constexpr mantle_api::UniqueId TEST_CONTROLLER_ID{5678}; const std::optional<std::string> TEST_CONTROLLER_REF{"TEST_CONTROLLER"}; constexpr std::optional<bool> DONT_CARE{std::nullopt}; -class ActivateControllerAction : public testing::TestWithParam<ActivateControllerTestInputType> +class ActivateControllerActionTest : public testing::TestWithParam<ActivateControllerTestInputType> { protected: /// The mantle mock returns a MockVehicle, regardless of the queried name! /// Get the entity, cast it and set the ID void SET_ENTITY_ID(mantle_api::UniqueId id) { - auto& entity = mock_environment_->GetEntityRepository().Get("DOES_NOT_MATTER").value().get(); + auto& entity = *fake_environment_->GetEntityRepository().Get("DOES_NOT_MATTER").lock(); auto& vehicle = dynamic_cast<mantle_api::MockVehicle&>(entity); ON_CALL(vehicle, GetUniqueId()).WillByDefault(Return(id)); } - std::shared_ptr<mantle_api::MockEnvironment> mock_environment_{ - std::make_shared<mantle_api::MockEnvironment>()}; + std::shared_ptr<testing::OpenScenarioEngine::v1_3::FakeEnvironment> fake_environment_{ + std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>()}; std::shared_ptr<testing::OpenScenarioEngine::v1_3::MockControllerService> mock_controller_service_{ std::make_shared<testing::OpenScenarioEngine::v1_3::MockControllerService>()}; }; -TEST_P(ActivateControllerAction, +TEST_P(ActivateControllerActionTest, GivenLongitudinalAndLateralControllerFlags_WhenActionIsStepped_ThenLongitudinalAndLateralControllersAreSetOnlyIfNecessaryAndActionFinishes) { auto [desired_lateral_state, desired_longitudinal_state] = GetParam(); @@ -75,7 +73,7 @@ TEST_P(ActivateControllerAction, .lateral_state = desired_lateral_state, .lighting = DONT_CARE, .longitudinal_state = desired_longitudinal_state}, - {.environment = mock_environment_}, + {.environment = fake_environment_}, {.controllerService = mock_controller_service_}}; mantle_api::MockController mockController; @@ -103,5 +101,5 @@ TEST_P(ActivateControllerAction, } INSTANTIATE_TEST_SUITE_P(ActivateControllerActionCombinations, - ActivateControllerAction, + ActivateControllerActionTest, kActivateControllerTestInputs); diff --git a/engine/tests/Storyboard/GenericAction/AssignControllerActionTest.cpp b/engine/tests/Storyboard/GenericAction/AssignControllerActionTest.cpp index a44aecf47ef57ead80bc812eaf6ca6cd58d6e29f..91625396b414d347c28da02bba3c7e1b63c78591 100644 --- a/engine/tests/Storyboard/GenericAction/AssignControllerActionTest.cpp +++ b/engine/tests/Storyboard/GenericAction/AssignControllerActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2022-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2022-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,11 +8,11 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <MantleAPI/Traffic/i_controller_config.h> #include <gtest/gtest.h> #include "Storyboard/GenericAction/AssignControllerAction_impl.h" +#include "TestUtils.h" using testing::_; using testing::Return; @@ -22,56 +22,56 @@ static constexpr bool DONT_CARE{}; TEST(AssignControllerAction, AssignesControllerToEntity) { - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); + auto fakeEnvironment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); mantle_api::ExternalControllerConfig controller; - mantle_api::MockController mockController; - ON_CALL(mockController, GetUniqueId()).WillByDefault(Return(1234)); + auto mockController = std::make_shared<mantle_api::MockController>(); + ON_CALL(*mockController, GetUniqueId()).WillByDefault(Return(mantle_api::UniqueId(1234))); - auto& mockControllerRepository = mockEnvironment->GetControllerRepository(); - ON_CALL(mockControllerRepository, Create(_)).WillByDefault(ReturnRef(mockController)); + auto& mockControllerRepository = fakeEnvironment->GetControllerRepository(); + ON_CALL(mockControllerRepository, Create(_)).WillByDefault(Return(mockController)); - EXPECT_CALL(*mockEnvironment, AddEntityToController(_, 1234)); + EXPECT_CALL(*fakeEnvironment, AddEntityToController(_, mantle_api::UniqueId(1234))); OpenScenarioEngine::v1_3::AssignControllerAction assignControllerAction( - {{"Vehicle1"}, DONT_CARE, DONT_CARE, DONT_CARE, DONT_CARE, controller}, {mockEnvironment}); + {{"Vehicle1"}, DONT_CARE, DONT_CARE, DONT_CARE, DONT_CARE, controller}, {fakeEnvironment}); assignControllerAction.Step(); } /// Test Stub. Activate once we know, how to apply lateral and longitudinal TEST(DISABLED_AssignControllerAction, GivenLateral_NotImplementedYet) { - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); + auto fakeEnvironment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); mantle_api::ExternalControllerConfig controller; - mantle_api::MockController mockController; - ON_CALL(mockController, GetUniqueId()).WillByDefault(Return(1234)); + auto mockController = std::make_shared<mantle_api::MockController>(); + ON_CALL(*mockController, GetUniqueId()).WillByDefault(Return(mantle_api::UniqueId(1234))); - auto& mockControllerRepository = mockEnvironment->GetControllerRepository(); - ON_CALL(mockControllerRepository, Create(_)).WillByDefault(ReturnRef(mockController)); + auto& mockControllerRepository = fakeEnvironment->GetControllerRepository(); + ON_CALL(mockControllerRepository, Create(_)).WillByDefault(Return(mockController)); - EXPECT_CALL(*mockEnvironment, AddEntityToController(_, 1234)); + EXPECT_CALL(*fakeEnvironment, AddEntityToController(_, mantle_api::UniqueId(1234))); OpenScenarioEngine::v1_3::AssignControllerAction assignControllerAction( - {{"Vehicle1"}, DONT_CARE, true, DONT_CARE, false, controller}, {mockEnvironment}); + {{"Vehicle1"}, DONT_CARE, true, DONT_CARE, false, controller}, {fakeEnvironment}); assignControllerAction.Step(); } /// Test Stub. Activate once we know, how to apply lateral and longitudinal TEST(DISABLED_AssignControllerAction, GivenLongitudinal_NotImplementedYet) { - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); + auto fakeEnvironment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); mantle_api::ExternalControllerConfig controller; - mantle_api::MockController mockController; - ON_CALL(mockController, GetUniqueId()).WillByDefault(Return(1234)); + auto mockController = std::make_shared<mantle_api::MockController>(); + ON_CALL(*mockController, GetUniqueId()).WillByDefault(Return(mantle_api::UniqueId(1234))); - auto& mockControllerRepository = mockEnvironment->GetControllerRepository(); - ON_CALL(mockControllerRepository, Create(_)).WillByDefault(ReturnRef(mockController)); + auto& mockControllerRepository = fakeEnvironment->GetControllerRepository(); + ON_CALL(mockControllerRepository, Create(_)).WillByDefault(Return(mockController)); - EXPECT_CALL(*mockEnvironment, AddEntityToController(_, 1234)); + EXPECT_CALL(*fakeEnvironment, AddEntityToController(_, mantle_api::UniqueId(1234))); OpenScenarioEngine::v1_3::AssignControllerAction assignControllerAction( - {{"Vehicle1"}, DONT_CARE, false, DONT_CARE, true, controller}, {mockEnvironment}); + {{"Vehicle1"}, DONT_CARE, false, DONT_CARE, true, controller}, {fakeEnvironment}); assignControllerAction.Step(); } diff --git a/engine/tests/Storyboard/GenericAction/AssignRouteActionTest.cpp b/engine/tests/Storyboard/GenericAction/AssignRouteActionTest.cpp index 48a1776ba9569727492617d36abcbbfe778a80d2..da33f15a0248ed28adf3879532694d467c223b76 100644 --- a/engine/tests/Storyboard/GenericAction/AssignRouteActionTest.cpp +++ b/engine/tests/Storyboard/GenericAction/AssignRouteActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -9,16 +9,16 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> +#include <MantleAPI/Map/mock_route.h> #include <gmock/gmock-matchers.h> #include <gtest/gtest.h> -#include "builders/ActionBuilder.h" -#include "builders/PositionBuilder.h" #include "Conversion/OscToMantle/ConvertScenarioRoute.h" #include "Storyboard/GenericAction/AssignRouteAction.h" #include "Storyboard/GenericAction/AssignRouteAction_impl.h" #include "TestUtils.h" +#include "builders/ActionBuilder.h" +#include "builders/PositionBuilder.h" #include "gmock/gmock.h" using namespace mantle_api; @@ -27,137 +27,100 @@ using testing::NotNull; using testing::Return; using testing::SizeIs; using namespace units::literals; -using testing::OpenScenarioEngine::v1_3::OpenScenarioEngineLibraryTestBase; using testing::OpenScenarioEngine::v1_3::FakeRootNode; +using testing::OpenScenarioEngine::v1_3::OpenScenarioEngineLibraryTestBase; class AssignRouteActionTestFixture : public OpenScenarioEngineLibraryTestBase { - protected: - void SetUp() override { OpenScenarioEngineLibraryTestBase::SetUp(); } }; -MATCHER_P(IsRouteDefinitionSame, route_definition, "Waypoints or route strategy do not match") -{ - bool are_waypoints_equal = false; - bool are_route_strategies_equal = false; - - for (size_t j = 0; j < route_definition.waypoints. - - size(); - - ++j) - { - are_waypoints_equal = (arg.waypoints.at(j).waypoint.x == route_definition.waypoints.at(j).waypoint.x && - arg.waypoints.at(j).waypoint.y == route_definition.waypoints.at(j).waypoint.y && - arg.waypoints.at(j).waypoint.z == route_definition.waypoints.at(j).waypoint.z); - are_route_strategies_equal = - (arg.waypoints.at(j).route_strategy == route_definition.waypoints.at(j).route_strategy); - if (are_waypoints_equal == true && are_route_strategies_equal == true) - { - continue; - } - else - { - return false; - } - } - return true; -} - TEST_F(AssignRouteActionTestFixture, GivenAssignRouteAction_WhenStartAction_ThenRouteAssignedAndNoExceptionInStep) { - using namespace testing::OpenScenarioEngine::v1_3; + using namespace testing::OpenScenarioEngine::v1_3; - auto fake_assign_route_action = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::AssignRouteActionImpl>(); + auto fake_assign_route_action = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::AssignRouteActionImpl>(); - auto route = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::RouteImpl>(); + auto route = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::RouteImpl>(); + std::string expected_name = "MyRoute"; + route->SetName(expected_name); + route->SetClosed(true); - auto way_point_one = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::WaypointImpl>(); - auto way_point_two = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::WaypointImpl>(); + auto way_point_one = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::WaypointImpl>(); + auto way_point_two = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::WaypointImpl>(); - auto position_one = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::PositionImpl>(); - auto position_two = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::PositionImpl>(); + auto position_one = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::PositionImpl>(); + auto position_two = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::PositionImpl>(); - auto world_position_one = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::WorldPositionImpl>(); - auto world_position_two = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::WorldPositionImpl>(); + auto world_position_one = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::WorldPositionImpl>(); + auto world_position_two = std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::WorldPositionImpl>(); - world_position_one->SetX(1.0); - world_position_one->SetY(0.0); - world_position_one->SetZ(0.0); + world_position_one->SetX(1.0); + world_position_one->SetY(0.0); + world_position_one->SetZ(0.0); - world_position_two->SetX(42.0); - world_position_two->SetY(0.0); - world_position_two->SetZ(10.0); + world_position_two->SetX(42.0); + world_position_two->SetY(0.0); + world_position_two->SetZ(10.0); - position_one->SetWorldPosition(world_position_one); - position_two->SetWorldPosition(world_position_two); + position_one->SetWorldPosition(world_position_one); + position_two->SetWorldPosition(world_position_two); - way_point_one->SetPosition(position_one); - way_point_one->SetRouteStrategy(NET_ASAM_OPENSCENARIO::v1_3::RouteStrategy::RouteStrategyEnum::FASTEST); - way_point_two->SetPosition(position_two); - way_point_two->SetRouteStrategy(NET_ASAM_OPENSCENARIO::v1_3::RouteStrategy::RouteStrategyEnum::SHORTEST); + way_point_one->SetPosition(position_one); + way_point_one->SetRouteStrategy(NET_ASAM_OPENSCENARIO::v1_3::RouteStrategy::RouteStrategyEnum::FASTEST); + way_point_two->SetPosition(position_two); + way_point_two->SetRouteStrategy(NET_ASAM_OPENSCENARIO::v1_3::RouteStrategy::RouteStrategyEnum::SHORTEST); - std::vector<std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::IWaypointWriter>> route_way_points = {way_point_one, - way_point_two}; - route->SetWaypoints(route_way_points); - fake_assign_route_action->SetRoute(route); + std::vector<std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::IWaypointWriter>> route_way_points = {way_point_one, + way_point_two}; + route->SetWaypoints(route_way_points); + fake_assign_route_action->SetRoute(route); - auto assign_route_action = std::make_shared<OpenScenarioEngine::v1_3::Node::AssignRouteAction>(fake_assign_route_action); + auto assign_route_action = std::make_shared<OpenScenarioEngine::v1_3::Node::AssignRouteAction>(fake_assign_route_action); - mantle_api::RouteDefinition expected_route_definition{}; - expected_route_definition.waypoints.push_back(mantle_api::RouteWaypoint{ - mantle_api::Vec3<units::length::meter_t>{1_m, 0_m, 0_m}, mantle_api::RouteStrategy::kFastest}); - expected_route_definition.waypoints.push_back(mantle_api::RouteWaypoint{ - mantle_api::Vec3<units::length::meter_t>{42_m, 0_m, 10_m}, mantle_api::RouteStrategy::kShortest}); + mantle_api::RoutingDefinition expected_routing_definition{}; + expected_routing_definition.is_looped = true; + expected_routing_definition.routing_waypoints.push_back(mantle_api::RoutingWaypoint{ + mantle_api::Vec3<units::length::meter_t>{1_m, 0_m, 0_m}, mantle_api::RoutingStrategy::kFastest}); + expected_routing_definition.routing_waypoints.push_back(mantle_api::RoutingWaypoint{ + mantle_api::Vec3<units::length::meter_t>{42_m, 0_m, 10_m}, mantle_api::RoutingStrategy::kShortest}); - EXPECT_CALL(*env_, AssignRoute(testing::_, IsRouteDefinitionSame(expected_route_definition))) - .WillOnce(testing::SaveArg<1>(&expected_route_definition)); + EXPECT_CALL(dynamic_cast<mantle_api::MockRouteRepository&>(env_->GetRouteRepository()), Create(expected_name, expected_routing_definition)); + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("Ego").lock()), SetRoute(_)); - auto engine_abort_flags = std::make_shared<OpenScenarioEngine::v1_3::EngineAbortFlags>(OpenScenarioEngine::v1_3::EngineAbortFlags::kNoAbort); - auto entity_broker = std::make_shared<OpenScenarioEngine::v1_3::EntityBroker>(false); - entity_broker->add("Ego"); - auto root_node = std::make_shared<FakeRootNode>(env_, engine_abort_flags, entity_broker); - root_node->setChild(assign_route_action); - root_node->distributeData(); - EXPECT_NO_THROW(root_node->onInit()); - EXPECT_NO_THROW(root_node->executeTick()); + auto engine_abort_flags = std::make_shared<OpenScenarioEngine::v1_3::EngineAbortFlags>(OpenScenarioEngine::v1_3::EngineAbortFlags::kNoAbort); + auto entity_broker = std::make_shared<OpenScenarioEngine::v1_3::EntityBroker>(false); + entity_broker->add("Ego"); + auto root_node = std::make_shared<FakeRootNode>(env_, engine_abort_flags, entity_broker); + root_node->setChild(assign_route_action); + root_node->distributeData(); + EXPECT_NO_THROW(root_node->onInit()); + EXPECT_NO_THROW(root_node->executeTick()); } -TEST(AssignRouteAction, IsStepped_ReturnsTrue) +TEST(AssignRouteActionTest, IsStepped_ReturnsTrue) { OpenScenarioEngine::v1_3::AssignRouteAction assignRouteAction({std::vector<std::string>{"Vehicle1"}, OpenScenarioEngine::v1_3::Route{}}, - {std::make_shared<MockEnvironment>()}); + {std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>()}); ASSERT_TRUE(assignRouteAction.Step()); } -TEST(DISABLED_AssignRouteAction, GivenClosedRoute_NotImplementedYet) -{ - OpenScenarioEngine::v1_3::Route route{}; - route.closed = true; - OpenScenarioEngine::v1_3::AssignRouteAction assignRouteAction({std::vector<std::string>{"Vehicle1"}, - route}, - {std::make_shared<MockEnvironment>()}); -} - TEST(AssignRouteAction, IsStepped_PropagatesWaypoints) { Vec3<units::length::meter_t> expected_position{1.2_m, 3.4_m, 5.6_m}; OpenScenarioEngine::v1_3::Route route{}; - route.waypoints.push_back(RouteWaypoint{expected_position, RouteStrategy::kUndefined}); + route.waypoints.push_back(RoutingWaypoint{expected_position, RoutingStrategy::kUndefined}); - mantle_api::RouteDefinition route_definition{}; - - auto mockEnvironment = std::make_shared<MockEnvironment>(); - EXPECT_CALL(*mockEnvironment, AssignRoute(_, _)) - .WillOnce(testing::SaveArg<1>(&route_definition)); + mantle_api::RoutingDefinition expected_routing_definition{}; + expected_routing_definition.routing_waypoints.push_back({expected_position, RoutingStrategy::kUndefined}); + auto fake_environment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); + std::shared_ptr<mantle_api::MockRoute> mock_route{std::make_shared<mantle_api::MockRoute>()}; + EXPECT_CALL(dynamic_cast<mantle_api::MockRouteRepository&>(fake_environment->GetRouteRepository()), Create(_, expected_routing_definition)).WillOnce([mock_route](testing::Unused, testing::Unused) + { return mock_route; }); OpenScenarioEngine::v1_3::AssignRouteAction assignRouteAction({{"Vehicle1"}, route}, - {mockEnvironment}); + {fake_environment}); assignRouteAction.Step(); - - ASSERT_THAT(route_definition.waypoints, SizeIs(1)); - EXPECT_THAT(route_definition.waypoints[0].waypoint, expected_position); } diff --git a/engine/tests/Storyboard/GenericAction/EnvironmentActionTest.cpp b/engine/tests/Storyboard/GenericAction/EnvironmentActionTest.cpp index 61dda5247a24aa91f4f3d3a047c20e1ee381e4f3..3ee68f6938c978fec7c3b17837176ccfda15495d 100644 --- a/engine/tests/Storyboard/GenericAction/EnvironmentActionTest.cpp +++ b/engine/tests/Storyboard/GenericAction/EnvironmentActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2024-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,7 +8,7 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> +#include <MantleAPI/Execution/mock_environment.h> #include <gmock/gmock-matchers.h> #include <gtest/gtest.h> @@ -21,10 +21,12 @@ TEST(EnvironmentActionTest, GivenEnvironment_WhenSteppingEnvironmentAction_ThenE auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); EXPECT_CALL(*mockEnvironment, - SetDateTime(testing::_)).Times(1); + SetDateTime(testing::_)) + .Times(1); EXPECT_CALL(*mockEnvironment, - SetWeather(testing::_)).Times(1); + SetWeather(testing::_)) + .Times(1); OpenScenarioEngine::v1_3::EnvironmentAction environment_action{{environment}, {mockEnvironment}}; @@ -36,13 +38,14 @@ TEST(EnvironmentActionTest, GivenNullEnvironment_WhenSteppingEnvironmentAction_T auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); EXPECT_CALL(*mockEnvironment, - SetDateTime(testing::_)).Times(0); + SetDateTime(testing::_)) + .Times(0); EXPECT_CALL(*mockEnvironment, - SetWeather(testing::_)).Times(0); + SetWeather(testing::_)) + .Times(0); OpenScenarioEngine::v1_3::EnvironmentAction environment_action{{}, {mockEnvironment}}; environment_action.Step(); } - diff --git a/engine/tests/Storyboard/GenericAction/LightStateActionTests.cpp b/engine/tests/Storyboard/GenericAction/LightStateActionTests.cpp index 2384fc47943c8932ee8a36025a5a4b5de90caf8a..c3361cfbe9db3d8701ef4dbe457131bd5dc2a3ff 100644 --- a/engine/tests/Storyboard/GenericAction/LightStateActionTests.cpp +++ b/engine/tests/Storyboard/GenericAction/LightStateActionTests.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2024-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,12 +8,11 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> -#include "builders/ActionBuilder.h" #include "Storyboard/GenericAction/LightStateAction.h" #include "TestUtils.h" +#include "builders/ActionBuilder.h" using namespace OpenScenarioEngine::v1_3; using namespace testing::OpenScenarioEngine::v1_3; @@ -60,13 +59,13 @@ TEST_F(LightStateActionTestFixture, mantle_api::LightType expected_light_type = mantle_api::VehicleLightType::kIndicatorLeft; mantle_api::LightState expected_light_state = {mantle_api::LightMode::kFlashing}; - EXPECT_CALL(*env_, UpdateControlStrategies(0, testing::_)) + EXPECT_CALL(*env_, UpdateControlStrategies(mantle_api::UniqueId(0), testing::_)) .Times(1) .WillRepeatedly([expected_light_type, expected_light_state]( - std::uint64_t controller_id, + mantle_api::UniqueId entity_id, std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies) { - std::ignore = controller_id; + std::ignore = entity_id; ASSERT_THAT(control_strategies, testing::SizeIs(1)); ASSERT_EQ(control_strategies.front()->type, mantle_api::ControlStrategyType::kUpdateVehicleLightStates); auto control_strategy = dynamic_cast<mantle_api::VehicleLightStatesControlStrategy*>(control_strategies[0].get()); diff --git a/engine/tests/Storyboard/GenericAction/TeleportActionTest.cpp b/engine/tests/Storyboard/GenericAction/TeleportActionTest.cpp index 4ce155f4eab4433103babed018d01a595a7cefca..8ad10da9f7f0a7307a066bea7276829e716d270e 100644 --- a/engine/tests/Storyboard/GenericAction/TeleportActionTest.cpp +++ b/engine/tests/Storyboard/GenericAction/TeleportActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2022-2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -9,12 +9,12 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include <openScenarioLib/generated/v1_3/impl/ApiClassImplV1_3.h> #include "Conversion/OscToMantle/ConvertScenarioPosition.h" #include "Storyboard/GenericAction/TeleportAction_impl.h" +#include "TestUtils.h" #include "builders/ActionBuilder.h" #include "builders/PositionBuilder.h" @@ -29,15 +29,16 @@ TEST(TeleportActionTest, GivenTeleportActionWithPosition_WhenStepAction_ThenConv Pose pose{}; pose.position = position; - auto mockEnvironment = std::make_shared<MockEnvironment>(); + auto fake_environment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); - ON_CALL(dynamic_cast<MockVehicle&>(mockEnvironment->GetEntityRepository().Get("Entity1")->get()), + ON_CALL(dynamic_cast<MockVehicle&>(*fake_environment->GetEntityRepository().Get("Entity1").lock()), SetPosition(position)) .WillByDefault(Return()); OpenScenarioEngine::v1_3::TeleportAction teleportAction({{"Entity1"}, - [p = pose]() -> std::optional<Pose> { return p; }}, - {mockEnvironment}); + [p = pose]() -> std::optional<Pose> + { return p; }}, + {fake_environment}); ASSERT_TRUE(teleportAction.Step()); } @@ -48,14 +49,15 @@ TEST(TeleportActionTest, GivenTeleportActionWithOrientation_WhenStepAction_ThenC Pose pose{}; pose.orientation = orientation; - auto mockEnvironment = std::make_shared<MockEnvironment>(); - ON_CALL(dynamic_cast<MockVehicle&>(mockEnvironment->GetEntityRepository().Get("Entity1")->get()), + auto fake_environment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); + ON_CALL(dynamic_cast<MockVehicle&>(*fake_environment->GetEntityRepository().Get("Entity1").lock()), SetOrientation(orientation)) .WillByDefault(Return()); OpenScenarioEngine::v1_3::TeleportAction teleportAction({{"Entity1"}, - [p = pose]() -> std::optional<Pose> { return p; }}, - {mockEnvironment}); + [p = pose]() -> std::optional<Pose> + { return p; }}, + {fake_environment}); ASSERT_TRUE(teleportAction.Step()); } @@ -63,7 +65,6 @@ TEST(TeleportActionTest, GivenTeleportActionWithOrientation_WhenStepAction_ThenC TEST(TeleportActionTest, GivenTeleportActionWithLanePosition_WhenStepAction_ThenConvertAndCallSetPosition) { mantle_api::OpenDriveLanePosition open_drive_position{"1", 2, 3.0_m, 4.0_m}; - mantle_api::Position expected_position = open_drive_position; using namespace testing::OpenScenarioEngine::v1_3; auto position = @@ -75,14 +76,15 @@ TEST(TeleportActionTest, GivenTeleportActionWithLanePosition_WhenStepAction_Then .Build()) .Build(); - auto mock_environment = std::make_shared<MockEnvironment>(); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mock_environment, position); + auto fake_Environment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fake_Environment, position); OpenScenarioEngine::v1_3::TeleportAction teleport_action({{"Ego"}, - [p = pose]() -> std::optional<Pose> { return p; }}, - {mock_environment}); + [p = pose]() -> std::optional<Pose> + { return p; }}, + {fake_Environment}); - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(mock_environment->GetEntityRepository().Get("")->get()), + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*fake_Environment->GetEntityRepository().Get("").lock()), SetPosition(testing::_)) .Times(1); @@ -111,23 +113,24 @@ TEST(TeleportActionTest, GivenTeleportActionWithLanePositionAndVerticalOffset_Wh .Build()) .Build(); - auto mock_environment = std::make_shared<MockEnvironment>(); + auto fake_Environment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); - auto static_object = std::make_unique<mantle_api::MockStaticObject>(); + auto static_object = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeStaticObject>(); auto static_object_properties = std::make_unique<mantle_api::StaticObjectProperties>(traffic_sign_properties); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mock_environment, position); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fake_Environment, position); OpenScenarioEngine::v1_3::TeleportAction teleport_action({{"traffic_sign"}, - [p = pose]() -> std::optional<Pose> { return p; }}, - {mock_environment}); + [p = pose]() -> std::optional<Pose> + { return p; }}, + {fake_Environment}); - EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(mock_environment->GetEntityRepository()), GetImpl(testing::_)) - .WillRepeatedly(testing::Return(static_object.get())); + EXPECT_CALL(dynamic_cast<testing::OpenScenarioEngine::v1_3::FakeEntityRepository&>(fake_Environment->GetEntityRepository()), GetImpl(testing::_)) + .WillRepeatedly(testing::Return(static_object)); EXPECT_CALL(*static_object, GetPropertiesImpl()).WillRepeatedly(testing::Return(static_object_properties.get())); - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(mock_environment->GetQueryService()), + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fake_Environment->GetQueryService()), GetUpwardsShiftedLanePosition(testing::_, traffic_sign_properties.vertical_offset.value(), testing::_)) .Times(1); @@ -139,7 +142,6 @@ TEST(TeleportActionTest, GivenTeleportActionWithLanePositionAndVerticalOffset_Wh TEST(TeleportActionTest, GivenTeleportActionWithGeoPosition_WhenStepAction_ThenConvertAndCallSetPosition) { mantle_api::LatLonPosition lat_lon_position{42.123_deg, 11.65874_deg}; - mantle_api::Position expected_position = lat_lon_position; using namespace testing::OpenScenarioEngine::v1_3; auto geo_position = @@ -148,15 +150,16 @@ TEST(TeleportActionTest, GivenTeleportActionWithGeoPosition_WhenStepAction_ThenC FakeGeoPositionBuilder(lat_lon_position.latitude(), lat_lon_position.longitude()).Build()) .Build(); - auto mock_environment = std::make_shared<MockEnvironment>(); + auto fake_Environment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mock_environment, geo_position); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fake_Environment, geo_position); OpenScenarioEngine::v1_3::TeleportAction teleport_action({{"Ego"}, - [p = pose]() -> std::optional<Pose> { return p; }}, - {mock_environment}); + [p = pose]() -> std::optional<Pose> + { return p; }}, + {fake_Environment}); - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(mock_environment->GetEntityRepository().Get("").value().get()), + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*fake_Environment->GetEntityRepository().Get("").lock()), SetPosition(testing::_)) .Times(1); @@ -184,14 +187,15 @@ TEST(TeleportActionTest, .Build()) .Build(); - auto mock_environment = std::make_shared<MockEnvironment>(); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mock_environment, geo_position); + auto fake_Environment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fake_Environment, geo_position); OpenScenarioEngine::v1_3::TeleportAction teleport_action({{"Ego"}, - [p = pose]() -> std::optional<Pose> { return p; }}, - {mock_environment}); + [p = pose]() -> std::optional<Pose> + { return p; }}, + {fake_Environment}); - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(mock_environment->GetEntityRepository().Get("").value().get()), + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*fake_Environment->GetEntityRepository().Get("").lock()), SetOrientation(expected_orientation)) .Times(1); @@ -221,19 +225,20 @@ TEST(TeleportActionTest, .Build()) .Build(); - auto mock_environment = std::make_shared<MockEnvironment>(); + auto fake_Environment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); - auto static_object = std::make_unique<mantle_api::MockStaticObject>(); + auto static_object = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeStaticObject>(); auto static_object_properties = std::make_unique<mantle_api::StaticObjectProperties>(traffic_sign_properties); - const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(mock_environment, position); + const auto pose = OpenScenarioEngine::v1_3::ConvertScenarioPosition(fake_Environment, position); OpenScenarioEngine::v1_3::TeleportAction teleport_action({{"traffic_sign"}, - [p = pose]() -> std::optional<Pose> { return p; }}, - {mock_environment}); + [p = pose]() -> std::optional<Pose> + { return p; }}, + {fake_Environment}); - EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(mock_environment->GetEntityRepository()), GetImpl(testing::_)) - .WillRepeatedly(testing::Return(static_object.get())); + EXPECT_CALL(dynamic_cast<testing::OpenScenarioEngine::v1_3::FakeEntityRepository&>(fake_Environment->GetEntityRepository()), GetImpl(testing::_)) + .WillRepeatedly(testing::Return(static_object)); EXPECT_CALL(*static_object, GetPropertiesImpl()).WillRepeatedly(testing::Return(static_object_properties.get())); // Ensure SetOrientation() is called before SetPosition(). diff --git a/engine/tests/Storyboard/GenericAction/TrafficSignalStateActionTest.cpp b/engine/tests/Storyboard/GenericAction/TrafficSignalStateActionTest.cpp index 3149a97ada43a9485e5ecb0011dac00465598955..ed8b52576fa9aabbe187a2b89a3ad2590d784991 100644 --- a/engine/tests/Storyboard/GenericAction/TrafficSignalStateActionTest.cpp +++ b/engine/tests/Storyboard/GenericAction/TrafficSignalStateActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -9,8 +9,8 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> -#include <gtest/gtest.h> +#include <MantleAPI/Execution/mock_environment.h> +#include <gmock/gmock.h> #include "Storyboard/GenericAction/TrafficSignalStateAction_impl.h" @@ -33,4 +33,4 @@ TEST(TrafficSignalStateActionTest, GivenTrafficStateAndName_SetTrafficSignal) {mockEnvironment}); ASSERT_TRUE(trafficSignalStateAction.Step()); -} \ No newline at end of file +} diff --git a/engine/tests/Storyboard/GenericAction/TrafficSinkActionTest.cpp b/engine/tests/Storyboard/GenericAction/TrafficSinkActionTest.cpp index e8d22e8dbdda673dd2133f9cfbb8f8f04bd0224b..062a6e01120f82f7db07ef1680e1798847721239 100644 --- a/engine/tests/Storyboard/GenericAction/TrafficSinkActionTest.cpp +++ b/engine/tests/Storyboard/GenericAction/TrafficSinkActionTest.cpp @@ -8,7 +8,6 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include <limits> @@ -17,34 +16,36 @@ #include "MantleAPI/Common/i_identifiable.h" #include "Storyboard/GenericAction/TrafficSinkAction.h" #include "TestUtils/MockControllerService.h" +#include "TestUtils.h" using namespace mantle_api; +using namespace testing::OpenScenarioEngine::v1_3; using namespace units::literals; TEST(TrafficSinkAction, GivenEntityWithinRadius_WhenActionIsStepped_ThenEntityIsDeletedAndActionContinues) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); - auto& mockEntityRepository = static_cast<MockEntityRepository&>(mockEnvironment->GetEntityRepository()); + auto fake_environment = std::make_shared<FakeEnvironment>(); + auto& fakeEntityRepository = static_cast<FakeEntityRepository&>(fake_environment->GetEntityRepository()); auto mockControllerService = std::make_shared<testing::OpenScenarioEngine::v1_3::MockControllerService>(); - auto& mockControllerRepository = static_cast<MockControllerRepository&>(mockEnvironment->GetControllerRepository()); + auto& mockControllerRepository = static_cast<MockControllerRepository&>(fake_environment->GetControllerRepository()); Vec3<units::length::meter_t> vehicle_position{10.1_m, 20.2_m, 30.3_m}; - std::vector<std::unique_ptr<mantle_api::IEntity>> vehicle_vec; - - ON_CALL(mockEntityRepository, GetEntities()).WillByDefault( - [&vehicle_vec, &vehicle_position]() -> std::vector<std::unique_ptr<mantle_api::IEntity>>& - { - auto vehicle{std::make_unique<mantle_api::MockVehicle>()}; - vehicle_vec.emplace_back(std::move(vehicle)); - ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetUniqueId).WillByDefault(testing::Return(1234)); + std::vector<std::shared_ptr<mantle_api::IEntity>> vehicle_vec; + std::vector<std::weak_ptr<mantle_api::IEntity>> weak_vehicle_vec; + + ON_CALL(fakeEntityRepository, GetEntities()).WillByDefault([&vehicle_vec, &vehicle_position, &weak_vehicle_vec]() -> std::vector<std::weak_ptr<mantle_api::IEntity>>& + { + auto vehicle{std::make_shared<mantle_api::MockVehicle>()}; + vehicle_vec.emplace_back(vehicle); + weak_vehicle_vec.push_back(std::weak_ptr<mantle_api::IEntity>(vehicle)); + ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetUniqueId).WillByDefault(testing::Return(UniqueId(1234))); ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetPosition).WillByDefault(testing::Return(vehicle_position)); - return vehicle_vec; - }); + return weak_vehicle_vec; }); Pose target_pose{{10.0_m, 20.0_m, 30.0_m}, {}}; // not at 0, as other mocked entities are per default at 0 - ON_CALL(*mockControllerService, GetControllerIds(1234)).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{1001,1002})); + ON_CALL(*mockControllerService, GetControllerIds(UniqueId(1234))).WillByDefault(testing::Return(std::vector<UniqueId>{UniqueId(1001), UniqueId(1002)})); OpenScenarioEngine::v1_3::TrafficSinkAction action_under_test( {.radius = 10.0, @@ -52,40 +53,41 @@ TEST(TrafficSinkAction, GivenEntityWithinRadius_WhenActionIsStepped_ThenEntityIs .GetPosition = [&]() { return target_pose; }, .trafficDefinition = std::nullopt}, - {.environment = mockEnvironment}, + {.environment = fake_environment}, {.controllerService = mockControllerService}); - EXPECT_CALL(*mockControllerService, GetControllerIds(1234)); - EXPECT_CALL(mockControllerRepository, Delete(1002)); - EXPECT_CALL(mockControllerRepository, Delete(1001)); - EXPECT_CALL(mockEntityRepository, Delete(testing::Matcher<UniqueId>(testing::_))).Times(0); - EXPECT_CALL(mockEntityRepository, Delete(1234)).Times(1); + EXPECT_CALL(*mockControllerService, GetControllerIds(UniqueId(1234))); + EXPECT_CALL(mockControllerRepository, Delete(UniqueId(1002))); + EXPECT_CALL(mockControllerRepository, Delete(UniqueId(1001))); + EXPECT_CALL(fakeEntityRepository, Delete(testing::Matcher<UniqueId>(testing::_))).Times(0); + EXPECT_CALL(fakeEntityRepository, Delete(UniqueId(1234))).Times(1); ASSERT_FALSE(action_under_test.Step()); } TEST(TrafficSinkAction, GivenEntityLessOrEqual1mmToPosition_WhenActionIsStepped_ThenEntityIsDeletedAndActionContinues) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); - auto& mockEntityRepository = static_cast<MockEntityRepository&>(mockEnvironment->GetEntityRepository()); - auto& mockControllerRepository = static_cast<MockControllerRepository&>(mockEnvironment->GetControllerRepository()); + auto fake_environment = std::make_shared<FakeEnvironment>(); + auto& fake_entity_repository = static_cast<FakeEntityRepository&>(fake_environment->GetEntityRepository()); + auto& mockControllerRepository = static_cast<MockControllerRepository&>(fake_environment->GetControllerRepository()); auto mockControllerService = std::make_shared<testing::OpenScenarioEngine::v1_3::MockControllerService>(); Vec3<units::length::meter_t> vehicle_position{1_mm, // = EPSILON FOR DETECTION 10_m, 10_m}; - std::vector<std::unique_ptr<mantle_api::IEntity>> vehicle_vec; - - ON_CALL(mockEntityRepository, GetEntities()).WillByDefault( - [&vehicle_vec, &vehicle_position]() -> std::vector<std::unique_ptr<mantle_api::IEntity>>& - { - auto vehicle{std::make_unique<mantle_api::MockVehicle>()}; - vehicle_vec.emplace_back(std::move(vehicle)); - ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetUniqueId).WillByDefault(testing::Return(1234)); + std::vector<std::shared_ptr<mantle_api::IEntity>> vehicle_vec; + std::vector<std::weak_ptr<mantle_api::IEntity>> weak_vehicle_vec; + + ON_CALL(fake_entity_repository, GetEntities()).WillByDefault([&vehicle_vec, &vehicle_position, &weak_vehicle_vec]() -> std::vector<std::weak_ptr<mantle_api::IEntity>>& + { + auto vehicle{std::make_shared<mantle_api::MockVehicle>()}; + vehicle_vec.emplace_back(vehicle); + weak_vehicle_vec.push_back(std::weak_ptr<mantle_api::IEntity>(vehicle)); + ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetUniqueId).WillByDefault(testing::Return(UniqueId(1234))); ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetPosition).WillByDefault(testing::Return(vehicle_position)); - return vehicle_vec; - }); - ON_CALL(*mockControllerService, GetControllerIds(1234)).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{1001,1002})); + return weak_vehicle_vec; }); + + ON_CALL(*mockControllerService, GetControllerIds(UniqueId(1234))).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{UniqueId(1001), UniqueId(1002)})); Pose target_pose{{0_m, 10_m, 10_m}, {}}; // not at 0, as other mocked entities are per default at 0 OpenScenarioEngine::v1_3::TrafficSinkAction action_under_test( @@ -94,38 +96,40 @@ TEST(TrafficSinkAction, GivenEntityLessOrEqual1mmToPosition_WhenActionIsStepped_ .GetPosition = [&] { return target_pose; }, .trafficDefinition = std::nullopt}, - {.environment = mockEnvironment}, + {.environment = fake_environment}, {.controllerService = mockControllerService}); - EXPECT_CALL(*mockControllerService, GetControllerIds(1234)); - EXPECT_CALL(mockControllerRepository, Delete(1002)); - EXPECT_CALL(mockControllerRepository, Delete(1001)); - EXPECT_CALL(mockEntityRepository, Delete(testing::Matcher<UniqueId>(testing::_))).Times(0); - EXPECT_CALL(mockEntityRepository, Delete(1234)).Times(1); + EXPECT_CALL(*mockControllerService, GetControllerIds(UniqueId(1234))); + EXPECT_CALL(mockControllerRepository, Delete(UniqueId(1002))); + EXPECT_CALL(mockControllerRepository, Delete(UniqueId(1001))); + EXPECT_CALL(fake_entity_repository, Delete(testing::Matcher<UniqueId>(testing::_))).Times(0); + EXPECT_CALL(fake_entity_repository, Delete(UniqueId(1234))).Times(1); ASSERT_FALSE(action_under_test.Step()); } TEST(TrafficSinkAction, GivenEntityMoreThan1mmApartToPosition_WhenActionIsStepped_ThenEntityIsNotDeletedAndActionContinues) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); - auto& mockEntityRepository = static_cast<MockEntityRepository&>(mockEnvironment->GetEntityRepository()); + auto fake_environment = std::make_shared<FakeEnvironment>(); + auto& mockEntityRepository = static_cast<MockEntityRepository&>(fake_environment->GetEntityRepository()); auto mockControllerService = std::make_shared<testing::OpenScenarioEngine::v1_3::MockControllerService>(); - auto& mockControllerRepository = static_cast<MockControllerRepository&>(mockEnvironment->GetControllerRepository()); + auto& mockControllerRepository = static_cast<MockControllerRepository&>(fake_environment->GetControllerRepository()); Vec3<units::length::meter_t> vehicle_position{1.001_mm, // BEYOND EPSILON FOR DETECTIN 10_m, 10_m}; - std::vector<std::unique_ptr<mantle_api::IEntity>> vehicle_vec; + std::vector<std::shared_ptr<mantle_api::IEntity>> vehicle_vec; + std::vector<std::weak_ptr<mantle_api::IEntity>> weak_vehicle_vec; - ON_CALL(mockEntityRepository, GetEntities()).WillByDefault([&vehicle_vec, &vehicle_position]() -> std::vector<std::unique_ptr<mantle_api::IEntity>>& + ON_CALL(mockEntityRepository, GetEntities()).WillByDefault([&vehicle_vec, &vehicle_position, &weak_vehicle_vec]() -> std::vector<std::weak_ptr<mantle_api::IEntity>>& { - auto vehicle{std::make_unique<mantle_api::MockVehicle>()}; - vehicle_vec.emplace_back(std::move(vehicle)); - ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetUniqueId).WillByDefault(testing::Return(1234)); + auto vehicle{std::make_shared<mantle_api::MockVehicle>()}; + vehicle_vec.emplace_back(vehicle); + weak_vehicle_vec.push_back(std::weak_ptr<mantle_api::IEntity>(vehicle)); + ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetUniqueId).WillByDefault(testing::Return(UniqueId(1234))); ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetPosition).WillByDefault(testing::Return(vehicle_position)); - return vehicle_vec; }); - ON_CALL(*mockControllerService, GetControllerIds(1234)).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{1001,1002})); + return weak_vehicle_vec; }); + ON_CALL(*mockControllerService, GetControllerIds(UniqueId(1234))).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{UniqueId(1001), UniqueId(1002)})); Pose target_pose{{0_m, 10_m, 10_m}, {}}; // not at 0, as other mocked entities are per default at 0 OpenScenarioEngine::v1_3::TrafficSinkAction action_under_test( @@ -134,36 +138,36 @@ TEST(TrafficSinkAction, GivenEntityMoreThan1mmApartToPosition_WhenActionIsSteppe .GetPosition = [&] { return target_pose; }, .trafficDefinition = std::nullopt}, - {.environment = mockEnvironment}, + {.environment = fake_environment}, {.controllerService = mockControllerService}); - EXPECT_CALL(*mockControllerService, GetControllerIds(1234)).Times(0); - EXPECT_CALL(mockControllerRepository, Delete(1002)).Times(0); - EXPECT_CALL(mockControllerRepository, Delete(1001)).Times(0); + EXPECT_CALL(*mockControllerService, GetControllerIds(UniqueId(1234))).Times(0); + EXPECT_CALL(mockControllerRepository, Delete(UniqueId(1002))).Times(0); + EXPECT_CALL(mockControllerRepository, Delete(UniqueId(1001))).Times(0); EXPECT_CALL(mockEntityRepository, Delete(testing::Matcher<UniqueId>(testing::_))).Times(0); ASSERT_FALSE(action_under_test.Step()); } TEST(TrafficSinkAction, GivenOneEntityWithinRadius_WhenEntityIsAStaticObject_ThenStaticObjectIsNotDeleted) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); + auto fake_environment = std::make_shared<FakeEnvironment>(); auto mockControllerService = std::make_shared<testing::OpenScenarioEngine::v1_3::MockControllerService>(); - auto& mockControllerRepository = static_cast<MockControllerRepository&>(mockEnvironment->GetControllerRepository()); + auto& mockControllerRepository = static_cast<MockControllerRepository&>(fake_environment->GetControllerRepository()); // the entity repository returns 1 vehicle, 1 pedestrian and 1 stationary object - auto& mockEntityRepository = static_cast<MockEntityRepository&>(mockEnvironment->GetEntityRepository()); + auto& mockEntityRepository = static_cast<MockEntityRepository&>(fake_environment->GetEntityRepository()); Vec3<units::length::meter_t> entity_position{0.0_m, 0.0_m, 0.0_m}; - std::vector<std::unique_ptr<IEntity>> vehicle_vec; + std::vector<std::shared_ptr<IEntity>> vehicle_vec; + std::vector<std::weak_ptr<mantle_api::IEntity>> weak_vehicle_vec; - ON_CALL(mockEntityRepository, GetEntities()).WillByDefault( - [&vehicle_vec, &entity_position]() -> std::vector<std::unique_ptr<IEntity>>& - { - auto object{std::make_unique<MockStaticObject>()}; - vehicle_vec.emplace_back(std::move(object)); - return vehicle_vec; - }); - ON_CALL(*mockControllerService, GetControllerIds(1234)).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{1001,1002})); + ON_CALL(mockEntityRepository, GetEntities()).WillByDefault([&vehicle_vec, &entity_position, &weak_vehicle_vec]() -> std::vector<std::weak_ptr<IEntity>>& + { + auto object{std::make_shared<MockStaticObject>()}; + vehicle_vec.emplace_back(object); + weak_vehicle_vec.push_back(std::weak_ptr<mantle_api::IEntity>(object)); + return weak_vehicle_vec; }); + ON_CALL(*mockControllerService, GetControllerIds(UniqueId(1234))).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{UniqueId(1001), UniqueId(1002)})); Pose target_pose{{0.0_m, 0.0_m, 0.0_m}, {}}; // all mocked entities are at 0 per default! OpenScenarioEngine::v1_3::TrafficSinkAction action_under_test( @@ -172,37 +176,37 @@ TEST(TrafficSinkAction, GivenOneEntityWithinRadius_WhenEntityIsAStaticObject_The .GetPosition = [&] { return target_pose; }, .trafficDefinition = std::nullopt}, - {.environment = mockEnvironment}, + {.environment = fake_environment}, {.controllerService = mockControllerService}); - EXPECT_CALL(*mockControllerService, GetControllerIds(1234)).Times(0); - EXPECT_CALL(mockControllerRepository, Delete(1002)).Times(0); - EXPECT_CALL(mockControllerRepository, Delete(1001)).Times(0); + EXPECT_CALL(*mockControllerService, GetControllerIds(UniqueId(1234))).Times(0); + EXPECT_CALL(mockControllerRepository, Delete(UniqueId(1002))).Times(0); + EXPECT_CALL(mockControllerRepository, Delete(UniqueId(1001))).Times(0); EXPECT_CALL(mockEntityRepository, Delete(testing::Matcher<UniqueId>(testing::_))).Times(0); ASSERT_FALSE(action_under_test.Step()); } TEST(TrafficSinkAction, GivenEntityOutsideOfRadius_WhenActionIsStepped_EntityIsNotDeletedAndActionContinues) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); - auto& mockEntityRepository = static_cast<MockEntityRepository&>(mockEnvironment->GetEntityRepository()); + auto fake_environment = std::make_shared<FakeEnvironment>(); + auto& mockEntityRepository = static_cast<MockEntityRepository&>(fake_environment->GetEntityRepository()); auto mockControllerService = std::make_shared<testing::OpenScenarioEngine::v1_3::MockControllerService>(); - auto& mockControllerRepository = static_cast<MockControllerRepository&>(mockEnvironment->GetControllerRepository()); + auto& mockControllerRepository = static_cast<MockControllerRepository&>(fake_environment->GetControllerRepository()); Vec3<units::length::meter_t> vehicle_position{10.0_m, 20.0_m, 30.0_m}; - std::vector<std::unique_ptr<mantle_api::IEntity>> vehicle_vec; - - ON_CALL(mockEntityRepository, GetEntities()).WillByDefault( - [&vehicle_vec, &vehicle_position]() -> std::vector<std::unique_ptr<mantle_api::IEntity>>& - { - auto vehicle{std::make_unique<mantle_api::MockVehicle>()}; - vehicle_vec.emplace_back(std::move(vehicle)); - ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetUniqueId).WillByDefault(testing::Return(1234)); + std::vector<std::shared_ptr<mantle_api::IEntity>> vehicle_vec; + std::vector<std::weak_ptr<mantle_api::IEntity>> weak_vehicle_vec; + + ON_CALL(mockEntityRepository, GetEntities()).WillByDefault([&vehicle_vec, &vehicle_position, &weak_vehicle_vec]() -> std::vector<std::weak_ptr<mantle_api::IEntity>>& + { + auto vehicle{std::make_shared<mantle_api::MockVehicle>()}; + vehicle_vec.emplace_back(vehicle); + weak_vehicle_vec.push_back(std::weak_ptr<mantle_api::IEntity>(vehicle)); + ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetUniqueId).WillByDefault(testing::Return(UniqueId(1234))); ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetPosition).WillByDefault(testing::Return(vehicle_position)); - return vehicle_vec; - }); - ON_CALL(*mockControllerService, GetControllerIds(1234)).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{1001,1002})); + return weak_vehicle_vec; }); + ON_CALL(*mockControllerService, GetControllerIds(UniqueId(1234))).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{UniqueId(1001), UniqueId(1002)})); Pose target_pose{{1.0_m, 2.0_m, 3.0_m}, {}}; OpenScenarioEngine::v1_3::TrafficSinkAction action_under_test( @@ -211,37 +215,37 @@ TEST(TrafficSinkAction, GivenEntityOutsideOfRadius_WhenActionIsStepped_EntityIsN .GetPosition = [&] { return target_pose; }, .trafficDefinition = std::nullopt}, - {.environment = mockEnvironment}, + {.environment = fake_environment}, {.controllerService = mockControllerService}); - EXPECT_CALL(*mockControllerService, GetControllerIds(1234)).Times(0); - EXPECT_CALL(mockControllerRepository, Delete(1002)).Times(0); - EXPECT_CALL(mockControllerRepository, Delete(1001)).Times(0); + EXPECT_CALL(*mockControllerService, GetControllerIds(UniqueId(1234))).Times(0); + EXPECT_CALL(mockControllerRepository, Delete(UniqueId(1002))).Times(0); + EXPECT_CALL(mockControllerRepository, Delete(UniqueId(1001))).Times(0); EXPECT_CALL(mockEntityRepository, Delete(testing::Matcher<UniqueId>(testing::_))).Times(0); ASSERT_FALSE(action_under_test.Step()); } TEST(TrafficSinkAction, GivenEntityAtPositionOfAction_WhenRadiusOfActionZero_ThenEntityIsDeleted) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); - auto& mockEntityRepository = static_cast<MockEntityRepository&>(mockEnvironment->GetEntityRepository()); + auto fake_environment = std::make_shared<FakeEnvironment>(); + auto& mockEntityRepository = static_cast<MockEntityRepository&>(fake_environment->GetEntityRepository()); auto mockControllerService = std::make_shared<testing::OpenScenarioEngine::v1_3::MockControllerService>(); - auto& mockControllerRepository = static_cast<MockControllerRepository&>(mockEnvironment->GetControllerRepository()); + auto& mockControllerRepository = static_cast<MockControllerRepository&>(fake_environment->GetControllerRepository()); Vec3<units::length::meter_t> vehicle_position{1.0_m, 2.0_m, 3.0_m}; - std::vector<std::unique_ptr<mantle_api::IEntity>> vehicle_vec; - - ON_CALL(mockEntityRepository, GetEntities()).WillByDefault( - [&vehicle_vec, &vehicle_position]() -> std::vector<std::unique_ptr<mantle_api::IEntity>>& - { - auto vehicle{std::make_unique<mantle_api::MockVehicle>()}; - vehicle_vec.emplace_back(std::move(vehicle)); - ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetUniqueId).WillByDefault(testing::Return(1234)); + std::vector<std::shared_ptr<mantle_api::IEntity>> vehicle_vec; + std::vector<std::weak_ptr<mantle_api::IEntity>> weak_vehicle_vec; + + ON_CALL(mockEntityRepository, GetEntities()).WillByDefault([&vehicle_vec, &vehicle_position, &weak_vehicle_vec]() -> std::vector<std::weak_ptr<mantle_api::IEntity>>& + { + auto vehicle{std::make_shared<mantle_api::MockVehicle>()}; + vehicle_vec.emplace_back(vehicle); + weak_vehicle_vec.push_back(std::weak_ptr<mantle_api::IEntity>(vehicle)); + ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetUniqueId).WillByDefault(testing::Return(UniqueId(1234))); ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetPosition).WillByDefault(testing::Return(vehicle_position)); - return vehicle_vec; - }); - ON_CALL(*mockControllerService, GetControllerIds(1234)).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{1001,1002})); + return weak_vehicle_vec; }); + ON_CALL(*mockControllerService, GetControllerIds(UniqueId(1234))).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{UniqueId(1001), UniqueId(1002)})); Pose target_pose{vehicle_position, {}}; OpenScenarioEngine::v1_3::TrafficSinkAction action_under_test( @@ -250,13 +254,13 @@ TEST(TrafficSinkAction, GivenEntityAtPositionOfAction_WhenRadiusOfActionZero_The .GetPosition = [&] { return target_pose; }, .trafficDefinition = std::nullopt}, - {.environment = mockEnvironment}, + {.environment = fake_environment}, {.controllerService = mockControllerService}); - EXPECT_CALL(*mockControllerService, GetControllerIds(1234)); - EXPECT_CALL(mockControllerRepository, Delete(1002)); - EXPECT_CALL(mockControllerRepository, Delete(1001)); + EXPECT_CALL(*mockControllerService, GetControllerIds(UniqueId(1234))); + EXPECT_CALL(mockControllerRepository, Delete(UniqueId(1002))); + EXPECT_CALL(mockControllerRepository, Delete(UniqueId(1001))); EXPECT_CALL(mockEntityRepository, Delete(testing::Matcher<UniqueId>(testing::_))).Times(0); - EXPECT_CALL(mockEntityRepository, Delete(1234)).Times(1); + EXPECT_CALL(mockEntityRepository, Delete(UniqueId(1234))).Times(1); ASSERT_FALSE(action_under_test.Step()); } diff --git a/engine/tests/Storyboard/GenericAction/TrafficSwarmActionTest.cpp b/engine/tests/Storyboard/GenericAction/TrafficSwarmActionTest.cpp index be6efd02ea7a676dd1dcb5dee1c05339a94ee057..83238b255ad1ae4c9ae54df7b285781a95f3fa2c 100644 --- a/engine/tests/Storyboard/GenericAction/TrafficSwarmActionTest.cpp +++ b/engine/tests/Storyboard/GenericAction/TrafficSwarmActionTest.cpp @@ -8,7 +8,6 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include <cstring> @@ -18,6 +17,7 @@ #include "Storyboard/GenericAction/TrafficSwarmAction_impl.h" #include "TestUtils/MockStochastics.h" #include "Utils/Ellipse.h" +#include "TestUtils.h" using namespace testing; using namespace units::literals; @@ -41,13 +41,13 @@ protected: { vehicles_.clear(); - auto& mock_entity_repository{dynamic_cast<mantle_api::MockEntityRepository&>(mock_environment_->GetEntityRepository())}; - auto& mock_controller_repository{dynamic_cast<mantle_api::MockControllerRepository&>(mock_environment_->GetControllerRepository())}; + auto& fake_entity_repository{dynamic_cast<testing::OpenScenarioEngine::v1_3::FakeEntityRepository&>(fake_environment_->GetEntityRepository())}; + auto& mock_controller_repository{dynamic_cast<mantle_api::MockControllerRepository&>(fake_environment_->GetControllerRepository())}; - ON_CALL(mock_entity_repository, Create(_, Matcher<const mantle_api::VehicleProperties&>(_))).WillByDefault([this](const std::string& name, const mantle_api::VehicleProperties& properties) -> mantle_api::MockVehicle& + ON_CALL(fake_entity_repository, Create(_, Matcher<const mantle_api::VehicleProperties&>(_))).WillByDefault([this](const std::string& name, const mantle_api::VehicleProperties& properties) -> std::weak_ptr<mantle_api::MockVehicle> { return CREATE_MOCK_VEHICLE_WITH_PARAMETERIZED_POSITION(name, properties); }); - ON_CALL(mock_entity_repository, Delete(Matcher<mantle_api::UniqueId>(_))).WillByDefault([this](mantle_api::UniqueId id) + ON_CALL(fake_entity_repository, Delete(Matcher<mantle_api::UniqueId>(_))).WillByDefault([this](mantle_api::UniqueId id) { const auto& it{vehicles_.find(id)}; @@ -57,9 +57,9 @@ protected: id_list_.erase(std::remove(id_list_.begin(), id_list_.end(), id), id_list_.end()); } }); - ON_CALL(mock_controller_, GetUniqueId()).WillByDefault(Return(1234)); + ON_CALL(*mock_controller_, GetUniqueId()).WillByDefault(Return(mantle_api::UniqueId(1234))); - ON_CALL(mock_controller_repository, Create(_)).WillByDefault([this](std::unique_ptr<mantle_api::IControllerConfig> config) -> mantle_api::MockController& + ON_CALL(mock_controller_repository, Create(_)).WillByDefault([this](std::unique_ptr<mantle_api::IControllerConfig> config) -> std::weak_ptr<mantle_api::MockController> { controller_count_++; last_controller_config_ = dynamic_cast<mantle_api::ExternalControllerConfig&>(*config); @@ -70,21 +70,17 @@ protected: ON_CALL(*mock_stochastics_, GetUniformDistributed(_, _)).WillByDefault(Return(mocked_random_value)); - const auto& host_optional = mock_entity_repository.GetHost(); - ASSERT_TRUE(host_optional.has_value()); - mantle_api::MockVehicle* host_ptr{dynamic_cast<mantle_api::MockVehicle*>(&host_optional.value().get())}; - ASSERT_NE(host_ptr, nullptr) << "Failed to cast host to MockVehicle."; - mantle_api::MockVehicle& host = *host_ptr; + auto& host{static_cast<mantle_api::MockVehicle&>(*fake_entity_repository.GetHost().lock())}; ON_CALL(host, GetPosition()).WillByDefault(Return(host_position)); ON_CALL(host, GetOrientation()).WillByDefault(Return(host_orientation)); - OpenScenarioEngine::v1_3::TrafficDefinition traffic_definition; + ::OpenScenarioEngine::v1_3::TrafficDefinition traffic_definition; traffic_definition.name = "tf"; - traffic_definition.vehicle_category_distribution_entries = {{0.25, mantle_api::VehicleClass::kSmall_car}, - {0.25, mantle_api::VehicleClass::kMedium_car}, - {0.25, mantle_api::VehicleClass::kMotorbike}, - {0.25, mantle_api::VehicleClass::kSemitrailer}}; + traffic_definition.vehicle_category_distribution_entries = {{0.25, mantle_api::VehicleClass::kSmallCar}, + {0.25, mantle_api::VehicleClass::kMediumCar}, + {0.25, mantle_api::VehicleClass::kMotorcycle}, + {0.25, mantle_api::VehicleClass::kSemiTrailer}}; mantle_api::ExternalControllerConfig config_1; config_1.name = "1"; @@ -100,16 +96,16 @@ protected: {0.25, config_3}, {0.25, config_4}}; - parameters_ = OpenScenarioEngine::v1_3::TrafficSwarmActionBase::Values{.innerRadius = 10.0, - .numberOfVehicles = 0, - .offset = 0.0, - .semiMajorAxis = 100.0, - .semiMinorAxis = 10.0, - .velocity = std::nullopt, - .centralObject = {host_name}, - .trafficDefinition = traffic_definition, - .initialSpeedRange = OpenScenarioEngine::v1_3::Range{0.0, 10.0}, - .directionOfTravelDistribution = std::nullopt}; + parameters_ = ::OpenScenarioEngine::v1_3::TrafficSwarmActionBase::Values{.innerRadius = 10.0, + .numberOfVehicles = 0, + .offset = 0.0, + .semiMajorAxis = 100.0, + .semiMinorAxis = 10.0, + .velocity = std::nullopt, + .centralObject = {host_name}, + .trafficDefinition = traffic_definition, + .initialSpeedRange = ::OpenScenarioEngine::v1_3::Range{0.0, 10.0}, + .directionOfTravelDistribution = std::nullopt}; } void RunActionAndSaveDistributions(std::vector<mantle_api::VehicleClass>& vehicle_classes, @@ -121,7 +117,7 @@ protected: vehicle_classes.reserve(step_count); controller_configs.reserve(step_count); - OpenScenarioEngine::v1_3::TrafficSwarmAction action_under_test_1{parameters_, {mock_environment_}, {mock_stochastics_}}; + ::OpenScenarioEngine::v1_3::TrafficSwarmAction action_under_test_1{parameters_, {fake_environment_}, {mock_stochastics_}}; for (size_t i{0}; i < step_count; ++i) { @@ -144,14 +140,14 @@ protected: const mantle_api::Vec3<units::velocity::meters_per_second_t> host_velocity{5_mps, 0_mps, 0_mps}; const mantle_api::Orientation3<units::angle::radian_t> host_orientation{10_rad, 0_rad, 0_rad}; - std::shared_ptr<mantle_api::MockEnvironment> mock_environment_{std::make_shared<mantle_api::MockEnvironment>()}; - mantle_api::MockController mock_controller_; - std::shared_ptr<OpenScenarioEngine::v1_3::MockStochastics> mock_stochastics_{std::make_shared<OpenScenarioEngine::v1_3::MockStochastics>()}; + std::shared_ptr<testing::OpenScenarioEngine::v1_3::FakeEnvironment> fake_environment_{std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>()}; + std::shared_ptr<mantle_api::MockController> mock_controller_{std::make_shared<mantle_api::MockController>()}; + std::shared_ptr<testing::OpenScenarioEngine::v1_3::MockStochastics> mock_stochastics_{std::make_shared<testing::OpenScenarioEngine::v1_3::MockStochastics>()}; - OpenScenarioEngine::v1_3::TrafficSwarmActionBase::Values parameters_; + ::OpenScenarioEngine::v1_3::TrafficSwarmActionBase::Values parameters_; std::vector<mantle_api::UniqueId> id_list_; - std::unordered_map<mantle_api::UniqueId, std::pair<std::unique_ptr<mantle_api::MockVehicle>, VehicleParameters>> vehicles_; + std::unordered_map<mantle_api::UniqueId, std::pair<std::shared_ptr<mantle_api::MockVehicle>, VehicleParameters>> vehicles_; size_t controller_count_{0}; mantle_api::ExternalControllerConfig last_controller_config_; @@ -166,7 +162,7 @@ private: /// @param properties The vehicle properties, stored in the vehicle_ map /// @return A reference to the created vehicle stored in the vehicle_ map /// - mantle_api::MockVehicle& CREATE_MOCK_VEHICLE_WITH_PARAMETERIZED_POSITION( + std::weak_ptr<mantle_api::MockVehicle> CREATE_MOCK_VEHICLE_WITH_PARAMETERIZED_POSITION( const std::string& name, const mantle_api::VehicleProperties& properties) { @@ -174,20 +170,20 @@ private: id_list_.emplace_back(stoul(num_name)); auto& id{id_list_.back()}; - vehicles_.insert({id, std::make_pair(std::make_unique<mantle_api::MockVehicle>(), VehicleParameters{})}); - auto& mock_vehicle{*(vehicles_.at(id).first)}; + vehicles_.insert({id, std::make_pair(std::make_shared<mantle_api::MockVehicle>(), VehicleParameters{})}); + auto mock_vehicle{(vehicles_.at(id).first)}; auto& vehicle_parameters{vehicles_.at(id).second}; vehicle_parameters.vehicle_class = properties.classification; - ON_CALL(mock_vehicle, GetUniqueId).WillByDefault(Return(id)); - ON_CALL(mock_vehicle, GetPosition).WillByDefault(Return(vehicle_parameters.position)); + ON_CALL(*mock_vehicle, GetUniqueId).WillByDefault(Return(id)); + ON_CALL(*mock_vehicle, GetPosition).WillByDefault(Return(vehicle_parameters.position)); - ON_CALL(mock_vehicle, SetPosition).WillByDefault([&vehicle_parameters](const mantle_api::Vec3<units::length::meter_t>& position) - { vehicle_parameters.position = position; }); + ON_CALL(*mock_vehicle, SetPosition).WillByDefault([&vehicle_parameters](const mantle_api::Vec3<units::length::meter_t>& position) + { vehicle_parameters.position = position; }); - ON_CALL(mock_vehicle, SetVelocity).WillByDefault([&vehicle_parameters](const mantle_api::Vec3<units::velocity::meters_per_second_t>& velocity) - { vehicle_parameters.speed = velocity.Length()(); }); + ON_CALL(*mock_vehicle, SetVelocity).WillByDefault([&vehicle_parameters](const mantle_api::Vec3<units::velocity::meters_per_second_t>& velocity) + { vehicle_parameters.speed = velocity.Length()(); }); return mock_vehicle; } @@ -197,13 +193,13 @@ TEST_F(TrafficSwarmActionTestFixture, GivenDeprecatedVelocityParameter_WhenActio { parameters_.velocity = std::optional<double>(10.0); - EXPECT_THROW((OpenScenarioEngine::v1_3::TrafficSwarmAction{parameters_, {mock_environment_}, {mock_stochastics_}}), std::runtime_error); + EXPECT_THROW((::OpenScenarioEngine::v1_3::TrafficSwarmAction{parameters_, {fake_environment_}, {mock_stochastics_}}), std::runtime_error); } TEST_F(TrafficSwarmActionTestFixture, GivenNoRequestedVehicle_WhenActionIsStepped_ThenNoVehicleAreSpawned) { parameters_.numberOfVehicles = 0; - OpenScenarioEngine::v1_3::TrafficSwarmAction action_under_test{parameters_, {mock_environment_}, {mock_stochastics_}}; + ::OpenScenarioEngine::v1_3::TrafficSwarmAction action_under_test{parameters_, {fake_environment_}, {mock_stochastics_}}; action_under_test.Step(); @@ -215,8 +211,8 @@ TEST_F(TrafficSwarmActionTestFixture, GivenFiveRequestedVehiclesInFrontOfCentral { const double lower_speed_range_limit{1.0}; parameters_.numberOfVehicles = 5; - parameters_.initialSpeedRange = OpenScenarioEngine::v1_3::Range{lower_speed_range_limit, 10.0}; - OpenScenarioEngine::v1_3::TrafficSwarmAction action_under_test{parameters_, {mock_environment_}, {mock_stochastics_}}; + parameters_.initialSpeedRange = ::OpenScenarioEngine::v1_3::Range{lower_speed_range_limit, 10.0}; + ::OpenScenarioEngine::v1_3::TrafficSwarmAction action_under_test{parameters_, {fake_environment_}, {mock_stochastics_}}; const auto longitudinal_distance_between_vehicles{(parameters_.semiMajorAxis - parameters_.innerRadius) / parameters_.numberOfVehicles}; @@ -234,8 +230,8 @@ TEST_F(TrafficSwarmActionTestFixture, GivenFiveRequestedVehiclesInFrontOfCentral spawning_positions.push_back(spawning_position); } - EXPECT_CALL(mock_environment_->GetTrafficSwarmService(), GetAvailableSpawningPoses()).Times(1).WillOnce(Return(spawning_positions)); - EXPECT_CALL(mock_controller_, ChangeState(mantle_api::IController::LateralState::kActivate, mantle_api::IController::LongitudinalState::kActivate)) + EXPECT_CALL(fake_environment_->GetTrafficSwarmService(), GetAvailableSpawningPoses()).Times(1).WillOnce(Return(spawning_positions)); + EXPECT_CALL(*mock_controller_, ChangeState(mantle_api::IController::LateralState::kActivate, mantle_api::IController::LongitudinalState::kActivate)) .Times(static_cast<int>(parameters_.numberOfVehicles)); action_under_test.Step(); @@ -256,7 +252,7 @@ TEST_F(TrafficSwarmActionTestFixture, GivenFiveRequestedVehiclesInFrontOfCentral TEST_F(TrafficSwarmActionTestFixture, GivenOneRequestedVehiclesOutsideOfSpawningArea_WhenActionIsStepped_ThenVehiclesIsDespawned) { parameters_.numberOfVehicles = 1; - OpenScenarioEngine::v1_3::TrafficSwarmAction action_under_test{parameters_, {mock_environment_}, {mock_stochastics_}}; + ::OpenScenarioEngine::v1_3::TrafficSwarmAction action_under_test{parameters_, {fake_environment_}, {mock_stochastics_}}; const auto longitudinal_distance_between_vehicles{(parameters_.semiMajorAxis - parameters_.innerRadius) / parameters_.numberOfVehicles}; @@ -274,7 +270,7 @@ TEST_F(TrafficSwarmActionTestFixture, GivenOneRequestedVehiclesOutsideOfSpawning spawning_positions.push_back(spawning_position); } - EXPECT_CALL(mock_environment_->GetTrafficSwarmService(), GetAvailableSpawningPoses()).Times(2).WillOnce(Return(spawning_positions)).WillOnce(Return(std::vector<mantle_api::ITrafficSwarmService::SpawningPosition>{})); + EXPECT_CALL(fake_environment_->GetTrafficSwarmService(), GetAvailableSpawningPoses()).Times(2).WillOnce(Return(spawning_positions)).WillOnce(Return(std::vector<mantle_api::ITrafficSwarmService::SpawningPosition>{})); action_under_test.Step(); @@ -282,19 +278,21 @@ TEST_F(TrafficSwarmActionTestFixture, GivenOneRequestedVehiclesOutsideOfSpawning EXPECT_EQ(parameters_.numberOfVehicles, id_list_.size()); EXPECT_EQ(parameters_.numberOfVehicles, controller_count_); - std::vector<std::unique_ptr<mantle_api::IEntity>> vehicle_vec; + std::vector<std::shared_ptr<mantle_api::IEntity>> vehicle_vec; + std::vector<std::weak_ptr<mantle_api::IEntity>> weak_vehicle_vec; - EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(mock_environment_.get()->GetEntityRepository()), GetEntities).Times(1).WillOnce([this, &vehicle_vec]() -> std::vector<std::unique_ptr<mantle_api::IEntity>>& + EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(fake_environment_.get()->GetEntityRepository()), GetEntities).Times(1).WillOnce([this, &vehicle_vec, &weak_vehicle_vec]() -> std::vector<std::weak_ptr<mantle_api::IEntity>>& { for (const auto& id : id_list_) { - auto vehicle{std::make_unique<mantle_api::MockVehicle>()}; - vehicle_vec.push_back(std::move(vehicle)); + auto vehicle{std::make_shared<mantle_api::MockVehicle>()}; + vehicle_vec.push_back(vehicle); + weak_vehicle_vec.push_back(std::weak_ptr<mantle_api::IEntity>(vehicle)); ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetUniqueId).WillByDefault(Return(id)); ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetPosition).WillByDefault(Return(vehicles_.at(id).second.position)); } - return vehicle_vec; }); + return weak_vehicle_vec; }); vehicles_.at(id_list_.back()).second.position.x += units::length::meter_t{parameters_.semiMajorAxis}; @@ -307,31 +305,33 @@ TEST_F(TrafficSwarmActionTestFixture, GivenOneRequestedVehiclesOutsideOfSpawning TEST_F(TrafficSwarmActionTestFixture, GivenInnerRadiusBiggerThanSpawningArea_WhenActionIsStepped_ThenExpectThrow) { parameters_.innerRadius = 150.0; - EXPECT_THROW(OpenScenarioEngine::v1_3::TrafficSwarmAction(parameters_, {mock_environment_}, {mock_stochastics_}), std::runtime_error); + EXPECT_THROW(::OpenScenarioEngine::v1_3::TrafficSwarmAction(parameters_, {fake_environment_}, {mock_stochastics_}), std::runtime_error); } TEST_F(TrafficSwarmActionTestFixture, DISABLED_GivenTwoActionsWithIdenticalParameters_WhenActionsAreSteppedMultipleTimes_ThenVehicleClassesAndControllerCategoriesAreIdentical) { parameters_.numberOfVehicles = 1; - std::vector<std::unique_ptr<mantle_api::IEntity>> vehicle_vec; + std::vector<std::shared_ptr<mantle_api::IEntity>> vehicle_vec; + std::vector<std::weak_ptr<mantle_api::IEntity>> weak_vehicle_vec; - ON_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(mock_environment_->GetEntityRepository()), GetEntities).WillByDefault([this, &vehicle_vec]() -> std::vector<std::unique_ptr<mantle_api::IEntity>>& + ON_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(fake_environment_->GetEntityRepository()), GetEntities).WillByDefault([this, &vehicle_vec, &weak_vehicle_vec]() -> std::vector<std::weak_ptr<mantle_api::IEntity>>& { for (const auto& id : id_list_) { - auto vehicle{std::make_unique<mantle_api::MockVehicle>()}; - vehicle_vec.push_back(std::move(vehicle)); + auto vehicle{std::make_shared<mantle_api::MockVehicle>()}; + vehicle_vec.push_back(vehicle); + weak_vehicle_vec.push_back(std::weak_ptr<mantle_api::IEntity>(vehicle)); ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetUniqueId).WillByDefault(Return(id)); ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicle_vec.back()), GetPosition).WillByDefault(Return(vehicles_.at(id).second.position)); } - return vehicle_vec; }); + return weak_vehicle_vec; }); const std::vector<mantle_api::ITrafficSwarmService::SpawningPosition> spawning_positions{{mantle_api::Pose{host_position, host_orientation}, mantle_api::ITrafficSwarmService::RelativePosition::kInFront}}; - ON_CALL(mock_environment_->GetTrafficSwarmService(), GetAvailableSpawningPoses()).WillByDefault(Return(spawning_positions)); + ON_CALL(fake_environment_->GetTrafficSwarmService(), GetAvailableSpawningPoses()).WillByDefault(Return(spawning_positions)); - ON_CALL(mock_environment_->GetTrafficSwarmService(), GetVehicleProperties(_)).WillByDefault([](mantle_api::VehicleClass vehicle_class) -> mantle_api::VehicleProperties + ON_CALL(fake_environment_->GetTrafficSwarmService(), GetVehicleProperties(_)).WillByDefault([](mantle_api::VehicleClass vehicle_class) -> mantle_api::VehicleProperties { mantle_api::VehicleProperties properties; properties.classification = vehicle_class; diff --git a/engine/tests/Storyboard/GenericAction/VisibilityActionTest.cpp b/engine/tests/Storyboard/GenericAction/VisibilityActionTest.cpp index f5cddaafc48e11e6a19536f521961ee2f8fcecd6..f59a35e18354dc4d1c5758fc1b9a3c9d637d0324 100644 --- a/engine/tests/Storyboard/GenericAction/VisibilityActionTest.cpp +++ b/engine/tests/Storyboard/GenericAction/VisibilityActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made @@ -53,7 +53,7 @@ TEST_F(VisibilityActionTestFixture, GivenVisibilityActionWithOneActor_WhenStepAc const mantle_api::EntityVisibilityConfig expected_vis_config{ expected_graphic_value, expected_traffic_value, expected_sensors_value, {}}; - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("")->get()), + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), SetVisibility(VisConfigEqualTo(expected_vis_config))) .Times(1); @@ -77,7 +77,7 @@ TEST_F(VisibilityActionTestFixture, GivenVisibilityActionWithTwoActor_WhenStepAc const mantle_api::EntityVisibilityConfig expected_vis_config{ expected_default_value, expected_default_value, expected_default_value, {}}; - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("")->get()), + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), SetVisibility(VisConfigEqualTo(expected_vis_config))) .Times(2); @@ -122,7 +122,7 @@ TEST_F(VisibilityActionTestFixture, GivenVisibilityActionWithMultipleSensors_Whe const mantle_api::EntityVisibilityConfig expected_vis_config{ expected_default_value, expected_default_value, expected_default_value, {expected_sensor_name_1, expected_sensor_name_2, expected_sensor_name_3}}; - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("")->get()), + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), SetVisibility(VisConfigEqualTo(expected_vis_config))) .Times(1); diff --git a/engine/tests/Storyboard/MotionControlAction/FollowTrajectoryActionTest.cpp b/engine/tests/Storyboard/MotionControlAction/FollowTrajectoryActionTest.cpp index 8536a2f735faaadf9841c7126489ccf513d62e07..b6203eb7177138283d4eabbacb6bd4b77d19e2df 100644 --- a/engine/tests/Storyboard/MotionControlAction/FollowTrajectoryActionTest.cpp +++ b/engine/tests/Storyboard/MotionControlAction/FollowTrajectoryActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -11,7 +11,6 @@ #include <MantleAPI/Common/clothoid_spline.h> #include <MantleAPI/Common/pose.h> -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include "Conversion/OscToMantle/ConvertScenarioTimeReference.h" @@ -236,7 +235,7 @@ TEST_F(FollowTrajectoryActionTestFixture, EXPECT_CALL(*env_, UpdateControlStrategies(testing::_, testing::_)) .WillOnce(testing::SaveArg<1>(&control_strategies)); - EXPECT_CALL(dynamic_cast<mantle_api::MockConverter&>(*(env_->GetConverter())), Convert(testing::_)) + EXPECT_CALL(dynamic_cast<mantle_api::MockCoordConverter&>(*(env_->GetConverter())), Convert(testing::_)) .WillOnce(testing::Return(expected_position1)) .WillOnce(testing::Return(expected_position2)); @@ -287,7 +286,7 @@ TEST_F(FollowTrajectoryActionTestFixture, .WillOnce(testing::Return(expected_position1)) .WillOnce(testing::Return(expected_position2)); - EXPECT_CALL(dynamic_cast<mantle_api::MockConverter&>(*(env_->GetConverter())), Convert(testing::_)) + EXPECT_CALL(dynamic_cast<mantle_api::MockCoordConverter&>(*(env_->GetConverter())), Convert(testing::_)) .WillOnce(testing::Return(expected_position1)) .WillOnce(testing::Return(expected_position2)); @@ -370,11 +369,11 @@ TEST_F(FollowTrajectoryActionTestFixture, auto follow_trajectory_action = std::make_shared<Node::FollowTrajectoryAction>(fake_follow_trajectory_action); - EXPECT_CALL(*env_, HasControlStrategyGoalBeenReached(0, mantle_api::ControlStrategyType::kFollowTrajectory)) + EXPECT_CALL(*env_, HasControlStrategyGoalBeenReached(UniqueId(0), mantle_api::ControlStrategyType::kFollowTrajectory)) .Times(2) .WillOnce(::testing::Return(false)) .WillRepeatedly(::testing::Return(true)); - EXPECT_CALL(*env_, UpdateControlStrategies(0, testing::_)).Times(3); + EXPECT_CALL(*env_, UpdateControlStrategies(UniqueId(0), testing::_)).Times(3); root_node_->setChild(follow_trajectory_action); root_node_->distributeData(); @@ -388,8 +387,8 @@ TEST_F(FollowTrajectoryActionTestFixture, TEST(FollowTrajectoryAction, GivenMatchingControlStrategyGoalIsReached_ReturnsTrue) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); - ON_CALL(*mockEnvironment, + auto fake_environment = std::make_shared<FakeEnvironment>(); + ON_CALL(*fake_environment, HasControlStrategyGoalBeenReached(_, ControlStrategyType::kFollowTrajectory)) .WillByDefault(Return(true)); @@ -399,15 +398,15 @@ TEST(FollowTrajectoryAction, GivenMatchingControlStrategyGoalIsReached_ReturnsTr OpenScenarioEngine::v1_3::TimeReference{}, OpenScenarioEngine::v1_3::TrajectoryFollowingMode{}, OpenScenarioEngine::v1_3::TrajectoryRef{}}, - {mockEnvironment}); + {fake_environment}); ASSERT_TRUE(followTrajectoryAction.HasControlStrategyGoalBeenReached("Vehicle1")); } TEST(FollowTrajectoryAction, GivenUnmatchingControlStrategyGoalIsReached_ReturnsFalse) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); - ON_CALL(*mockEnvironment, + auto fake_environment = std::make_shared<FakeEnvironment>(); + ON_CALL(*fake_environment, HasControlStrategyGoalBeenReached(_, ControlStrategyType::kUndefined)) .WillByDefault(Return(false)); @@ -417,7 +416,7 @@ TEST(FollowTrajectoryAction, GivenUnmatchingControlStrategyGoalIsReached_Returns OpenScenarioEngine::v1_3::TimeReference{}, OpenScenarioEngine::v1_3::TrajectoryFollowingMode{}, OpenScenarioEngine::v1_3::TrajectoryRef{}}, - {mockEnvironment}); + {fake_environment}); ASSERT_FALSE(followTrajectoryAction.HasControlStrategyGoalBeenReached("Vehicle1")); } @@ -425,7 +424,7 @@ TEST(FollowTrajectoryAction, GivenUnmatchingControlStrategyGoalIsReached_Returns TEST(FollowTrajectoryAction, GivenFollowTrajectoryAction_WhenNoTrajectoryRef_ThenNoUpdateControlStrategyAndLogError) { testing::OpenScenarioEngine::v1_3::TestLogger logger; - auto mockEnvironment = std::make_shared<MockEnvironment>(); + auto fake_environment = std::make_shared<FakeEnvironment>(); OpenScenarioEngine::v1_3::FollowTrajectoryAction followTrajectoryAction({std::vector<std::string>{"Vehicle1"}, 0.0, @@ -433,9 +432,9 @@ TEST(FollowTrajectoryAction, GivenFollowTrajectoryAction_WhenNoTrajectoryRef_The OpenScenarioEngine::v1_3::TimeReference{}, OpenScenarioEngine::v1_3::TrajectoryFollowingMode{}, OpenScenarioEngine::v1_3::TrajectoryRef{}}, - {mockEnvironment}); + {fake_environment}); - EXPECT_CALL(*mockEnvironment, UpdateControlStrategies(_, _)).Times(::testing::AtMost(0)); + EXPECT_CALL(*fake_environment, UpdateControlStrategies(_, _)).Times(::testing::AtMost(0)); EXPECT_NO_THROW(followTrajectoryAction.SetControlStrategy()); EXPECT_THAT(logger.LastLogLevel(), mantle_api::LogLevel::kError); EXPECT_THAT(logger.LastLogMessage(), testing::HasSubstr("FollowTrajectoryAction does not contain TrajectoryRef.")); @@ -455,15 +454,15 @@ TEST(FollowTrajectoryAction, GivenFollowTrajectoryActionAndTrajectoryRef_WhenPol mantle_api::Trajectory setTrajectory{}; setTrajectory.type = polyLine; - auto mockEnvironment = std::make_shared<MockEnvironment>(); - auto mockGeometryHelper = static_cast<const MockGeometryHelper*>(mockEnvironment->GetGeometryHelper()); + auto fake_environment = std::make_shared<FakeEnvironment>(); + auto mockGeometryHelper = static_cast<const MockGeometryHelper*>(fake_environment->GetGeometryHelper()); ON_CALL(*mockGeometryHelper, TranslateGlobalPositionLocally(pose1.position, _, _)).WillByDefault(Return(pose1.position)); ON_CALL(*mockGeometryHelper, TranslateGlobalPositionLocally(pose2.position, _, _)).WillByDefault(Return(pose2.position)); ON_CALL(*mockGeometryHelper, TranslateGlobalPositionLocally(pose3.position, _, _)).WillByDefault(Return(pose3.position)); std::vector<std::shared_ptr<ControlStrategy>> control_strategies{}; - EXPECT_CALL(*mockEnvironment, UpdateControlStrategies(_, _)).WillOnce(SaveArg<1>(&control_strategies)); + EXPECT_CALL(*fake_environment, UpdateControlStrategies(_, _)).WillOnce(SaveArg<1>(&control_strategies)); OpenScenarioEngine::v1_3::FollowTrajectoryAction followTrajectoryAction({std::vector<std::string>{"Vehicle1"}, 0.0, @@ -471,7 +470,7 @@ TEST(FollowTrajectoryAction, GivenFollowTrajectoryActionAndTrajectoryRef_WhenPol OpenScenarioEngine::v1_3::TimeReference{}, OpenScenarioEngine::v1_3::TrajectoryFollowingMode{}, setTrajectory}, - {mockEnvironment}); + {fake_environment}); EXPECT_NO_THROW(followTrajectoryAction.SetControlStrategy()); @@ -503,13 +502,13 @@ TEST(FollowTrajectoryAction, GivenFollowTrajectoryActionAndTrajectoryRef_WhenClo mantle_api::Trajectory expected_trajectory{}; expected_trajectory.type = expected_clothoid_spline; - auto mock_environment = std::make_shared<MockEnvironment>(); - auto mockGeometryHelper = static_cast<const MockGeometryHelper*>(mock_environment->GetGeometryHelper()); + auto fake_environment = std::make_shared<FakeEnvironment>(); + auto mockGeometryHelper = static_cast<const MockGeometryHelper*>(fake_environment->GetGeometryHelper()); ON_CALL(*mockGeometryHelper, TranslateGlobalPositionLocally(expected_clothoid_spline.segments.front().position_start.value().position, _, _)).WillByDefault(Return(expected_clothoid_spline.segments.front().position_start.value().position)); std::vector<std::shared_ptr<ControlStrategy>> control_strategies{}; - EXPECT_CALL(*mock_environment, UpdateControlStrategies(_, _)).WillOnce(SaveArg<1>(&control_strategies)); + EXPECT_CALL(*fake_environment, UpdateControlStrategies(_, _)).WillOnce(SaveArg<1>(&control_strategies)); OpenScenarioEngine::v1_3::FollowTrajectoryAction follow_trajectory_action({std::vector<std::string>{"Vehicle1"}, 0.0, @@ -517,7 +516,7 @@ TEST(FollowTrajectoryAction, GivenFollowTrajectoryActionAndTrajectoryRef_WhenClo OpenScenarioEngine::v1_3::TimeReference{}, OpenScenarioEngine::v1_3::TrajectoryFollowingMode{}, expected_trajectory}, - {mock_environment}); + {fake_environment}); EXPECT_NO_THROW(follow_trajectory_action.SetControlStrategy()); @@ -534,9 +533,9 @@ TEST(FollowTrajectoryAction, GivenFollowTrajectoryActionAndTrajectoryRef_WhenClo TEST(FollowTrajectoryAction, GivenFollowTrajectoryActionWithTimeReference_WhenStartAction_ThenControlStrategyHasMovementDomainBoth) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); + auto fake_environment = std::make_shared<FakeEnvironment>(); std::vector<std::shared_ptr<ControlStrategy>> control_strategies{}; - EXPECT_CALL(*mockEnvironment, UpdateControlStrategies(_, _)).WillOnce(SaveArg<1>(&control_strategies)); + EXPECT_CALL(*fake_environment, UpdateControlStrategies(_, _)).WillOnce(SaveArg<1>(&control_strategies)); OpenScenarioEngine::v1_3::FollowTrajectoryAction followTrajectoryAction({std::vector<std::string>{"Vehicle1"}, 0.0, @@ -544,7 +543,7 @@ TEST(FollowTrajectoryAction, {mantle_api::FollowTrajectoryControlStrategy::TrajectoryTimeReference{}}, OpenScenarioEngine::v1_3::TrajectoryFollowingMode{}, mantle_api::Trajectory{}}, - {mockEnvironment}); + {fake_environment}); followTrajectoryAction.SetControlStrategy(); ASSERT_THAT(control_strategies, testing::SizeIs(1)); @@ -557,9 +556,9 @@ TEST(FollowTrajectoryAction, TEST(FollowTrajectoryAction, GivenFollowTrajectoryActionWithoutTimeReference_WhenStartAction_ThenControlStrategyHasMovementDomainLateral) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); + auto fake_environment = std::make_shared<FakeEnvironment>(); std::vector<std::shared_ptr<ControlStrategy>> control_strategies{}; - EXPECT_CALL(*mockEnvironment, UpdateControlStrategies(_, _)).WillOnce(SaveArg<1>(&control_strategies)); + EXPECT_CALL(*fake_environment, UpdateControlStrategies(_, _)).WillOnce(SaveArg<1>(&control_strategies)); OpenScenarioEngine::v1_3::FollowTrajectoryAction followTrajectoryAction({std::vector<std::string>{"Vehicle1"}, 0.0, @@ -567,7 +566,7 @@ TEST(FollowTrajectoryAction, std::nullopt, OpenScenarioEngine::v1_3::TrajectoryFollowingMode{}, mantle_api::Trajectory{}}, - {mockEnvironment}); + {fake_environment}); followTrajectoryAction.SetControlStrategy(); ASSERT_THAT(control_strategies, testing::SizeIs(1)); diff --git a/engine/tests/Storyboard/MotionControlAction/LaneChangeActionTest.cpp b/engine/tests/Storyboard/MotionControlAction/LaneChangeActionTest.cpp index 839895b0fe97ba4d9ebc881595dcf09c2e766b93..d2e462fc502a723bfda6a2691ef6395494bfb707 100644 --- a/engine/tests/Storyboard/MotionControlAction/LaneChangeActionTest.cpp +++ b/engine/tests/Storyboard/MotionControlAction/LaneChangeActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -9,13 +9,12 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> -#include "builders/ActionBuilder.h" #include "Storyboard/MotionControlAction/LaneChangeAction.h" #include "Storyboard/MotionControlAction/LaneChangeAction_impl.h" #include "TestUtils.h" +#include "builders/ActionBuilder.h" #include "gmock/gmock.h" using namespace mantle_api; @@ -24,168 +23,173 @@ using testing::Return; using namespace OpenScenarioEngine::v1_3; using namespace testing::OpenScenarioEngine::v1_3; -class LaneChangeActionTestFixture : public OpenScenarioEngineLibraryTestBase { +class LaneChangeActionTestFixture : public OpenScenarioEngineLibraryTestBase +{ protected: - void SetUp() override - { - OpenScenarioEngineLibraryTestBase::SetUp(); - auto engine_abort_flags = std::make_shared<EngineAbortFlags>(EngineAbortFlags::kNoAbort); - auto entity_broker = std::make_shared<EntityBroker>(false); - entity_broker->add("Ego"); - root_node_ = std::make_shared<FakeRootNode>(env_, engine_abort_flags, entity_broker); - } - - std::shared_ptr<FakeRootNode> root_node_{nullptr}; + void SetUp() override + { + OpenScenarioEngineLibraryTestBase::SetUp(); + auto engine_abort_flags = std::make_shared<EngineAbortFlags>(EngineAbortFlags::kNoAbort); + auto entity_broker = std::make_shared<EntityBroker>(false); + entity_broker->add("Ego"); + root_node_ = std::make_shared<FakeRootNode>(env_, engine_abort_flags, entity_broker); + } + + std::shared_ptr<FakeRootNode> root_node_{nullptr}; }; -#if !defined (WIN32) && !defined (WIN64) +#if !defined(WIN32) && !defined(WIN64) TEST_F(LaneChangeActionTestFixture, GivenLaneChangeActionWithoutDynamics_WhenDistributeData_SegmentationFault) { - auto lane_change_action_data = - FakeLaneChangeActionBuilder{} - .WithLaneChangeTarget( - FakeLaneChangeTargetBuilder{}.WithAbsoluteTargetLane( - FakeAbsoluteTargetLaneBuilder{}.WithValue("1").Build()) - .Build()) - .Build(); - auto lane_change_action = std::make_shared<Node::LaneChangeAction>(lane_change_action_data); - - root_node_->setChild(lane_change_action); - ASSERT_EXIT(root_node_->distributeData(), ::testing::KilledBySignal(SIGSEGV),".*"); + auto lane_change_action_data = + FakeLaneChangeActionBuilder{} + .WithLaneChangeTarget( + FakeLaneChangeTargetBuilder{}.WithAbsoluteTargetLane( + FakeAbsoluteTargetLaneBuilder{}.WithValue("1").Build()) + .Build()) + .Build(); + auto lane_change_action = std::make_shared<Node::LaneChangeAction>(lane_change_action_data); + + root_node_->setChild(lane_change_action); + ASSERT_EXIT(root_node_->distributeData(), ::testing::KilledBySignal(SIGSEGV), ".*"); } #endif TEST_F(LaneChangeActionTestFixture, GivenLaneChangeActionWithoutLaneChangeTarget_WhenExecuteTick_ExceptionRaised) { - auto lane_change_action_data = - FakeLaneChangeActionBuilder{} - .WithDynamics(FakeTransitionDynamicsBuilder{}.Build()) - .WithLaneChangeTarget(FakeLaneChangeTargetBuilder{}.Build()) - .Build(); - auto lane_change_action = std::make_shared<Node::LaneChangeAction>(lane_change_action_data); - - root_node_->setChild(lane_change_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_ANY_THROW(root_node_->executeTick()); + auto lane_change_action_data = + FakeLaneChangeActionBuilder{} + .WithDynamics(FakeTransitionDynamicsBuilder{}.Build()) + .WithLaneChangeTarget(FakeLaneChangeTargetBuilder{}.Build()) + .Build(); + auto lane_change_action = std::make_shared<Node::LaneChangeAction>(lane_change_action_data); + + root_node_->setChild(lane_change_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_ANY_THROW(root_node_->executeTick()); } TEST_F(LaneChangeActionTestFixture, GivenLaneChangeActionWithAbsoluteTargetLane_WhenControlStrategyGoalReached_ThenExpectCorrectStrategy) { - std::string shape_name("step"); - NET_ASAM_OPENSCENARIO::v1_3::DynamicsShape dynamics_shape(shape_name); - auto lane_change_action_data = - FakeLaneChangeActionBuilder{} - .WithDynamics(FakeTransitionDynamicsBuilder{}.Build()) - .WithLaneChangeTarget( - FakeLaneChangeTargetBuilder{}.WithAbsoluteTargetLane( - FakeAbsoluteTargetLaneBuilder{}.WithValue("1").Build()) - .Build()) - .Build(); - auto lane_change_action = std::make_shared<Node::LaneChangeAction>(lane_change_action_data); - - auto expected_control_strategy = mantle_api::PerformLaneChangeControlStrategy(); - - EXPECT_CALL(*env_, UpdateControlStrategies(0, testing::_)) - .Times(1) - .WillRepeatedly([expected_control_strategy]( - std::uint64_t controller_id, - std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies) { + std::string shape_name("step"); + NET_ASAM_OPENSCENARIO::v1_3::DynamicsShape dynamics_shape(shape_name); + auto lane_change_action_data = + FakeLaneChangeActionBuilder{} + .WithDynamics(FakeTransitionDynamicsBuilder{}.Build()) + .WithLaneChangeTarget( + FakeLaneChangeTargetBuilder{}.WithAbsoluteTargetLane( + FakeAbsoluteTargetLaneBuilder{}.WithValue("1").Build()) + .Build()) + .Build(); + auto lane_change_action = std::make_shared<Node::LaneChangeAction>(lane_change_action_data); + + auto expected_control_strategy = mantle_api::PerformLaneChangeControlStrategy(); + + EXPECT_CALL(*env_, UpdateControlStrategies(UniqueId(0), testing::_)) + .Times(1) + .WillRepeatedly([expected_control_strategy]( + mantle_api::UniqueId controller_id, + std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies) + { std::ignore = controller_id; EXPECT_EQ(1, control_strategies.size()); auto control_strategy = dynamic_cast<mantle_api::PerformLaneChangeControlStrategy*>(control_strategies[0].get()); EXPECT_NE(nullptr, control_strategy); - EXPECT_EQ(*control_strategy, expected_control_strategy); - }); + EXPECT_EQ(*control_strategy, expected_control_strategy); }); - root_node_->setChild(lane_change_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); + root_node_->setChild(lane_change_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); } TEST_F(LaneChangeActionTestFixture, GivenLaneChangeActionWithRelativeLaneTarget_WhenControlStrategyGoalReached_ThenExpectCorrectStrategy) { - std::string shape_name("step"); - NET_ASAM_OPENSCENARIO::v1_3::DynamicsShape dynamics_shape(shape_name); - auto lane_change_action_data = - FakeLaneChangeActionBuilder{} - .WithDynamics(FakeTransitionDynamicsBuilder{}.Build()) - .WithLaneChangeTarget( - FakeLaneChangeTargetBuilder{}.WithRelativeTargetLane( - FakeRelativeTargetLaneBuilder{}.WithValue(1).WithEntityRef("Ego").Build()) - .Build()) - .Build(); - auto lane_change_action = std::make_shared<Node::LaneChangeAction>(lane_change_action_data); - - auto expected_control_strategy = mantle_api::PerformLaneChangeControlStrategy(); - - EXPECT_CALL(*env_, UpdateControlStrategies(0, testing::_)) - .Times(1) - .WillRepeatedly([expected_control_strategy]( - std::uint64_t controller_id, - std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies) { + std::string shape_name("step"); + NET_ASAM_OPENSCENARIO::v1_3::DynamicsShape dynamics_shape(shape_name); + auto lane_change_action_data = + FakeLaneChangeActionBuilder{} + .WithDynamics(FakeTransitionDynamicsBuilder{}.Build()) + .WithLaneChangeTarget( + FakeLaneChangeTargetBuilder{}.WithRelativeTargetLane( + FakeRelativeTargetLaneBuilder{}.WithValue(1).WithEntityRef("Ego").Build()) + .Build()) + .Build(); + auto lane_change_action = std::make_shared<Node::LaneChangeAction>(lane_change_action_data); + + auto expected_control_strategy = mantle_api::PerformLaneChangeControlStrategy(); + + EXPECT_CALL(*env_, UpdateControlStrategies(UniqueId(0), testing::_)) + .Times(1) + .WillRepeatedly([expected_control_strategy]( + UniqueId controller_id, + std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies) + { std::ignore = controller_id; EXPECT_EQ(1, control_strategies.size()); auto control_strategy = dynamic_cast<mantle_api::PerformLaneChangeControlStrategy*>(control_strategies[0].get()); EXPECT_NE(nullptr, control_strategy); - EXPECT_EQ(*control_strategy, expected_control_strategy); - }); + EXPECT_EQ(*control_strategy, expected_control_strategy); }); - root_node_->setChild(lane_change_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); + root_node_->setChild(lane_change_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); } TEST(LaneChangeAction, GivenMatchingControlStrategyGoalIsReached_ReturnTrue) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); - ON_CALL(*mockEnvironment, + auto fake_environment = std::make_shared<FakeEnvironment>(); + ON_CALL(*fake_environment, HasControlStrategyGoalBeenReached(_, ControlStrategyType::kPerformLaneChange)) .WillByDefault(Return(true)); OpenScenarioEngine::v1_3::LaneChangeAction laneChangeAction({std::vector<std::string>{"Vehicle1"}, 0.0, OpenScenarioEngine::v1_3::TransitionDynamics{}, - []() -> UniqueId { return 0; }}, - {mockEnvironment}); + []() -> LaneId + { return 0; }}, + {fake_environment}); ASSERT_TRUE(laneChangeAction.HasControlStrategyGoalBeenReached("Vehicle1")); } TEST(LaneChangeAction, GivenUnmatchingControlStrategyGoalIsReached_ReturnsFalse) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); - ON_CALL(*mockEnvironment, + auto fake_environment = std::make_shared<FakeEnvironment>(); + ON_CALL(*fake_environment, HasControlStrategyGoalBeenReached(_, ControlStrategyType::kUndefined)) .WillByDefault(Return(false)); OpenScenarioEngine::v1_3::LaneChangeAction laneChangeAction({std::vector<std::string>{"Vehicle1"}, 0.0, OpenScenarioEngine::v1_3::TransitionDynamics{}, - []() -> UniqueId { return 0; }}, - {mockEnvironment}); + []() -> LaneId + { return 0; }}, + {fake_environment}); ASSERT_FALSE(laneChangeAction.HasControlStrategyGoalBeenReached("Vehicle1")); } TEST(LaneChangeAction, GivenControlStrategyElements_SetUpControlStrategy) { - auto mockEnvironment = std::make_shared<MockEnvironment>(); + auto fake_environment = std::make_shared<FakeEnvironment>(); std::vector<std::shared_ptr<ControlStrategy>> control_strategies{}; - EXPECT_CALL(*mockEnvironment, UpdateControlStrategies(0, testing::_)) + ON_CALL(dynamic_cast<MockVehicle&>(*fake_environment->GetEntityRepository().Get("Ego").lock()), GetUniqueId()).WillByDefault(testing::Return(UniqueId(0))); + EXPECT_CALL(*fake_environment, UpdateControlStrategies(UniqueId(0), testing::_)) .Times(1) .WillOnce(testing::SaveArg<1>(&control_strategies)); OpenScenarioEngine::v1_3::LaneChangeAction laneChangeAction({std::vector<std::string>{"Vehicle1"}, 0.0, OpenScenarioEngine::v1_3::TransitionDynamics{}, - []() -> UniqueId { return 0; }}, - {mockEnvironment}); + []() -> LaneId + { return 0; }}, + {fake_environment}); EXPECT_NO_THROW(laneChangeAction.SetControlStrategy()); auto control_strategy = dynamic_cast<PerformLaneChangeControlStrategy*>(control_strategies[0].get()); diff --git a/engine/tests/Storyboard/MotionControlAction/LaneOffsetActionTest.cpp b/engine/tests/Storyboard/MotionControlAction/LaneOffsetActionTest.cpp index 6c86ba28e3737c110428fc51e91984830cbaa0f3..685b86578f6a1710ca9702f8a10fb912184c7425 100644 --- a/engine/tests/Storyboard/MotionControlAction/LaneOffsetActionTest.cpp +++ b/engine/tests/Storyboard/MotionControlAction/LaneOffsetActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2025, Ansys, Inc. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,20 +8,19 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> +#include "Storyboard/MotionControlAction/LaneOffsetAction.h" #include "Storyboard/MotionControlAction/LaneOffsetAction_impl.h" +#include "TestUtils.h" +#include "builders/ActionBuilder.h" #include "gmock/gmock.h" using namespace mantle_api; using namespace units::literals; -#include "Storyboard/MotionControlAction/LaneOffsetAction.h" -#include "TestUtils.h" -#include "builders/ActionBuilder.h" - using namespace mantle_api; +using testing::_; using testing::Eq; using testing::NiceMock; using testing::Return; @@ -57,10 +56,10 @@ TEST_F(LaneOffsetActionTestFixture, GivenLaneOffsetActionControlStrategyElements OpenScenarioEngine::v1_3::LaneOffsetActionDynamics laneOffsetActionDynamics{.maxLateralAcc = max_lat_acc, .dynamicsShape = dynamics_shape}; OpenScenarioEngine::v1_3::LaneOffsetTarget laneOffsetTarget = 1_m; - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); + auto fake_environment = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies{}; - EXPECT_CALL(*mockEnvironment, - UpdateControlStrategies(testing::_, testing::_)) + EXPECT_CALL(*fake_environment, + UpdateControlStrategies(_, _)) .WillOnce(testing::SaveArg<1>(&control_strategies)); OpenScenarioEngine::v1_3::LaneOffsetAction laneOffsetAction({.entities = std::vector<std::string>{"Ego"}, @@ -68,7 +67,7 @@ TEST_F(LaneOffsetActionTestFixture, GivenLaneOffsetActionControlStrategyElements .laneOffsetActionDynamics = laneOffsetActionDynamics, .GetLaneOffsetTarget = [laneOffsetTarget](const Entity &actor) -> units::length::meter_t { return laneOffsetTarget; }}, - {mockEnvironment}); + {fake_environment}); EXPECT_NO_THROW(laneOffsetAction.SetControlStrategy()); EXPECT_THAT(control_strategies, testing::SizeIs(1)); @@ -80,7 +79,7 @@ TEST_F(LaneOffsetActionTestFixture, GivenLaneOffsetActionControlStrategyElements EXPECT_THAT(control_strategy->continuous, Eq(continuous)); EXPECT_THAT(laneOffsetAction.GetMovementDomain(), Eq(mantle_api::MovementDomain::kLateral)); - EXPECT_CALL(*mockEnvironment, + EXPECT_CALL(*fake_environment, HasControlStrategyGoalBeenReached(testing::_, testing::_)) .WillOnce(Return(false)); EXPECT_FALSE(laneOffsetAction.HasControlStrategyGoalBeenReached("Ego")); diff --git a/engine/tests/Storyboard/MotionControlAction/LateralDistanceActionTest.cpp b/engine/tests/Storyboard/MotionControlAction/LateralDistanceActionTest.cpp index fbc93034c589453c68ad8103e03298d373e477ae..608850cda369f0b67bb6abc304b7ccb84037e09e 100644 --- a/engine/tests/Storyboard/MotionControlAction/LateralDistanceActionTest.cpp +++ b/engine/tests/Storyboard/MotionControlAction/LateralDistanceActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,13 +8,14 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include "Storyboard/MotionControlAction/LateralDistanceAction_impl.h" +#include "TestUtils.h" #include "TestUtils/TestLogger.h" using namespace mantle_api; +using namespace testing::OpenScenarioEngine::v1_3; using units::literals::operator""_m; using units::literals::operator""_rad; @@ -25,11 +26,11 @@ protected: void SetUp() override { LOGGER = std::make_unique<testing::OpenScenarioEngine::v1_3::TestLogger>(); - mock_environment_ = std::make_shared<MockEnvironment>(); + fake_environment_ = std::make_shared<testing::OpenScenarioEngine::v1_3::FakeEnvironment>(); } std::unique_ptr<testing::OpenScenarioEngine::v1_3::TestLogger> LOGGER; - std::shared_ptr<MockEnvironment> mock_environment_; + std::shared_ptr<testing::OpenScenarioEngine::v1_3::FakeEnvironment> fake_environment_; OpenScenarioEngine::v1_3::LateralDistanceAction::Values values_{.entities = {"Actor"}, .continuous = false, .distance = 0.0, @@ -42,7 +43,7 @@ protected: TEST_F(LateralDistanceActionTestFixture, GivenNoDynamicConstraintsAndContinuousFalse_WhenHasControlStrategyGoalBeenReached_ThenReturnsTrue) { - OpenScenarioEngine::v1_3::LateralDistanceAction lateralDistanceAction(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateralDistanceAction(values_, {fake_environment_}); ASSERT_TRUE(lateralDistanceAction.HasControlStrategyGoalBeenReached("actorEntity")); } @@ -50,7 +51,7 @@ TEST_F(LateralDistanceActionTestFixture, GivenNoDynamicConstraintsAndContinuousF TEST_F(LateralDistanceActionTestFixture, GivenNoDynamicConstraintsAndContinuousTrue_WhenHasControlStrategyGoalBeenReached_ThenReturnsFalse) { values_.continuous = true; - OpenScenarioEngine::v1_3::LateralDistanceAction lateralDistanceAction(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateralDistanceAction(values_, {fake_environment_}); ASSERT_FALSE(lateralDistanceAction.HasControlStrategyGoalBeenReached("actorEntity")); } @@ -58,7 +59,7 @@ TEST_F(LateralDistanceActionTestFixture, GivenNoDynamicConstraintsAndContinuousT TEST_F(LateralDistanceActionTestFixture, GivenDynamicConstraintsAndContinuousFalse_WhenHasControlStrategyGoalBeenReached_ThenReturnsFalse) { values_.dynamicConstraints = OpenScenarioEngine::v1_3::DynamicConstraintsStruct{}; - OpenScenarioEngine::v1_3::LateralDistanceAction lateralDistanceAction(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateralDistanceAction(values_, {fake_environment_}); ASSERT_FALSE(lateralDistanceAction.HasControlStrategyGoalBeenReached("actorEntity")); } @@ -66,7 +67,7 @@ TEST_F(LateralDistanceActionTestFixture, GivenDynamicConstraintsAndContinuousFal TEST_F(LateralDistanceActionTestFixture, GivenContinuousTrue_WhenSetControlStrategy_ThenReturnWithError) { values_.continuous = true; - OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {fake_environment_}); lateral_distance_action.SetControlStrategy(); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kError); @@ -76,7 +77,7 @@ TEST_F(LateralDistanceActionTestFixture, GivenContinuousTrue_WhenSetControlStrat TEST_F(LateralDistanceActionTestFixture, GivenCoordinateSystemOtherThanLane_WhenSetControlStrategy_ThenReturnWithError) { values_.coordinateSystem = OpenScenarioEngine::v1_3::CoordinateSystem::kEntity; - OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {fake_environment_}); lateral_distance_action.SetControlStrategy(); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kError); @@ -86,7 +87,7 @@ TEST_F(LateralDistanceActionTestFixture, GivenCoordinateSystemOtherThanLane_When TEST_F(LateralDistanceActionTestFixture, GivenDynamicConstraints_WhenSetControlStrategy_ThenReturnWithError) { values_.dynamicConstraints = OpenScenarioEngine::v1_3::DynamicConstraintsStruct{}; - OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {fake_environment_}); lateral_distance_action.SetControlStrategy(); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kError); @@ -96,18 +97,18 @@ TEST_F(LateralDistanceActionTestFixture, GivenDynamicConstraints_WhenSetControlS TEST_F(LateralDistanceActionTestFixture, GivenNegativeDistance_WhenSetControlStrategy_ThenExceptionThrown) { values_.distance = -2.0; - OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {fake_environment_}); EXPECT_THROW(lateral_distance_action.SetControlStrategy(), std::runtime_error); } TEST_F(LateralDistanceActionTestFixture, GivenRefEntityNotOnLane_WhenSetControlStrategy_ThenReturnWithWarning) { std::vector<mantle_api::UniqueId> empty_list{}; - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(mock_environment_->GetQueryService()), + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fake_environment_->GetQueryService()), GetLaneIdsAtPosition(testing::_)) .WillRepeatedly(testing::Return(empty_list)); - OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {fake_environment_}); lateral_distance_action.SetControlStrategy(); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kWarning); @@ -123,9 +124,9 @@ TEST_F(LateralDistanceActionTestFixture, GivenDistanceWithinRoadNetworkFreespace mantle_api::Vec3<units::length::meter_t> actor_entity_laterally_shifted_position{2.0_m, 3.0_m, 0.0_m}; std::vector<mantle_api::UniqueId> lane_ids{1}; - auto& actor_entity = dynamic_cast<mantle_api::MockVehicle&>(mock_environment_->GetEntityRepository().Get("Actor").value().get()); - auto& mock_geometry_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*mock_environment_->GetGeometryHelper()); - auto& mock_query_service = dynamic_cast<const mantle_api::MockQueryService&>(mock_environment_->GetQueryService()); + auto& actor_entity = dynamic_cast<mantle_api::MockVehicle&>(*fake_environment_->GetEntityRepository().Get("Actor").lock()); + auto& mock_geometry_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*fake_environment_->GetGeometryHelper()); + auto& mock_query_service = dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fake_environment_->GetQueryService()); EXPECT_CALL(mock_geometry_helper, TranslateGlobalPositionLocally(testing::_, testing::_, testing::_)) @@ -156,15 +157,15 @@ TEST_F(LateralDistanceActionTestFixture, GivenDistanceWithinRoadNetworkFreespace EXPECT_CALL(actor_entity, SetPosition(actor_entity_laterally_shifted_position)).Times(1); - OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {fake_environment_}); lateral_distance_action.SetControlStrategy(); } TEST_F(LateralDistanceActionTestFixture, GivenDistanceOutsideRoadNetwork_WhenSetControlStrategy_ThenActorPositionIsNotSet) { std::vector<mantle_api::UniqueId> lane_ids{1}; - auto& actor_entity = dynamic_cast<mantle_api::MockVehicle&>(mock_environment_->GetEntityRepository().Get("Actor").value().get()); - auto& mock_query_service = dynamic_cast<const mantle_api::MockQueryService&>(mock_environment_->GetQueryService()); + auto& actor_entity = dynamic_cast<mantle_api::MockVehicle&>(*fake_environment_->GetEntityRepository().Get("Actor").lock()); + auto& mock_query_service = dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fake_environment_->GetQueryService()); EXPECT_CALL(mock_query_service, GetLaneIdsAtPosition(testing::_)).WillRepeatedly(testing::Return(lane_ids)); @@ -175,7 +176,7 @@ TEST_F(LateralDistanceActionTestFixture, GivenDistanceOutsideRoadNetwork_WhenSet EXPECT_CALL(actor_entity, SetPosition(testing::_)).Times(0); - OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {fake_environment_}); lateral_distance_action.SetControlStrategy(); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kWarning); @@ -186,8 +187,8 @@ TEST_F(LateralDistanceActionTestFixture, GivenRefEntityPositionWhichCannotBeProj { mantle_api::Vec3<units::length::meter_t> ref_entity_position{1.0_m, 0.0_m, 0.0_m}; std::vector<mantle_api::UniqueId> lane_ids{1}; - auto& actor_entity = dynamic_cast<mantle_api::MockVehicle&>(mock_environment_->GetEntityRepository().Get("Actor").value().get()); - auto& mock_query_service = dynamic_cast<const mantle_api::MockQueryService&>(mock_environment_->GetQueryService()); + auto& actor_entity = dynamic_cast<mantle_api::MockVehicle&>(*fake_environment_->GetEntityRepository().Get("Actor").lock()); + auto& mock_query_service = dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fake_environment_->GetQueryService()); EXPECT_CALL(mock_query_service, GetLaneIdsAtPosition(testing::_)).WillRepeatedly(testing::Return(lane_ids)); @@ -203,7 +204,7 @@ TEST_F(LateralDistanceActionTestFixture, GivenRefEntityPositionWhichCannotBeProj EXPECT_CALL(actor_entity, SetPosition(testing::_)).Times(0); - OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {fake_environment_}); lateral_distance_action.SetControlStrategy(); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kWarning); @@ -214,8 +215,8 @@ TEST_F(LateralDistanceActionTestFixture, GivenActorEntityPositionWhichCannotBePr { mantle_api::Vec3<units::length::meter_t> ref_entity_position{1.0_m, 0.0_m, 0.0_m}; std::vector<mantle_api::UniqueId> lane_ids{1}; - auto& actor_entity = dynamic_cast<mantle_api::MockVehicle&>(mock_environment_->GetEntityRepository().Get("Actor").value().get()); - auto& mock_query_service = dynamic_cast<const mantle_api::MockQueryService&>(mock_environment_->GetQueryService()); + auto& actor_entity = dynamic_cast<mantle_api::MockVehicle&>(*fake_environment_->GetEntityRepository().Get("Actor").lock()); + auto& mock_query_service = dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fake_environment_->GetQueryService()); EXPECT_CALL(mock_query_service, GetLaneIdsAtPosition(testing::_)).WillRepeatedly(testing::Return(lane_ids)); @@ -236,7 +237,7 @@ TEST_F(LateralDistanceActionTestFixture, GivenActorEntityPositionWhichCannotBePr EXPECT_CALL(actor_entity, SetPosition(testing::_)).Times(0); - OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {fake_environment_}); lateral_distance_action.SetControlStrategy(); EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kWarning); @@ -262,16 +263,16 @@ TEST_F(LateralDistanceActionTestFixture, GivenFreespaceTrueVehiclesOrientedSimil mantle_api::Orientation3<units::angle::radian_t> lane_orientation{0.0_rad, 0.0_rad, 0.0_rad}; std::vector<mantle_api::UniqueId> lane_ids{1}; - MockVehicle ref_entity{}; - MockVehicle actor_entity{}; - auto& mock_geometry_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*mock_environment_->GetGeometryHelper()); - auto& mock_query_service = dynamic_cast<const mantle_api::MockQueryService&>(mock_environment_->GetQueryService()); - auto& mock_entity_repository = dynamic_cast<mantle_api::MockEntityRepository&>(mock_environment_->GetEntityRepository()); + std::shared_ptr<FakeVehicle> ref_entity{std::make_shared<FakeVehicle>()}; + std::shared_ptr<FakeVehicle> actor_entity{std::make_shared<FakeVehicle>()}; + auto& mock_geometry_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*fake_environment_->GetGeometryHelper()); + auto& mock_query_service = dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fake_environment_->GetQueryService()); + auto& fake_entity_repository = dynamic_cast<testing::OpenScenarioEngine::v1_3::FakeEntityRepository&>(fake_environment_->GetEntityRepository()); - EXPECT_CALL(mock_entity_repository, GetImpl("Ego")).WillRepeatedly(testing::Return(&ref_entity)); - EXPECT_CALL(mock_entity_repository, GetImpl("Actor")).WillRepeatedly(testing::Return(&actor_entity)); - EXPECT_CALL(ref_entity, GetPosition()).WillRepeatedly(testing::Return(ref_entity_position)); - EXPECT_CALL(actor_entity, GetPosition()).WillRepeatedly(testing::Return(actor_entity_position)); + EXPECT_CALL(fake_entity_repository, GetImpl("Ego")).WillRepeatedly(testing::Return(ref_entity)); + EXPECT_CALL(fake_entity_repository, GetImpl("Actor")).WillRepeatedly(testing::Return(actor_entity)); + EXPECT_CALL(*ref_entity, GetPosition()).WillRepeatedly(testing::Return(ref_entity_position)); + EXPECT_CALL(*actor_entity, GetPosition()).WillRepeatedly(testing::Return(actor_entity_position)); EXPECT_CALL(mock_query_service, GetLaneIdsAtPosition(testing::_)).WillRepeatedly(testing::Return(lane_ids)); EXPECT_CALL(mock_geometry_helper, AreOrientedSimilarly(testing::_, lane_orientation)).WillRepeatedly(testing::Return(true)); @@ -308,11 +309,11 @@ TEST_F(LateralDistanceActionTestFixture, GivenFreespaceTrueVehiclesOrientedSimil .WillOnce(testing::Return(ref_entity_frontleft_corner_position_laterally_shifted)) .WillOnce(testing::Return(actor_entity_frontright_corner_position_laterally_shifted)); - EXPECT_CALL(actor_entity, SetPosition(actor_entity_target_position)).Times(1); + EXPECT_CALL(*actor_entity, SetPosition(actor_entity_target_position)).Times(1); values_.lateralDisplacement = mantle_api::LateralDisplacementDirection::kLeft; values_.freespace = true; - OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {fake_environment_}); lateral_distance_action.SetControlStrategy(); } @@ -334,16 +335,16 @@ TEST_F(LateralDistanceActionTestFixture, GivenFreespaceTrueVehiclesOrientedOppos mantle_api::Orientation3<units::angle::radian_t> lane_orientation{0.0_rad, 0.0_rad, 0.0_rad}; std::vector<mantle_api::UniqueId> lane_ids{1}; - MockVehicle ref_entity{}; - MockVehicle actor_entity{}; - auto& mock_geometry_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*mock_environment_->GetGeometryHelper()); - auto& mock_query_service = dynamic_cast<const mantle_api::MockQueryService&>(mock_environment_->GetQueryService()); - auto& mock_entity_repository = dynamic_cast<mantle_api::MockEntityRepository&>(mock_environment_->GetEntityRepository()); + std::shared_ptr<FakeVehicle> ref_entity{std::make_shared<FakeVehicle>()}; + std::shared_ptr<FakeVehicle> actor_entity{std::make_shared<FakeVehicle>()}; + auto& mock_geometry_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*fake_environment_->GetGeometryHelper()); + auto& mock_query_service = dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(fake_environment_->GetQueryService()); + auto& fake_entity_repository = dynamic_cast<testing::OpenScenarioEngine::v1_3::FakeEntityRepository&>(fake_environment_->GetEntityRepository()); - EXPECT_CALL(mock_entity_repository, GetImpl("Ego")).WillRepeatedly(testing::Return(&ref_entity)); - EXPECT_CALL(mock_entity_repository, GetImpl("Actor")).WillRepeatedly(testing::Return(&actor_entity)); - EXPECT_CALL(ref_entity, GetPosition()).WillRepeatedly(testing::Return(ref_entity_position)); - EXPECT_CALL(actor_entity, GetPosition()).WillRepeatedly(testing::Return(actor_entity_position)); + EXPECT_CALL(fake_entity_repository, GetImpl("Ego")).WillRepeatedly(testing::Return(ref_entity)); + EXPECT_CALL(fake_entity_repository, GetImpl("Actor")).WillRepeatedly(testing::Return(actor_entity)); + EXPECT_CALL(*ref_entity, GetPosition()).WillRepeatedly(testing::Return(ref_entity_position)); + EXPECT_CALL(*actor_entity, GetPosition()).WillRepeatedly(testing::Return(actor_entity_position)); EXPECT_CALL(mock_query_service, GetLaneIdsAtPosition(testing::_)).WillRepeatedly(testing::Return(lane_ids)); EXPECT_CALL(mock_geometry_helper, AreOrientedSimilarly(testing::_, lane_orientation)).WillRepeatedly(testing::Return(false)); @@ -380,10 +381,10 @@ TEST_F(LateralDistanceActionTestFixture, GivenFreespaceTrueVehiclesOrientedOppos .WillOnce(testing::Return(ref_entity_frontleft_corner_position_laterally_shifted)) .WillOnce(testing::Return(actor_entity_frontleft_corner_position_laterally_shifted)); - EXPECT_CALL(actor_entity, SetPosition(actor_entity_target_position)).Times(1); + EXPECT_CALL(*actor_entity, SetPosition(actor_entity_target_position)).Times(1); values_.lateralDisplacement = mantle_api::LateralDisplacementDirection::kLeft; values_.freespace = true; - OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {mock_environment_}); + OpenScenarioEngine::v1_3::LateralDistanceAction lateral_distance_action(values_, {fake_environment_}); lateral_distance_action.SetControlStrategy(); } diff --git a/engine/tests/Storyboard/MotionControlAction/LongitudinalDistanceActionTest.cpp b/engine/tests/Storyboard/MotionControlAction/LongitudinalDistanceActionTest.cpp index 61d0fe2717112c6c01d9835e769a711190bc9f97..d678bad60c297518848649da61fc1408bc3c570b 100644 --- a/engine/tests/Storyboard/MotionControlAction/LongitudinalDistanceActionTest.cpp +++ b/engine/tests/Storyboard/MotionControlAction/LongitudinalDistanceActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2022-2023 Ansys, Inc. * * This program and the accompanying materials are made available under the @@ -22,438 +22,439 @@ using namespace testing::OpenScenarioEngine::v1_3; class LongitudinalDistanceActionFixture : public OpenScenarioEngineLibraryTestBase { - protected: - void SetUp() override - { - OpenScenarioEngineLibraryTestBase::SetUp(); - auto engine_abort_flags = std::make_shared<EngineAbortFlags>(EngineAbortFlags::kNoAbort); - auto entity_broker = std::make_shared<EntityBroker>(false); - entity_broker->add("TrafficVehicle"); - root_node_ = std::make_shared<FakeRootNode>(env_, engine_abort_flags, entity_broker); - } - - std::shared_ptr<FakeRootNode> root_node_{nullptr}; +protected: + void SetUp() override + { + OpenScenarioEngineLibraryTestBase::SetUp(); + auto engine_abort_flags = std::make_shared<EngineAbortFlags>(EngineAbortFlags::kNoAbort); + auto entity_broker = std::make_shared<EntityBroker>(false); + entity_broker->add("TrafficVehicle"); + root_node_ = std::make_shared<FakeRootNode>(env_, engine_abort_flags, entity_broker); + } + + std::shared_ptr<FakeRootNode> root_node_{nullptr}; }; TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithNoDisplacementIsSet_WhenExecuteTick_ThenActorPoseIsNotUpdated) { - auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDistance(10.0) - .Build(); - - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetOrientation(testing::_)) - .Times(0); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetPosition(testing::_)) - .Times(0); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); + auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDistance(10.0) + .Build(); + + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetOrientation(testing::_)) + .Times(0); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetPosition(testing::_)) + .Times(0); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithAnyDisplacement_WhenExecuteTick_ThenActorPoseIsNotUpdated) { - auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::ANY) - .WithDistance(10.0) - .Build(); - - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetOrientation(testing::_)) - .Times(0); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetPosition(testing::_)) - .Times(0); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); + auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::ANY) + .WithDistance(10.0) + .Build(); + + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetOrientation(testing::_)) + .Times(0); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetPosition(testing::_)) + .Times(0); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithUnknownDisplacement_WhenExecuteTick_ThrowExeception) { - // Throwing from within distributeData ends early and the expectations on this object are not verified - testing::Mock::AllowLeak(&(env_->GetControllerRepository())); + // Throwing from within distributeData ends early and the expectations on this object are not verified + testing::Mock::AllowLeak(&(env_->GetControllerRepository())); + testing::Mock::AllowLeak(&(*env_->GetEntityRepository().Get("").lock())); - auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::UNKNOWN) - .WithDistance(10.0) - .Build(); + auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::UNKNOWN) + .WithDistance(10.0) + .Build(); - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - root_node_->setChild(longitudinal_distance_action); - EXPECT_ANY_THROW(root_node_->distributeData()); + root_node_->setChild(longitudinal_distance_action); + EXPECT_ANY_THROW(root_node_->distributeData()); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithTrailingDisplacement_WhenExecuteTick_ThenActorPoseIsUpdated) { - auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::TRAILING_REFERENCED_ENTITY) - .WithContinuous(false) - .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) - .WithFreeSpace(true) - .WithDistance(10.0) - .Build(); - - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(env_->GetQueryService()), - FindLanePoseAtDistanceFrom(testing::_, testing::_, testing::_)) - .WillOnce(testing::Return(mantle_api::Pose{})); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetOrientation(testing::_)) - .Times(1); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetPosition(testing::_)) - .Times(1); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); + auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::TRAILING_REFERENCED_ENTITY) + .WithContinuous(false) + .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) + .WithFreeSpace(true) + .WithDistance(10.0) + .Build(); + + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(env_->GetQueryService()), + FindLanePoseAtDistanceFrom(testing::_, testing::_, testing::_)) + .WillOnce(testing::Return(mantle_api::Pose{})); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetOrientation(testing::_)) + .Times(1); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetPosition(testing::_)) + .Times(1); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithContinuousSet_WhenExecuteTick_ThenActorPoseIsNotUpdated) { - auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) - .WithDistance(10.0) - .WithContinuous(true) - .Build(); - - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetOrientation(testing::_)) - .Times(0); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetPosition(testing::_)) - .Times(0); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); + auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) + .WithDistance(10.0) + .WithContinuous(true) + .Build(); + + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetOrientation(testing::_)) + .Times(0); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetPosition(testing::_)) + .Times(0); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithDistanceIsNotSet_WhenExecuteTick_ThenThrowException) { - auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) - .WithContinuous(false) - .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) - .Build(); - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetOrientation(testing::_)) - .Times(0); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetPosition(testing::_)) - .Times(0); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_ANY_THROW(root_node_->executeTick()); + auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) + .WithContinuous(false) + .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) + .Build(); + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetOrientation(testing::_)) + .Times(0); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetPosition(testing::_)) + .Times(0); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_ANY_THROW(root_node_->executeTick()); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithNegativeDistanceSet_WhenExecuteTick_ThenActorPoseIsNotUpdated) { - auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) - .WithContinuous(false) - .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) - .WithDistance(-10.0) - .Build(); - - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetOrientation(testing::_)) - .Times(0); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetPosition(testing::_)) - .Times(0); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); + auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) + .WithContinuous(false) + .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) + .WithDistance(-10.0) + .Build(); + + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetOrientation(testing::_)) + .Times(0); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetPosition(testing::_)) + .Times(0); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithTimeGapSet_WhenExecuteTick_ThenCorrectActorPoseIsUpdated) { - const auto time_gap = units::time::second_t{10.0}; - const auto ref_velocity = mantle_api::Vec3<units::velocity::meters_per_second_t>{50.0_mps, 0.0_mps, 0.0_mps}; - const auto ref_position = mantle_api::Vec3<units::length::meter_t>{5.0_m, 0.0_m, 0.0_m}; - const auto ref_orientation = mantle_api::Orientation3<units::angle::radian_t>{0.0_deg, 0.0_deg, 0.0_deg}; - const auto ref_pose = mantle_api::Pose{ref_position, ref_orientation}; - - const auto expected_position = - ref_position + mantle_api::Vec3<units::length::meter_t>{ref_velocity.x * time_gap, 0.0_m, 0.0_m}; - const auto expected_orientation = mantle_api::Orientation3<units::angle::radian_t>{0.0_deg, 0.0_deg, 0.0_deg}; - const auto expected_pose = mantle_api::Pose{expected_position, expected_orientation}; - - const auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) - .WithContinuous(false) - .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) - .WithTimeGap(time_gap.value()) - .Build(); - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - auto& ref_entity = dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("ego").value().get()); - auto& actor_entity = - dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("TrafficVehicle").value().get()); - - // freespace not set - EXPECT_CALL(ref_entity, GetPropertiesImpl()).Times(0); - EXPECT_CALL(actor_entity, GetPropertiesImpl()).Times(1); - - EXPECT_CALL(ref_entity, GetPosition()).WillOnce(testing::Return(ref_position)); - EXPECT_CALL(ref_entity, GetOrientation()).WillOnce(testing::Return(ref_orientation)); - EXPECT_CALL(ref_entity, GetVelocity()).WillRepeatedly(testing::Return(ref_velocity)); - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(env_->GetQueryService()), - FindLanePoseAtDistanceFrom(ref_pose, time_gap * ref_velocity.Length(), mantle_api::Direction::kForward)) - .WillOnce(testing::Return(expected_pose)); - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(env_->GetQueryService()), - GetUpwardsShiftedLanePosition(testing::_, testing::_, true)) - .WillOnce(testing::Return(expected_position)); - EXPECT_CALL(actor_entity, SetPosition(expected_position)); - EXPECT_CALL(actor_entity, SetOrientation(expected_orientation)); - EXPECT_CALL(actor_entity, SetVelocity(ref_velocity)); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); - EXPECT_EQ(longitudinal_distance_action->status(), yase::NodeStatus::kSuccess); + const auto time_gap = units::time::second_t{10.0}; + const auto ref_velocity = mantle_api::Vec3<units::velocity::meters_per_second_t>{50.0_mps, 0.0_mps, 0.0_mps}; + const auto ref_position = mantle_api::Vec3<units::length::meter_t>{5.0_m, 0.0_m, 0.0_m}; + const auto ref_orientation = mantle_api::Orientation3<units::angle::radian_t>{0.0_deg, 0.0_deg, 0.0_deg}; + const auto ref_pose = mantle_api::Pose{ref_position, ref_orientation}; + + const auto expected_position = + ref_position + mantle_api::Vec3<units::length::meter_t>{ref_velocity.x * time_gap, 0.0_m, 0.0_m}; + const auto expected_orientation = mantle_api::Orientation3<units::angle::radian_t>{0.0_deg, 0.0_deg, 0.0_deg}; + const auto expected_pose = mantle_api::Pose{expected_position, expected_orientation}; + + const auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) + .WithContinuous(false) + .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) + .WithTimeGap(time_gap.value()) + .Build(); + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + auto& ref_entity = dynamic_cast<testing::OpenScenarioEngine::v1_3::FakeVehicle&>(*env_->GetEntityRepository().Get("ego").lock()); + auto& actor_entity = + dynamic_cast<testing::OpenScenarioEngine::v1_3::FakeVehicle&>(*env_->GetEntityRepository().Get("TrafficVehicle").lock()); + + // freespace not set + EXPECT_CALL(ref_entity, GetPropertiesImpl()).Times(0); + EXPECT_CALL(actor_entity, GetPropertiesImpl()).Times(1); + + EXPECT_CALL(ref_entity, GetPosition()).WillOnce(testing::Return(ref_position)); + EXPECT_CALL(ref_entity, GetOrientation()).WillOnce(testing::Return(ref_orientation)); + EXPECT_CALL(ref_entity, GetVelocity()).WillRepeatedly(testing::Return(ref_velocity)); + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(env_->GetQueryService()), + FindLanePoseAtDistanceFrom(ref_pose, time_gap * ref_velocity.Length(), mantle_api::Direction::kForward)) + .WillOnce(testing::Return(expected_pose)); + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(env_->GetQueryService()), + GetUpwardsShiftedLanePosition(testing::_, testing::_, true)) + .WillOnce(testing::Return(expected_position)); + EXPECT_CALL(actor_entity, SetPosition(expected_position)); + EXPECT_CALL(actor_entity, SetOrientation(expected_orientation)); + EXPECT_CALL(actor_entity, SetVelocity(ref_velocity)); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); + EXPECT_EQ(longitudinal_distance_action->status(), yase::NodeStatus::kSuccess); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithTimeGapSetAndFreespace_WhenExecuteTick_ThenEntitiesGetPropertiesAreCalled) { - const auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) - .WithContinuous(false) - .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) - .WithTimeGap(10.0) - .WithFreeSpace(true) - .Build(); - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - GetPropertiesImpl()) - .Times(2); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); - EXPECT_EQ(longitudinal_distance_action->status(), yase::NodeStatus::kSuccess); + const auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) + .WithContinuous(false) + .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) + .WithTimeGap(10.0) + .WithFreeSpace(true) + .Build(); + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + EXPECT_CALL(dynamic_cast<testing::OpenScenarioEngine::v1_3::FakeVehicle&>(*env_->GetEntityRepository().Get("").lock()), + GetPropertiesImpl()) + .Times(2); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); + EXPECT_EQ(longitudinal_distance_action->status(), yase::NodeStatus::kSuccess); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithDynamicConstraintsSet_WhenExecuteTick_ThenActorPoseIsNotUpdated) { - NET_ASAM_OPENSCENARIO::v1_3::OpenScenarioWriterFactoryImpl open_scenario_writer_factory_impl; - - auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) - .WithDistance(10.0) - .WithContinuous(false) - .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) - .WithDynamicConstraints(open_scenario_writer_factory_impl.CreateDynamicConstraintsWriter()) - .Build(); - - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetOrientation(testing::_)) - .Times(0); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetPosition(testing::_)) - .Times(0); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); + NET_ASAM_OPENSCENARIO::v1_3::OpenScenarioWriterFactoryImpl open_scenario_writer_factory_impl; + + auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) + .WithDistance(10.0) + .WithContinuous(false) + .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) + .WithDynamicConstraints(open_scenario_writer_factory_impl.CreateDynamicConstraintsWriter()) + .Build(); + + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetOrientation(testing::_)) + .Times(0); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetPosition(testing::_)) + .Times(0); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithCoordinateSystemIsNotLane_WhenExecuteTick_ThenActorPoseIsNotUpdated) { - auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) - .WithDistance(10.0) - .WithContinuous(false) - .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::ROAD) - .Build(); - - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetOrientation(testing::_)) - .Times(0); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetPosition(testing::_)) - .Times(0); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); + auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) + .WithDistance(10.0) + .WithContinuous(false) + .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::ROAD) + .Build(); + + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetOrientation(testing::_)) + .Times(0); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetPosition(testing::_)) + .Times(0); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithFreeSpaceSet_WhenExecuteTick_ThenActorPoseIsUpdated) { - auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) - .WithContinuous(false) - .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) - .WithFreeSpace(true) - .WithDistance(10.0) - .Build(); - - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(env_->GetQueryService()), - FindLanePoseAtDistanceFrom(testing::_, testing::_, testing::_)) - .WillOnce(testing::Return(mantle_api::Pose{})); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetOrientation(testing::_)) - .Times(1); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetPosition(testing::_)) - .Times(1); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); + auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) + .WithContinuous(false) + .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) + .WithFreeSpace(true) + .WithDistance(10.0) + .Build(); + + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(env_->GetQueryService()), + FindLanePoseAtDistanceFrom(testing::_, testing::_, testing::_)) + .WillOnce(testing::Return(mantle_api::Pose{})); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetOrientation(testing::_)) + .Times(1); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetPosition(testing::_)) + .Times(1); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceActionWithAllParametersSet_WhenStepAction_ThenActorPoseIsUpdated) { - auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) - .WithContinuous(false) - .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) - .WithDistance(10.0) - .Build(); - - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(env_->GetQueryService()), - FindLanePoseAtDistanceFrom(testing::_, testing::_, testing::_)) - .WillOnce(testing::Return(mantle_api::Pose{})); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetOrientation(testing::_)) - .Times(1); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()), - SetPosition(testing::_)) - .Times(1); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); + auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) + .WithContinuous(false) + .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) + .WithDistance(10.0) + .Build(); + + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(env_->GetQueryService()), + FindLanePoseAtDistanceFrom(testing::_, testing::_, testing::_)) + .WillOnce(testing::Return(mantle_api::Pose{})); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetOrientation(testing::_)) + .Times(1); + + EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), + SetPosition(testing::_)) + .Times(1); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); } TEST_F(LongitudinalDistanceActionFixture, GivenLongitudinalDistanceAction_WhenStepAction_ThenActorSetCorrectVerticalPosition) { - using units::literals::operator""_m; - - auto fake_longitudinal_distance_action = - FakeLongitudinalDistanceActionBuilder{} - .WithEntityRef("ego") - .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) - .WithContinuous(false) - .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) - .WithDistance(10.0) - .Build(); - auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); - - const auto expected_vertical_shift = 2.0_m; - - mantle_api::VehicleProperties actor_entity_properties{}; - actor_entity_properties.bounding_box.dimension.height = expected_vertical_shift * 2; - - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(env_->GetQueryService()), - FindLanePoseAtDistanceFrom(testing::_, testing::_, testing::_)) - .WillOnce(testing::Return(mantle_api::Pose{})); - - EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("TrafficVehicle").value().get()), - GetPropertiesImpl()) - .WillOnce(testing::Return(&actor_entity_properties)); - - EXPECT_CALL(dynamic_cast<const mantle_api::MockQueryService&>(env_->GetQueryService()), - GetUpwardsShiftedLanePosition(testing::_, expected_vertical_shift.value(), true)) - .Times(1); - - root_node_->setChild(longitudinal_distance_action); - root_node_->distributeData(); - EXPECT_NO_THROW(root_node_->onInit()); - EXPECT_NO_THROW(root_node_->executeTick()); + using units::literals::operator""_m; + + auto fake_longitudinal_distance_action = + FakeLongitudinalDistanceActionBuilder{} + .WithEntityRef("ego") + .WithDisplacement(NET_ASAM_OPENSCENARIO::v1_3::LongitudinalDisplacement::LEADING_REFERENCED_ENTITY) + .WithContinuous(false) + .WithCoordinateSystem(NET_ASAM_OPENSCENARIO::v1_3::CoordinateSystem::LANE) + .WithDistance(10.0) + .Build(); + auto longitudinal_distance_action = std::make_shared<Node::LongitudinalDistanceAction>(fake_longitudinal_distance_action); + + const auto expected_vertical_shift = 2.0_m; + + mantle_api::VehicleProperties actor_entity_properties{}; + actor_entity_properties.bounding_box.dimension.height = expected_vertical_shift * 2; + + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(env_->GetQueryService()), + FindLanePoseAtDistanceFrom(testing::_, testing::_, testing::_)) + .WillOnce(testing::Return(mantle_api::Pose{})); + + EXPECT_CALL(dynamic_cast<testing::OpenScenarioEngine::v1_3::FakeVehicle&>(*env_->GetEntityRepository().Get("TrafficVehicle").lock()), + GetPropertiesImpl()) + .WillOnce(testing::Return(&actor_entity_properties)); + + EXPECT_CALL(dynamic_cast<const mantle_api::MockLaneLocationQueryService&>(env_->GetQueryService()), + GetUpwardsShiftedLanePosition(testing::_, expected_vertical_shift.value(), true)) + .Times(1); + + root_node_->setChild(longitudinal_distance_action); + root_node_->distributeData(); + EXPECT_NO_THROW(root_node_->onInit()); + EXPECT_NO_THROW(root_node_->executeTick()); } diff --git a/engine/tests/Storyboard/MotionControlAction/MotionControlActionTest.cpp b/engine/tests/Storyboard/MotionControlAction/MotionControlActionTest.cpp index e076e7cc5fc667bd0af1c147246f0adeb3cfba80..e2ef10892bfef48fdc66c69ae158bf5cd4abeb82 100644 --- a/engine/tests/Storyboard/MotionControlAction/MotionControlActionTest.cpp +++ b/engine/tests/Storyboard/MotionControlAction/MotionControlActionTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2023-2024, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2022-2023 Ansys, Inc. * * This program and the accompanying materials are made @@ -50,7 +50,8 @@ TEST_F(MotionControlActionTestFixture, GivenLongitudinalAction_WhenControlStrate {"Ego"}, false, false, - [this]() { + [this]() + { return OpenScenarioEngine::v1_3::ConvertScenarioLongitudinalDistance( env_, true, @@ -67,17 +68,17 @@ TEST_F(MotionControlActionTestFixture, GivenLongitudinalAction_WhenControlStrate auto expected_control_strategy = mantle_api::KeepVelocityControlStrategy(); - EXPECT_CALL(*env_, UpdateControlStrategies(0, testing::_)) + EXPECT_CALL(*env_, UpdateControlStrategies(mantle_api::UniqueId(0), testing::_)) .Times(1) .WillRepeatedly([expected_control_strategy]( - std::uint64_t controller_id, - std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies) { + mantle_api::UniqueId controller_id, + std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies) + { std::ignore = controller_id; EXPECT_EQ(1, control_strategies.size()); auto control_strategy = dynamic_cast<mantle_api::KeepVelocityControlStrategy*>(control_strategies[0].get()); EXPECT_NE(nullptr, control_strategy); - EXPECT_EQ(*control_strategy, expected_control_strategy); - }); + EXPECT_EQ(*control_strategy, expected_control_strategy); }); mock_motion_control_action.Step(); } @@ -99,11 +100,12 @@ TEST_F(MotionControlActionTestFixture, GivenLateralAction_WhenControlStrategyGoa auto expected_control_strategy = mantle_api::KeepLaneOffsetControlStrategy(); - EXPECT_CALL(*env_, UpdateControlStrategies(0, testing::_)) + EXPECT_CALL(*env_, UpdateControlStrategies(mantle_api::UniqueId(0), testing::_)) .Times(1) .WillRepeatedly( - [expected_control_strategy](std::uint64_t controller_id, - std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies) { + [expected_control_strategy](mantle_api::UniqueId controller_id, + std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies) + { std::ignore = controller_id; EXPECT_EQ(1, control_strategies.size()); auto control_strategy = diff --git a/engine/tests/Storyboard/MotionControlAction/SpeedActionTest.cpp b/engine/tests/Storyboard/MotionControlAction/SpeedActionTest.cpp index 93e61d6c55f7c1f0fc075a19a3ccc0e665b27b43..c7c3be2bff350120af593ff3feba007052fda635 100644 --- a/engine/tests/Storyboard/MotionControlAction/SpeedActionTest.cpp +++ b/engine/tests/Storyboard/MotionControlAction/SpeedActionTest.cpp @@ -9,14 +9,15 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include "Conversion/OscToMantle/ConvertScenarioSpeedActionTarget.h" #include "Storyboard/MotionControlAction/SpeedAction_impl.h" +#include "TestUtils.h" #include "gmock/gmock.h" using namespace mantle_api; +using namespace testing::OpenScenarioEngine::v1_3; using namespace units::literals; using testing::_; @@ -34,18 +35,13 @@ protected: std::optional<units::jerk::meters_per_second_cubed_t> max_acceleration_rate = std::nullopt, std::optional<units::jerk::meters_per_second_cubed_t> max_deceleration_rate = std::nullopt) { - const auto& host_optional = mock_environment_->GetEntityRepository().GetHost(); - ASSERT_TRUE(host_optional.has_value()); - MockVehicle* mock_vehicle_ptr{dynamic_cast<MockVehicle*>(&host_optional.value().get())}; - ASSERT_NE(mock_vehicle_ptr, nullptr) << "Failed to cast host to MockVehicle."; - MockVehicle& mock_vehicle = *mock_vehicle_ptr; vehicle_properties_.performance = { .max_acceleration_rate = max_acceleration_rate.value_or(units::jerk::meters_per_second_cubed_t(std::numeric_limits<double>::infinity())), .max_deceleration_rate = max_deceleration_rate.value_or(units::jerk::meters_per_second_cubed_t(std::numeric_limits<double>::infinity()))}; - EXPECT_CALL(*mock_environment_, UpdateControlStrategies(_, _)).WillOnce(testing::SaveArg<1>(&control_strategies_)); - EXPECT_CALL(mock_vehicle, GetPropertiesImpl()).WillOnce(Return(&vehicle_properties_)); - EXPECT_CALL(mock_vehicle, GetVelocity()).WillOnce(Return(initial_velocity)); + EXPECT_CALL(*fake_environment_, UpdateControlStrategies(_, _)).WillOnce(testing::SaveArg<1>(&control_strategies_)); + EXPECT_CALL(fake_vehicle_, GetPropertiesImpl()).WillOnce(Return(&vehicle_properties_)); + EXPECT_CALL(fake_vehicle_, GetVelocity()).WillOnce(Return(initial_velocity)); const mantle_api::TransitionDynamics transition_dynamics{Dimension::kRate, Shape::kLinear, expected_acceleration()}; const TransitionDynamics speed_action_dynamics{transition_dynamics, FollowingMode::kFollow}; @@ -54,7 +50,7 @@ protected: speed_action_dynamics, [target_speed]() { return target_speed; }}; - const SpeedActionBase::Interfaces interfaces{mock_environment_}; + const SpeedActionBase::Interfaces interfaces{fake_environment_}; speed_action_ = std::make_unique<SpeedAction>(values, interfaces); } @@ -67,15 +63,16 @@ protected: } std::unique_ptr<SpeedAction> speed_action_{nullptr}; - std::shared_ptr<MockEnvironment> mock_environment_{std::make_shared<MockEnvironment>()}; + std::shared_ptr<FakeEnvironment> fake_environment_{std::make_shared<FakeEnvironment>()}; + FakeVehicle& fake_vehicle_{dynamic_cast<FakeVehicle&>(*(fake_environment_->GetEntityRepository().GetHost().lock()))}; VehicleProperties vehicle_properties_{}; std::vector<std::shared_ptr<ControlStrategy>> control_strategies_{}; }; TEST(SpeedAction, GivenMatchingControlStrategyGoalIsReached_ReturnTrue) { - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); - ON_CALL(*mockEnvironment, + auto fake_environment = std::make_shared<FakeEnvironment>(); + ON_CALL(*fake_environment, HasControlStrategyGoalBeenReached(_, mantle_api::ControlStrategyType::kFollowVelocitySpline)) .WillByDefault(Return(true)); TransitionDynamics speedActionDynamics; @@ -85,15 +82,15 @@ TEST(SpeedAction, GivenMatchingControlStrategyGoalIsReached_ReturnTrue) speedActionDynamics, []() -> units::velocity::meters_per_second_t { return 0_mps; }}, - {mockEnvironment}); + {fake_environment}); ASSERT_TRUE(speedAction.HasControlStrategyGoalBeenReached("Vehicle1")); } TEST(SpeedAction, GivenUnmatchingControlStrategyGoalIsReached_ReturnsFalse) { - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); - ON_CALL(*mockEnvironment, + auto fake_environment = std::make_shared<FakeEnvironment>(); + ON_CALL(*fake_environment, HasControlStrategyGoalBeenReached(_, mantle_api::ControlStrategyType::kUndefined)) .WillByDefault(Return(false)); @@ -104,15 +101,15 @@ TEST(SpeedAction, GivenUnmatchingControlStrategyGoalIsReached_ReturnsFalse) speedActionDynamics, []() -> units::velocity::meters_per_second_t { return 0_mps; }}, - {mockEnvironment}); + {fake_environment}); ASSERT_FALSE(speedAction.HasControlStrategyGoalBeenReached("Vehicle1")); } TEST(SpeedAction, GivenkStepShapeForSpeedActionDynamics_ReturnTrue) { - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); - ON_CALL(*mockEnvironment, + auto fake_environment = std::make_shared<FakeEnvironment>(); + ON_CALL(*fake_environment, HasControlStrategyGoalBeenReached(_, mantle_api::ControlStrategyType::kUndefined)) .WillByDefault(Return(true)); TransitionDynamics speedActionDynamics; @@ -122,15 +119,15 @@ TEST(SpeedAction, GivenkStepShapeForSpeedActionDynamics_ReturnTrue) speedActionDynamics, []() -> units::velocity::meters_per_second_t { return 0_mps; }}, - {mockEnvironment}); + {fake_environment}); ASSERT_TRUE(speedAction.HasControlStrategyGoalBeenReached("Vehicle1")); } TEST(SpeedAction, GivenkUndefinedShapeForSpeedActionDynamics_ReturnFalse) { - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); - ON_CALL(*mockEnvironment, + auto fake_environment = std::make_shared<FakeEnvironment>(); + ON_CALL(*fake_environment, HasControlStrategyGoalBeenReached(_, mantle_api::ControlStrategyType::kUndefined)) .WillByDefault(Return(false)); @@ -141,7 +138,7 @@ TEST(SpeedAction, GivenkUndefinedShapeForSpeedActionDynamics_ReturnFalse) speedActionDynamics, []() -> units::velocity::meters_per_second_t { return 0_mps; }}, - {mockEnvironment}); + {fake_environment}); ASSERT_FALSE(speedAction.HasControlStrategyGoalBeenReached("Vehicle1")); } @@ -155,7 +152,7 @@ TEST(SpeedAction, GivenIsStepShapeForSpeedActionDynamics_SetControlStrategy) speedActionDynamics, []() -> units::velocity::meters_per_second_t { return 0_mps; }}, - {std::make_shared<mantle_api::MockEnvironment>()}); + {std::make_shared<FakeEnvironment>()}); EXPECT_NO_THROW(speedAction.SetControlStrategy()); } @@ -167,7 +164,7 @@ TEST(SpeedAction, GivenLinearShapeAndkUndefinedDimensionForSpeedActionDynamics_T speedActionDynamics, []() -> units::velocity::meters_per_second_t { return 123_mps; }}, - {std::make_shared<mantle_api::MockEnvironment>()}); + {std::make_shared<FakeEnvironment>()}); EXPECT_THROW(speedAction.SetControlStrategy(), std::runtime_error); } @@ -177,9 +174,9 @@ TEST(SpeedAction, GivenLinearShapeAndkTimeDimensionForSpeedActionDynamics_SetCon TransitionDynamics speedActionDynamics{mantle_api::Dimension::kTime, mantle_api::Shape::kLinear, 3.6, std::nullopt}; SpeedActionTarget speedActionTarget = 1.2_mps; - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); + auto fake_environment = std::make_shared<FakeEnvironment>(); std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies{}; - EXPECT_CALL(*mockEnvironment, + EXPECT_CALL(*fake_environment, UpdateControlStrategies(_, _)) .WillOnce(testing::SaveArg<1>(&control_strategies)); @@ -187,7 +184,7 @@ TEST(SpeedAction, GivenLinearShapeAndkTimeDimensionForSpeedActionDynamics_SetCon speedActionDynamics, [t = speedActionTarget]() -> units::velocity::meters_per_second_t { return t; }}, - {mockEnvironment}); + {fake_environment}); EXPECT_NO_THROW(speedAction.SetControlStrategy()); EXPECT_THAT(control_strategies, testing::SizeIs(1)); @@ -204,9 +201,9 @@ TEST(SpeedAction, GivenLinearShapeAndkRateDimensionForSpeedActionDynamics_SetCon TransitionDynamics speedActionDynamics{mantle_api::Dimension::kRate, mantle_api::Shape::kLinear, 1.2, std::nullopt}; SpeedActionTarget speedActionTarget = 1.2_mps; - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); + auto fake_environment = std::make_shared<FakeEnvironment>(); std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies{}; - EXPECT_CALL(*mockEnvironment, + EXPECT_CALL(*fake_environment, UpdateControlStrategies(_, _)) .WillOnce(testing::SaveArg<1>(&control_strategies)); @@ -214,7 +211,7 @@ TEST(SpeedAction, GivenLinearShapeAndkRateDimensionForSpeedActionDynamics_SetCon speedActionDynamics, [t = speedActionTarget]() -> units::velocity::meters_per_second_t { return t; }}, - {mockEnvironment}); + {fake_environment}); EXPECT_NO_THROW(speedAction.SetControlStrategy()); EXPECT_THAT(control_strategies, testing::SizeIs(1)); @@ -231,9 +228,9 @@ TEST(SpeedAction, GivenLinearShapeAndkDistanceDimensionForSpeedActionDynamics_Se TransitionDynamics speedActionDynamics{mantle_api::Dimension::kDistance, mantle_api::Shape::kLinear, 0.6, std::nullopt}; SpeedActionTarget speedActionTarget = 1.2_mps; - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); + auto fake_environment = std::make_shared<FakeEnvironment>(); std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies{}; - EXPECT_CALL(*mockEnvironment, + EXPECT_CALL(*fake_environment, UpdateControlStrategies(_, _)) .WillOnce(testing::SaveArg<1>(&control_strategies)); @@ -241,7 +238,7 @@ TEST(SpeedAction, GivenLinearShapeAndkDistanceDimensionForSpeedActionDynamics_Se speedActionDynamics, [t = speedActionTarget]() -> units::velocity::meters_per_second_t { return t; }}, - {mockEnvironment}); + {fake_environment}); EXPECT_NO_THROW(speedAction.SetControlStrategy()); EXPECT_THAT(control_strategies, testing::SizeIs(1)); @@ -258,16 +255,16 @@ TEST(SpeedAction, WithCubicShapeAndRate_SetsControlStrategy) TransitionDynamics speedActionDynamics{mantle_api::Dimension::kRate, mantle_api::Shape::kCubic, 1.2, std::nullopt}; SpeedActionTarget speedActionTarget = 1.2_mps; - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); + auto fake_environment = std::make_shared<FakeEnvironment>(); std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies{}; - EXPECT_CALL(*mockEnvironment, UpdateControlStrategies(_, _)) + EXPECT_CALL(*fake_environment, UpdateControlStrategies(_, _)) .WillOnce(testing::SaveArg<1>(&control_strategies)); SpeedAction speedAction({std::vector<std::string>{"Vehicle1"}, speedActionDynamics, [t = speedActionTarget]() -> units::velocity::meters_per_second_t { return t; }}, - {mockEnvironment}); + {fake_environment}); EXPECT_NO_THROW(speedAction.SetControlStrategy()); EXPECT_THAT(control_strategies, SizeIs(1)); @@ -284,16 +281,16 @@ TEST(SpeedAction, WithCubicShapeAndTime_SetsControlStrategy) TransitionDynamics speedActionDynamics{mantle_api::Dimension::kTime, mantle_api::Shape::kCubic, 1.2, std::nullopt}; SpeedActionTarget speedActionTarget = 1.2_mps; - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); + auto fake_environment = std::make_shared<FakeEnvironment>(); std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies{}; - EXPECT_CALL(*mockEnvironment, UpdateControlStrategies(_, _)) + EXPECT_CALL(*fake_environment, UpdateControlStrategies(_, _)) .WillOnce(testing::SaveArg<1>(&control_strategies)); SpeedAction speedAction({std::vector<std::string>{"Vehicle1"}, speedActionDynamics, [t = speedActionTarget]() -> units::velocity::meters_per_second_t { return t; }}, - {mockEnvironment}); + {fake_environment}); EXPECT_NO_THROW(speedAction.SetControlStrategy()); EXPECT_THAT(control_strategies, SizeIs(1)); @@ -310,9 +307,9 @@ TEST(SpeedAction, WithCubicShapeAndDistance_SetsControlStrategy) TransitionDynamics speedActionDynamics{mantle_api::Dimension::kDistance, mantle_api::Shape::kCubic, 0.6, std::nullopt}; SpeedActionTarget speedActionTarget = 1.2_mps; - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); + auto fake_environment = std::make_shared<FakeEnvironment>(); std::vector<std::shared_ptr<mantle_api::ControlStrategy>> control_strategies{}; - EXPECT_CALL(*mockEnvironment, + EXPECT_CALL(*fake_environment, UpdateControlStrategies(_, _)) .WillOnce(testing::SaveArg<1>(&control_strategies)); @@ -320,7 +317,7 @@ TEST(SpeedAction, WithCubicShapeAndDistance_SetsControlStrategy) speedActionDynamics, [t = speedActionTarget]() -> units::velocity::meters_per_second_t { return t; }}, - {mockEnvironment}); + {fake_environment}); EXPECT_NO_THROW(speedAction.SetControlStrategy()); EXPECT_THAT(control_strategies, testing::SizeIs(1)); @@ -346,10 +343,10 @@ TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenDecreasingSpeedAndJerkLimits_W auto control_strategy{dynamic_cast<FollowVelocitySplineControlStrategy*>(control_strategies_.front().get())}; EXPECT_EQ(control_strategy->default_value, target_speed); EXPECT_THAT(control_strategy->velocity_splines, testing::SizeIs(3)); - EXPECT_EQ(std::get<1>(control_strategy->velocity_splines[0].polynomial), -0.5 * max_deceleration_rate); - EXPECT_EQ(std::get<3>(control_strategy->velocity_splines[0].polynomial), initial_velocity.Length()); - EXPECT_EQ(std::get<2>(control_strategy->velocity_splines[1].polynomial), acceleration); - EXPECT_EQ(std::get<1>(control_strategy->velocity_splines[2].polynomial), 0.5 * max_acceleration_rate); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a2, -0.5 * max_deceleration_rate); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a0, initial_velocity.Length()); + EXPECT_EQ(control_strategy->velocity_splines[1].polynomial.a1, acceleration); + EXPECT_EQ(control_strategy->velocity_splines[2].polynomial.a2, 0.5 * max_acceleration_rate); } TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenDecreasingSpeedAndJerkLimitsAndPositiveSpeedTarget_WhenExpectedRateAreTooHigh_ThenSplineHasAccelerationAndDecelerationJerkLimitsAndInitialSpeed) @@ -366,10 +363,10 @@ TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenDecreasingSpeedAndJerkLimitsAn auto control_strategy{dynamic_cast<FollowVelocitySplineControlStrategy*>(control_strategies_.front().get())}; EXPECT_EQ(control_strategy->default_value, target_speed); EXPECT_THAT(control_strategy->velocity_splines, testing::SizeIs(3)); - EXPECT_EQ(std::get<1>(control_strategy->velocity_splines[0].polynomial), -0.5 * max_deceleration_rate); - EXPECT_EQ(std::get<3>(control_strategy->velocity_splines[0].polynomial), initial_velocity.Length()); - EXPECT_EQ(std::get<2>(control_strategy->velocity_splines[1].polynomial), acceleration); - EXPECT_EQ(std::get<1>(control_strategy->velocity_splines[2].polynomial), 0.5 * max_acceleration_rate); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a2, -0.5 * max_deceleration_rate); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a0, initial_velocity.Length()); + EXPECT_EQ(control_strategy->velocity_splines[1].polynomial.a1, acceleration); + EXPECT_EQ(control_strategy->velocity_splines[2].polynomial.a2, 0.5 * max_acceleration_rate); } TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenDecreasingSpeedAndAccelerationRateLimit_WhenExpectedAccelerationRateIsTooHigh_ThenSplineHasAccelerationRateLimit) @@ -385,9 +382,9 @@ TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenDecreasingSpeedAndAcceleration auto control_strategy{dynamic_cast<FollowVelocitySplineControlStrategy*>(control_strategies_.front().get())}; EXPECT_EQ(control_strategy->default_value, target_speed); EXPECT_THAT(control_strategy->velocity_splines, testing::SizeIs(2)); - EXPECT_EQ(std::get<3>(control_strategy->velocity_splines[0].polynomial), initial_velocity.Length()); - EXPECT_EQ(std::get<2>(control_strategy->velocity_splines[0].polynomial), acceleration); - EXPECT_EQ(std::get<1>(control_strategy->velocity_splines[1].polynomial), 0.5 * max_acceleration_rate); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a0, initial_velocity.Length()); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a1, acceleration); + EXPECT_EQ(control_strategy->velocity_splines[1].polynomial.a2, 0.5 * max_acceleration_rate); } TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenDecreasingSpeedAndDecelerationRateLimit_WhenExpectedDecelerationRateIsTooHigh_ThenSplineHasDecelerationRateLimit) @@ -403,9 +400,9 @@ TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenDecreasingSpeedAndDeceleration auto control_strategy{dynamic_cast<FollowVelocitySplineControlStrategy*>(control_strategies_.front().get())}; EXPECT_EQ(control_strategy->default_value, target_speed); EXPECT_THAT(control_strategy->velocity_splines, testing::SizeIs(2)); - EXPECT_EQ(std::get<1>(control_strategy->velocity_splines[0].polynomial), -0.5 * max_deceleration_rate); - EXPECT_EQ(std::get<3>(control_strategy->velocity_splines[0].polynomial), initial_velocity.Length()); - EXPECT_EQ(std::get<2>(control_strategy->velocity_splines[1].polynomial), acceleration); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a2, -0.5 * max_deceleration_rate); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a0, initial_velocity.Length()); + EXPECT_EQ(control_strategy->velocity_splines[1].polynomial.a1, acceleration); } TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenDecreasingSpeedAndNoJerkLimits_WhenExpectedDecelerationRateIsTooHigh_ThenSplineHasNoJerkLimits) @@ -420,8 +417,8 @@ TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenDecreasingSpeedAndNoJerkLimits auto control_strategy{dynamic_cast<FollowVelocitySplineControlStrategy*>(control_strategies_.front().get())}; EXPECT_EQ(control_strategy->default_value, target_speed); EXPECT_THAT(control_strategy->velocity_splines, testing::SizeIs(1)); - EXPECT_EQ(std::get<3>(control_strategy->velocity_splines[0].polynomial), initial_velocity.Length()); - EXPECT_EQ(std::get<2>(control_strategy->velocity_splines[0].polynomial), acceleration); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a0, initial_velocity.Length()); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a1, acceleration); } TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenIncreasingSpeedAndJerkLimits_WhenExpectedRatesAreTooHigh_ThenSplineHasAccelerationAndDecelerationJerkLimits) @@ -438,10 +435,10 @@ TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenIncreasingSpeedAndJerkLimits_W auto control_strategy{dynamic_cast<FollowVelocitySplineControlStrategy*>(control_strategies_.front().get())}; EXPECT_EQ(control_strategy->default_value, target_speed); EXPECT_THAT(control_strategy->velocity_splines, testing::SizeIs(3)); - EXPECT_EQ(std::get<1>(control_strategy->velocity_splines[0].polynomial), 0.5 * max_deceleration_rate); - EXPECT_EQ(std::get<3>(control_strategy->velocity_splines[0].polynomial), initial_velocity.Length()); - EXPECT_EQ(std::get<2>(control_strategy->velocity_splines[1].polynomial), acceleration); - EXPECT_EQ(std::get<1>(control_strategy->velocity_splines[2].polynomial), -0.5 * max_acceleration_rate); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a2, 0.5 * max_deceleration_rate); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a0, initial_velocity.Length()); + EXPECT_EQ(control_strategy->velocity_splines[1].polynomial.a1, acceleration); + EXPECT_EQ(control_strategy->velocity_splines[2].polynomial.a2, -0.5 * max_acceleration_rate); } TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenIncreasingSpeedAndJerkLimitsAndInitialSpeed_WhenExpectedRateAreTooHigh_ThenSplineHasAccelerationAndDecelerationJerkLimitsAndInitialSpeed) @@ -458,10 +455,10 @@ TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenIncreasingSpeedAndJerkLimitsAn auto control_strategy{dynamic_cast<FollowVelocitySplineControlStrategy*>(control_strategies_.front().get())}; EXPECT_EQ(control_strategy->default_value, target_speed); EXPECT_THAT(control_strategy->velocity_splines, testing::SizeIs(3)); - EXPECT_EQ(std::get<1>(control_strategy->velocity_splines[0].polynomial), 0.5 * max_deceleration_rate); - EXPECT_EQ(std::get<3>(control_strategy->velocity_splines[0].polynomial), initial_velocity.Length()); - EXPECT_EQ(std::get<2>(control_strategy->velocity_splines[1].polynomial), acceleration); - EXPECT_EQ(std::get<1>(control_strategy->velocity_splines[2].polynomial), -0.5 * max_acceleration_rate); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a2, 0.5 * max_deceleration_rate); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a0, initial_velocity.Length()); + EXPECT_EQ(control_strategy->velocity_splines[1].polynomial.a1, acceleration); + EXPECT_EQ(control_strategy->velocity_splines[2].polynomial.a2, -0.5 * max_acceleration_rate); } TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenIncreasingSpeedAndAccelerationRateLimit_WhenExpectedAccelerationRateIsTooHigh_ThenSplineHasAccelerationRateLimit) @@ -477,9 +474,9 @@ TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenIncreasingSpeedAndAcceleration auto control_strategy{dynamic_cast<FollowVelocitySplineControlStrategy*>(control_strategies_.front().get())}; EXPECT_EQ(control_strategy->default_value, target_speed); EXPECT_THAT(control_strategy->velocity_splines, testing::SizeIs(2)); - EXPECT_EQ(std::get<1>(control_strategy->velocity_splines[0].polynomial), 0.5 * max_acceleration_rate); - EXPECT_EQ(std::get<3>(control_strategy->velocity_splines[0].polynomial), initial_velocity.Length()); - EXPECT_EQ(std::get<2>(control_strategy->velocity_splines[1].polynomial), acceleration); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a2, 0.5 * max_acceleration_rate); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a0, initial_velocity.Length()); + EXPECT_EQ(control_strategy->velocity_splines[1].polynomial.a1, acceleration); } TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenIncreasingSpeedAndDecelerationRateLimit_WhenExpectedDecelerationRateIsTooHigh_ThenSplineHasDecelerationRateLimit) @@ -495,9 +492,9 @@ TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenIncreasingSpeedAndDeceleration auto control_strategy{dynamic_cast<FollowVelocitySplineControlStrategy*>(control_strategies_.front().get())}; EXPECT_EQ(control_strategy->default_value, target_speed); EXPECT_THAT(control_strategy->velocity_splines, testing::SizeIs(2)); - EXPECT_EQ(std::get<3>(control_strategy->velocity_splines[0].polynomial), initial_velocity.Length()); - EXPECT_EQ(std::get<2>(control_strategy->velocity_splines[0].polynomial), acceleration); - EXPECT_EQ(std::get<1>(control_strategy->velocity_splines[1].polynomial), -0.5 * max_deceleration_rate); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a0, initial_velocity.Length()); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a1, acceleration); + EXPECT_EQ(control_strategy->velocity_splines[1].polynomial.a2, -0.5 * max_deceleration_rate); } TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenIncreasingSpeedAndNoJerkLimits_WhenExpectedAccelerationRateIsTooHigh_ThenSplineHasNoJerkLimits) @@ -512,8 +509,8 @@ TEST_F(SpeedActionWithJerkLimitsTestFixture, GivenIncreasingSpeedAndNoJerkLimits auto control_strategy{dynamic_cast<FollowVelocitySplineControlStrategy*>(control_strategies_.front().get())}; EXPECT_EQ(control_strategy->default_value, target_speed); EXPECT_THAT(control_strategy->velocity_splines, testing::SizeIs(1)); - EXPECT_EQ(std::get<3>(control_strategy->velocity_splines[0].polynomial), initial_velocity.Length()); - EXPECT_EQ(std::get<2>(control_strategy->velocity_splines[0].polynomial), acceleration); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a0, initial_velocity.Length()); + EXPECT_EQ(control_strategy->velocity_splines[0].polynomial.a1, acceleration); } } // namespace OpenScenarioEngine::v1_3 diff --git a/engine/tests/TestUtils.h b/engine/tests/TestUtils.h index 7408a93901f80e061b9b836e83301df45aa70f45..b73883185f31703b7928f346bb211cc764c28301 100644 --- a/engine/tests/TestUtils.h +++ b/engine/tests/TestUtils.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2021-2024, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021-2025, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made @@ -11,8 +11,18 @@ #pragma once +#include <MantleAPI/Common/mock_geometry_helper.h> #include <MantleAPI/Execution/i_environment.h> -#include <MantleAPI/Test/test_utils.h> +#include <MantleAPI/Execution/mock_environment.h> +#include <MantleAPI/Map/mock_coord_converter.h> +#include <MantleAPI/Map/mock_lane_location_query_service.h> +#include <MantleAPI/Map/mock_route_repository.h> +#include <MantleAPI/Traffic/mock_controller.h> +#include <MantleAPI/Traffic/mock_controller_repository.h> +#include <MantleAPI/Traffic/mock_entity.h> +#include <MantleAPI/Traffic/mock_entity_repository.h> +#include <MantleAPI/Traffic/mock_traffic_area_service.h> +#include <MantleAPI/Traffic/mock_traffic_swarm_service.h> #include <agnostic_behavior_tree/decorator_node.h> #include <gtest/gtest.h> #include <openScenarioLib/src/common/SimpleMessageLogger.h> @@ -32,121 +42,365 @@ using namespace units::literals; class FakeRootNode : public yase::DecoratorNode { - public: - FakeRootNode(std::shared_ptr<mantle_api::IEnvironment> environment, - std::shared_ptr<::OpenScenarioEngine::v1_3::EngineAbortFlags> engine_abort_flags, - std::shared_ptr<::OpenScenarioEngine::v1_3::EntityBroker> entity_broker) - : yase::DecoratorNode{"OpenScenarioEngine"}, - environment_{environment}, - engine_abort_flags_{engine_abort_flags}, - entity_broker_{entity_broker} - { - distributeData(); - } +public: + FakeRootNode(std::shared_ptr<mantle_api::IEnvironment> environment, + std::shared_ptr<::OpenScenarioEngine::v1_3::EngineAbortFlags> engine_abort_flags, + std::shared_ptr<::OpenScenarioEngine::v1_3::EntityBroker> entity_broker) + : yase::DecoratorNode{"OpenScenarioEngine"}, + environment_{environment}, + engine_abort_flags_{engine_abort_flags}, + entity_broker_{entity_broker} + { + distributeData(); + } - private: - void lookupAndRegisterData(yase::Blackboard& blackboard) override - { - blackboard.set("Environment", environment_); - blackboard.set("EngineAbortFlags", engine_abort_flags_); - blackboard.set("EntityBroker", entity_broker_); - } +private: + void lookupAndRegisterData(yase::Blackboard& blackboard) override + { + blackboard.set("Environment", environment_); + blackboard.set("EngineAbortFlags", engine_abort_flags_); + blackboard.set("EntityBroker", entity_broker_); + } - yase::NodeStatus tick() final - { - return child().executeTick(); - } + yase::NodeStatus tick() final + { + return child().executeTick(); + } - std::shared_ptr<mantle_api::IEnvironment> environment_; - std::shared_ptr<::OpenScenarioEngine::v1_3::EngineAbortFlags> engine_abort_flags_; - std::shared_ptr<::OpenScenarioEngine::v1_3::EntityBroker> entity_broker_; + std::shared_ptr<mantle_api::IEnvironment> environment_; + std::shared_ptr<::OpenScenarioEngine::v1_3::EngineAbortFlags> engine_abort_flags_; + std::shared_ptr<::OpenScenarioEngine::v1_3::EntityBroker> entity_broker_; }; inline std::string GetScenariosPath(const std::string& test_file_path) { - std::filesystem::path file_path{test_file_path}; - return {file_path.remove_filename().string() + "data/Scenarios/"}; + std::filesystem::path file_path{test_file_path}; + return {file_path.remove_filename().string() + "data/Scenarios/"}; } -class OpenScenarioEngineLibraryTestBase : public ::testing::Test +class FakeGeometryHelper : public mantle_api::MockGeometryHelper +{ +public: + std::vector<mantle_api::Vec3<units::length::meter_t>> TransformPolylinePointsFromWorldToLocal( + const std::vector<mantle_api::Vec3<units::length::meter_t>>& polyline_points, + const mantle_api::Vec3<units::length::meter_t>& position, + const mantle_api::Orientation3<units::angle::radian_t>& orientation) const override + { + // do not transform but return original points + std::ignore = position; + std::ignore = orientation; + return polyline_points; + } + + mantle_api::Vec3<units::length::meter_t> TransformPositionFromWorldToLocal( + const mantle_api::Vec3<units::length::meter_t>& point_position, + const mantle_api::Vec3<units::length::meter_t>& position, + const mantle_api::Orientation3<units::angle::radian_t>& orientation) const override + { + // do not transform but return original points + std::ignore = position; + std::ignore = orientation; + return point_position; + } +}; + +class FakeVehicle : public mantle_api::MockVehicle { - protected: - void SetUp() override +public: + void SetName(const std::string& name) override { name_ = name; } + const std::string& GetName() const override { return name_; } + + void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override { properties_ = std::move(properties); } + + MOCK_METHOD(mantle_api::VehicleProperties*, GetPropertiesImpl, (), (const)); + mantle_api::VehicleProperties* GetProperties() const override + { + if (auto* properties = GetPropertiesImpl()) { - env_ = std::make_shared<mantle_api::MockEnvironment>(); - ON_CALL(env_->GetControllerRepository(), Create(testing::_)).WillByDefault(testing::ReturnRef(controller_)); + return properties; } + return static_cast<mantle_api::VehicleProperties*>(properties_.get()); + } - std::shared_ptr<mantle_api::MockEnvironment> env_; - mantle_api::MockController controller_; - std::string default_xosc_scenario_{ - "AutomatedLaneKeepingSystemScenarios/ALKS_Scenario_4.1_1_FreeDriving_TEMPLATE.xosc"}; +private: + std::string name_{}; + std::unique_ptr<mantle_api::EntityProperties> properties_{std::make_unique<mantle_api::VehicleProperties>()}; }; -class EngineSubModuleTestBase : public OpenScenarioEngineLibraryTestBase +class FakePedestrian : public mantle_api::MockPedestrian +{ +public: + void SetName(const std::string& name) override { name_ = name; } + const std::string& GetName() const override { return name_; } + void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override { properties_ = std::move(properties); } + mantle_api::PedestrianProperties* GetProperties() const override + { + return static_cast<mantle_api::PedestrianProperties*>(properties_.get()); + } + +private: + std::string name_{}; + std::unique_ptr<mantle_api::EntityProperties> properties_{nullptr}; +}; + +class FakeStaticObject : public mantle_api::MockStaticObject { - protected: - virtual void LoadScenario(const std::string& scenario_file_path) +public: + void SetName(const std::string& name) override { name_ = name; } + const std::string& GetName() const override { return name_; } + + void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override { properties_ = std::move(properties); } + MOCK_METHOD(mantle_api::StaticObjectProperties*, GetPropertiesImpl, (), (const)); + mantle_api::StaticObjectProperties* GetProperties() const override + { + if (auto* properties = GetPropertiesImpl()) { - auto message_logger = - std::make_shared<NET_ASAM_OPENSCENARIO::SimpleMessageLogger>(NET_ASAM_OPENSCENARIO::ErrorLevel::INFO); - auto catalog_message_logger = - std::make_shared<NET_ASAM_OPENSCENARIO::SimpleMessageLogger>(NET_ASAM_OPENSCENARIO::ErrorLevel::INFO); - auto loader_factory = - NET_ASAM_OPENSCENARIO::v1_3::XmlScenarioImportLoaderFactory(catalog_message_logger, scenario_file_path); - auto loader = loader_factory.CreateLoader(std::make_shared<NET_ASAM_OPENSCENARIO::FileResourceLocator>()); - - scenario_ptr_ = std::static_pointer_cast<NET_ASAM_OPENSCENARIO::v1_3::IOpenScenario>( - loader->Load(message_logger)->GetAdapter(typeid(NET_ASAM_OPENSCENARIO::v1_3::IOpenScenario).name())); + return properties; } + return static_cast<mantle_api::StaticObjectProperties*>(properties_.get()); + } + +private: + std::string name_{}; + std::unique_ptr<mantle_api::EntityProperties> properties_{nullptr}; +}; + +class FakeQueryService : public mantle_api::MockLaneLocationQueryService +{ +public: + std::optional<mantle_api::Pose> FindRelativeLanePoseAtDistanceFrom(const mantle_api::Pose& reference_pose_on_lane, int relative_target_lane, units::length::meter_t distance, units::length::meter_t lateral_offset) const override + { + std::ignore = reference_pose_on_lane; + std::ignore = relative_target_lane; + std::ignore = distance; + std::ignore = lateral_offset; + mantle_api::Pose pose{}; + return pose; + } + + std::optional<mantle_api::LaneId> GetRelativeLaneId(const mantle_api::Pose& reference_pose_on_lane, int relative_lane_target) const override + { + std::ignore = reference_pose_on_lane; + std::ignore = relative_lane_target; + return 0; + } +}; + +class FakeEntityRepository : public mantle_api::MockEntityRepository +{ +public: + template <typename T> + std::shared_ptr<T> RegisterEntity() + { + auto entity = std::make_shared<T>(); + entities_.emplace_back(entity); + return entity; + } + + FakeEntityRepository() + : fake_vehicle_{RegisterEntity<FakeVehicle>()}, + fake_pedestrian_{RegisterEntity<FakePedestrian>()}, + fake_static_object_{RegisterEntity<FakeStaticObject>()} + { + } + + std::weak_ptr<mantle_api::IVehicle> Create(mantle_api::UniqueId id, + const std::string& name, + const mantle_api::VehicleProperties& properties) override + { + std::ignore = id; + std::ignore = name; + std::ignore = properties; + return fake_vehicle_; + } + + std::weak_ptr<mantle_api::IPedestrian> Create(mantle_api::UniqueId id, + const std::string& name, + const mantle_api::PedestrianProperties& properties) override + { + std::ignore = id; + std::ignore = name; + std::ignore = properties; + return fake_pedestrian_; + } + + std::weak_ptr<mantle_api::IStaticObject> Create(mantle_api::UniqueId id, + const std::string& name, + const mantle_api::StaticObjectProperties& properties) override + { + std::ignore = id; + std::ignore = name; + std::ignore = properties; + return fake_static_object_; + } - std::string GetScenariosPath(const std::string& test_file_path) const + MOCK_METHOD(std::shared_ptr<mantle_api::IEntity>, + GetImpl, + (const std::string& name), + ()); + + MOCK_METHOD(std::shared_ptr<mantle_api::IEntity>, + GetImpl, + (const std::string& name), + (const)); + + std::weak_ptr<mantle_api::IEntity> Get(const std::string& name) override + { + if (auto entity = GetImpl(name)) { - std::filesystem::path file_path{test_file_path}; - // The first .parent_path() removes the filename, the second removes "/Utils" - return {file_path.parent_path().parent_path().string() + "/data/Scenarios/"}; + return entity; } + return fake_vehicle_; + } - std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::IOpenScenario> scenario_ptr_; + std::weak_ptr<const mantle_api::IEntity> Get(const std::string& name) const override + { + if (auto entity = GetImpl(name)) + { + return entity; + } + return fake_vehicle_; + } + + std::weak_ptr<mantle_api::IEntity> Get(mantle_api::UniqueId id) override + { + std::ignore = id; + return fake_vehicle_; + } + + std::weak_ptr<const mantle_api::IEntity> Get(mantle_api::UniqueId id) const override + { + std::ignore = id; + return fake_vehicle_; + } + + std::weak_ptr<mantle_api::IVehicle> GetHost() override { return fake_vehicle_; } + +private: + std::vector<std::shared_ptr<mantle_api::IEntity>> entities_{}; + std::shared_ptr<FakeVehicle> fake_vehicle_; + std::shared_ptr<FakePedestrian> fake_pedestrian_; + std::shared_ptr<FakeStaticObject> fake_static_object_; +}; + +class FakeEnvironment : public mantle_api::MockEnvironment +{ +public: + const mantle_api::ILaneLocationQueryService& GetQueryService() const override { return query_service_; } + + mantle_api::ICoordConverter* GetConverter() override { return &converter_; } + + const mantle_api::IGeometryHelper* GetGeometryHelper() const override { return &geometry_helper_; } + + mantle_api::IEntityRepository& GetEntityRepository() override { return entity_repository_; } + + const mantle_api::IEntityRepository& GetEntityRepository() const override { return entity_repository_; } + + mantle_api::MockControllerRepository& GetControllerRepository() override { return controller_repository_; } + + mantle_api::IRouteRepository& GetRouteRepository() override { return route_repository_; } + + const mantle_api::MockControllerRepository& GetControllerRepository() const override { return controller_repository_; } + + mantle_api::MockTrafficSwarmService& GetTrafficSwarmService() override { return traffic_swarm_service_; } + + mantle_api::MockTrafficAreaService& GetTrafficAreaService() override { return traffic_area_service_; } + +protected: + FakeQueryService query_service_{}; + FakeEntityRepository entity_repository_{}; + mantle_api::MockControllerRepository controller_repository_{}; + mantle_api::MockCoordConverter converter_{}; + FakeGeometryHelper geometry_helper_{}; + mantle_api::MockRouteRepository route_repository_{}; + mantle_api::MockTrafficSwarmService traffic_swarm_service_{}; + mantle_api::MockTrafficAreaService traffic_area_service_{}; +}; + +class OpenScenarioEngineLibraryTestBase : public ::testing::Test +{ +protected: + void SetUp() override + { + env_ = std::make_shared<FakeEnvironment>(); + controller_ = std::make_shared<mantle_api::MockController>(); + ON_CALL(env_->GetControllerRepository(), Create(testing::_)).WillByDefault(testing::Return(controller_)); + ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()), GetUniqueId()).WillByDefault(testing::Return(mantle_api::UniqueId(0))); + } + + std::shared_ptr<FakeEnvironment> env_; + std::shared_ptr<mantle_api::MockController> controller_; + + std::string default_xosc_scenario_{ + "AutomatedLaneKeepingSystemScenarios/ALKS_Scenario_4.1_1_FreeDriving_TEMPLATE.xosc"}; +}; + +class EngineSubModuleTestBase : public OpenScenarioEngineLibraryTestBase +{ +protected: + virtual void LoadScenario(const std::string& scenario_file_path) + { + auto message_logger = + std::make_shared<NET_ASAM_OPENSCENARIO::SimpleMessageLogger>(NET_ASAM_OPENSCENARIO::ErrorLevel::INFO); + auto catalog_message_logger = + std::make_shared<NET_ASAM_OPENSCENARIO::SimpleMessageLogger>(NET_ASAM_OPENSCENARIO::ErrorLevel::INFO); + auto loader_factory = + NET_ASAM_OPENSCENARIO::v1_3::XmlScenarioImportLoaderFactory(catalog_message_logger, scenario_file_path); + auto loader = loader_factory.CreateLoader(std::make_shared<NET_ASAM_OPENSCENARIO::FileResourceLocator>()); + + scenario_ptr_ = std::static_pointer_cast<NET_ASAM_OPENSCENARIO::v1_3::IOpenScenario>( + loader->Load(message_logger)->GetAdapter(typeid(NET_ASAM_OPENSCENARIO::v1_3::IOpenScenario).name())); + } + + std::string GetScenariosPath(const std::string& test_file_path) const + { + std::filesystem::path file_path{test_file_path}; + // The first .parent_path() removes the filename, the second removes "/Utils" + return {file_path.parent_path().parent_path().string() + "/data/Scenarios/"}; + } + + std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::IOpenScenario> scenario_ptr_; }; class OpenScenarioEngineTestBase : public OpenScenarioEngineLibraryTestBase { - protected: - void SetUp() override - { - OpenScenarioEngineLibraryTestBase::SetUp(); - - mantle_api::VehicleProperties ego_properties{}; - ego_properties.type = mantle_api::EntityType::kVehicle; - ego_properties.classification = mantle_api::VehicleClass::kMedium_car; - ego_properties.model = "medium_car"; - ego_properties.bounding_box.dimension.length = 5.0_m; - ego_properties.bounding_box.dimension.width = 2.0_m; - ego_properties.bounding_box.dimension.height = 1.8_m; - ego_properties.bounding_box.geometric_center.x = 1.4_m; - ego_properties.bounding_box.geometric_center.y = 0.0_m; - ego_properties.bounding_box.geometric_center.z = 0.9_m; - ego_properties.performance.max_acceleration = 10_mps_sq; - ego_properties.performance.max_deceleration = 10_mps_sq; - ego_properties.performance.max_speed = 70_mps; - ego_properties.front_axle.bb_center_to_axle_center = {1.58_m, 0.0_m, -0.5_m}; - ego_properties.front_axle.max_steering = 0.5_rad; - ego_properties.front_axle.track_width = 1.68_m; - ego_properties.front_axle.wheel_diameter = 0.8_m; - ego_properties.rear_axle.bb_center_to_axle_center = {-1.4_m, 0.0_m, -0.5_m}; - ego_properties.rear_axle.max_steering = 0_rad; - ego_properties.rear_axle.track_width = 1.68_m; - ego_properties.rear_axle.wheel_diameter = 0.8_m; - ego_properties.is_host = true; - // Necessary because Create() is always called in engine init and will otherwise not return a MockVehicle ref - // which results in an exception - ON_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), - Create(testing::_, ego_properties)) - .WillByDefault(testing::ReturnRef(mock_vehicle_)); - } +protected: + void SetUp() override + { + OpenScenarioEngineLibraryTestBase::SetUp(); + fake_vehicle_ = std::make_shared<FakeVehicle>(); + + mantle_api::VehicleProperties ego_properties{}; + ego_properties.type = mantle_api::EntityType::kVehicle; + ego_properties.classification = mantle_api::VehicleClass::kMediumCar; + ego_properties.model = "medium_car"; + ego_properties.bounding_box.dimension.length = 5.0_m; + ego_properties.bounding_box.dimension.width = 2.0_m; + ego_properties.bounding_box.dimension.height = 1.8_m; + ego_properties.bounding_box.geometric_center.x = 1.4_m; + ego_properties.bounding_box.geometric_center.y = 0.0_m; + ego_properties.bounding_box.geometric_center.z = 0.9_m; + ego_properties.performance.max_acceleration = 10_mps_sq; + ego_properties.performance.max_deceleration = 10_mps_sq; + ego_properties.performance.max_speed = 70_mps; + ego_properties.front_axle.bb_center_to_axle_center = {1.58_m, 0.0_m, -0.5_m}; + ego_properties.front_axle.max_steering = 0.5_rad; + ego_properties.front_axle.track_width = 1.68_m; + ego_properties.front_axle.wheel_diameter = 0.8_m; + ego_properties.rear_axle.bb_center_to_axle_center = {-1.4_m, 0.0_m, -0.5_m}; + ego_properties.rear_axle.max_steering = 0_rad; + ego_properties.rear_axle.track_width = 1.68_m; + ego_properties.rear_axle.wheel_diameter = 0.8_m; + ego_properties.is_host = true; + + // Necessary because Create() is always called in engine init and will otherwise not return a MockVehicle ref + // which results in an exception + ON_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), + Create(testing::_, ego_properties)) + .WillByDefault(testing::Return(fake_vehicle_)); + } - mantle_api::MockVehicle mock_vehicle_{}; + std::shared_ptr<FakeVehicle> fake_vehicle_; }; } // namespace testing::OpenScenarioEngine::v1_3 diff --git a/engine/tests/TestUtils/MockLogger.h b/engine/tests/TestUtils/MockLogger.h index e636b5e6991188483eb340187f34419be840e965..e3445edfa8bd17e8d8cff41af74488c3f7b8ada7 100644 --- a/engine/tests/TestUtils/MockLogger.h +++ b/engine/tests/TestUtils/MockLogger.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 @@ -11,17 +11,8 @@ #pragma once #include <MantleAPI/Common/i_logger.h> -#include <MantleAPI/Common/log_utils.h> #include <gmock/gmock.h> -namespace mantle_api -{ -inline void PrintTo(mantle_api::LogLevel log_level, ::std::ostream* os) -{ - *os << log_level; -} -} // namespace mantle_api - namespace testing::OpenScenarioEngine::v1_3 { class MockLogger : public mantle_api::ILogger @@ -31,4 +22,4 @@ public: MOCK_METHOD(void, Log, (mantle_api::LogLevel level, std::string_view message), (noexcept, override)); }; -} // namespace testing::OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace testing::OpenScenarioEngine::v1_3 diff --git a/engine/tests/TestUtils/MockStochastics.h b/engine/tests/TestUtils/MockStochastics.h index 87a4a21e494180e6556e3d5a3fa243658d9fec7b..0c8003926930efa75bd78775bfb0fc2bceb98bcf 100644 --- a/engine/tests/TestUtils/MockStochastics.h +++ b/engine/tests/TestUtils/MockStochastics.h @@ -10,10 +10,10 @@ #pragma once -#include <gmock/gmock.h> #include <Stochastics/StochasticsInterface.h> +#include <gmock/gmock.h> -namespace OpenScenarioEngine::v1_3 +namespace testing::OpenScenarioEngine::v1_3 { class MockStochastics : public StochasticsInterface { @@ -42,4 +42,4 @@ public: } }; -} // namespace testing::OpenScenarioEngine::v1_3 \ No newline at end of file +} // namespace testing::OpenScenarioEngine::v1_3 diff --git a/engine/tests/TrafficSignalParsing/TrafficPhaseNodeTest.cpp b/engine/tests/TrafficSignalParsing/TrafficPhaseNodeTest.cpp index 8d577b1dd0a94f6937b4353be34d8be82ea67e4b..8b5de7ede375eb4fc2d57ccc06c6f385f6ce7ad2 100644 --- a/engine/tests/TrafficSignalParsing/TrafficPhaseNodeTest.cpp +++ b/engine/tests/TrafficSignalParsing/TrafficPhaseNodeTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2022-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2022-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -8,7 +8,7 @@ * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -#include <MantleAPI/Test/test_utils.h> +#include <MantleAPI/Execution/mock_environment.h> #include <agnostic_behavior_tree/composite/parallel_node.h> #include <gmock/gmock.h> #include <gtest/gtest.h> diff --git a/engine/tests/TrafficSignalParsing/TreeGenerationTest.cpp b/engine/tests/TrafficSignalParsing/TreeGenerationTest.cpp index a7285087da5dd9d4ff2424c7169b0dbe5c5a2d7f..fff7f032c7f47d818e6b408c3b5b3dd705a2d427 100644 --- a/engine/tests/TrafficSignalParsing/TreeGenerationTest.cpp +++ b/engine/tests/TrafficSignalParsing/TreeGenerationTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2022-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2022-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at @@ -11,7 +11,6 @@ #include <ApiClassWriterInterfacesV1_3.h> #include <MantleAPI/Common/position.h> #include <MantleAPI/Common/time_utils.h> -#include <MantleAPI/Test/test_utils.h> #include <agnostic_behavior_tree/composite/parallel_node.h> #include <agnostic_behavior_tree/decorator/stop_at_node.h> #include <agnostic_behavior_tree/utils/tree_print.h> diff --git a/engine/tests/Utils/ControllerCreatorTest.cpp b/engine/tests/Utils/ControllerCreatorTest.cpp index 2b5bc9ec6f0ec7580669809fff64dde05c4679d0..79dc1b9930e5da841a6d5681184d15b8ad648f1d 100644 --- a/engine/tests/Utils/ControllerCreatorTest.cpp +++ b/engine/tests/Utils/ControllerCreatorTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2023 Ansys, Inc. * * This program and the accompanying materials are made @@ -10,7 +10,6 @@ *******************************************************************************/ #include <ApiClassWriterInterfacesV1_3.h> -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> #include <openScenarioLib/generated/v1_3/impl/ApiClassImplV1_3.h> #include <openScenarioLib/generated/v1_3/impl/OpenScenarioWriterFactoryImplV1_3.h> @@ -28,30 +27,29 @@ using testing::Return; using testing::ReturnRef; using testing::SizeIs; -class ControllerCreator : public ::testing::Test +class ControllerCreatorTest : public ::testing::Test { public: inline static constexpr mantle_api::UniqueId TEST_CONTROLLER_ID{1234}; inline static const std::string TEST_CONTROLLER_NAME{"TEST_CONTROLLER"}; - ControllerCreator() + ControllerCreatorTest() : LOGGER{std::make_unique<testing::OpenScenarioEngine::v1_3::TestLogger>()}, - mockEnvironment{}, - mockEntityRepository{dynamic_cast<mantle_api::MockEntityRepository&>(mockEnvironment.GetEntityRepository())}, - mockControllerRepository{mockEnvironment.GetControllerRepository()}, - mockController{} + fake_environment_{}, + mock_controller_repository_{fake_environment_.GetControllerRepository()} { - ON_CALL(mockController, GetName()).WillByDefault(ReturnRef(TEST_CONTROLLER_NAME)); - ON_CALL(mockController, GetUniqueId()).WillByDefault(testing::Invoke([] { + ON_CALL(*mock_controller_, GetName()).WillByDefault(ReturnRef(TEST_CONTROLLER_NAME)); + ON_CALL(*mock_controller_, GetUniqueId()).WillByDefault(testing::Invoke([] + { // id will be incremented at every call, starting with 1000 - static mantle_api::UniqueId id{1000}; - return id++; - })); + static mantle_api::UniqueId id{999}; + id = id.Value() + 1; + return id; })); } void SET_VEHICLE_MOCK_NAME_AND_ID(const std::string& name, mantle_api::UniqueId id) { - auto& mockVehicle = dynamic_cast<mantle_api::MockVehicle&>(mockEnvironment.GetEntityRepository().Get(name).value().get()); + auto& mockVehicle = dynamic_cast<mantle_api::MockVehicle&>(*fake_environment_.GetEntityRepository().Get(name).lock()); mockVehicle.SetName(name); ON_CALL(mockVehicle, GetUniqueId()).WillByDefault(Return(id)); @@ -103,39 +101,38 @@ public: std::unique_ptr<testing::OpenScenarioEngine::v1_3::TestLogger> LOGGER; - mantle_api::MockEnvironment mockEnvironment; - mantle_api::MockEntityRepository& mockEntityRepository; - mantle_api::MockControllerRepository& mockControllerRepository; - mantle_api::MockController mockController; + testing::OpenScenarioEngine::v1_3::FakeEnvironment fake_environment_; + mantle_api::MockControllerRepository& mock_controller_repository_; + std::shared_ptr<mantle_api::MockController> mock_controller_{std::make_shared<mantle_api::MockController>()}; std::vector<std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::IScenarioObject>> scenario_objects{}; std::vector<std::unique_ptr<mantle_api::IEntity>> entities_{}; }; -TEST_F(ControllerCreator, GivenNoScenarioObjects_WhenCreateIsCalled_ThenDoesNothing) +TEST_F(ControllerCreatorTest, GivenNoScenarioObjects_WhenCreateIsCalled_ThenDoesNothing) { - EXPECT_CALL(mockControllerRepository, Create(_)).Times(0); - OpenScenarioEngine::v1_3::ControllerCreator controller_creator(mockEnvironment); + EXPECT_CALL(mock_controller_repository_, Create(_)).Times(0); + OpenScenarioEngine::v1_3::ControllerCreator controller_creator(fake_environment_); controller_creator.CreateControllers(scenario_objects); } -TEST_F(ControllerCreator, GivenScenarioObjectWithoutController_WhenCreateIsCalled_ThenCreatesDefaultController) +TEST_F(ControllerCreatorTest, GivenScenarioObjectWithoutController_WhenCreateIsCalled_ThenCreatesDefaultController) { - SETUP_ENTITY("test_entity", 1234, true, false); + SETUP_ENTITY("test_entity", mantle_api::UniqueId(1234), true, false); - EXPECT_CALL(mockControllerRepository, Create(_)).WillOnce(ReturnRef(mockController)); - OpenScenarioEngine::v1_3::ControllerCreator controller_creator(mockEnvironment); + EXPECT_CALL(mock_controller_repository_, Create(_)).WillOnce(Return(mock_controller_)); + OpenScenarioEngine::v1_3::ControllerCreator controller_creator(fake_environment_); controller_creator.CreateControllers(scenario_objects); } -TEST_F(ControllerCreator, GivenUncontrollableScenarioObject_WhenCreateIsCalled_ThenDoesNothingAndLogsMessage) +TEST_F(ControllerCreatorTest, GivenUncontrollableScenarioObject_WhenCreateIsCalled_ThenDoesNothingAndLogsMessage) { - SETUP_ENTITY("test_entity", 1234, false, false); + SETUP_ENTITY("test_entity", mantle_api::UniqueId(1234), false, false); - EXPECT_CALL(mockControllerRepository, Create(_)).Times(0); - OpenScenarioEngine::v1_3::ControllerCreator controller_creator(mockEnvironment); + EXPECT_CALL(mock_controller_repository_, Create(_)).Times(0); + OpenScenarioEngine::v1_3::ControllerCreator controller_creator(fake_environment_); controller_creator.CreateControllers(scenario_objects); @@ -144,85 +141,85 @@ TEST_F(ControllerCreator, GivenUncontrollableScenarioObject_WhenCreateIsCalled_T EXPECT_THAT(LOGGER->LastLogMessage(), HasSubstr("test_entity")); } -TEST_F(ControllerCreator, GivenUncontrollableAndControllableScenarioObject_WhenCreateIsCalled_ThenControllerOnlyForControllableObjectIsCreated) +TEST_F(ControllerCreatorTest, GivenUncontrollableAndControllableScenarioObject_WhenCreateIsCalled_ThenControllerOnlyForControllableObjectIsCreated) { - SETUP_ENTITY("uncontrollable_entity", 1234, false, false); - SETUP_ENTITY("entity_2", 5678, true, false); + SETUP_ENTITY("uncontrollable_entity", mantle_api::UniqueId(1234), false, false); + SETUP_ENTITY("entity_2", mantle_api::UniqueId(5678), true, false); - EXPECT_CALL(mockControllerRepository, Create(_)).Times(1).WillOnce(ReturnRef(mockController)); - OpenScenarioEngine::v1_3::ControllerCreator controller_creator(mockEnvironment); + EXPECT_CALL(mock_controller_repository_, Create(_)).Times(1).WillOnce(Return(mock_controller_)); + OpenScenarioEngine::v1_3::ControllerCreator controller_creator(fake_environment_); controller_creator.CreateControllers(scenario_objects); } -TEST_F(ControllerCreator, GivenScenarioObjectWithController_WhenCreateIsCalled_ThenCreatesDefaultAndUserDefinedController) +TEST_F(ControllerCreatorTest, GivenScenarioObjectWithController_WhenCreateIsCalled_ThenCreatesDefaultAndUserDefinedController) { - SETUP_ENTITY("test_entity", 1234, true, true); + SETUP_ENTITY("test_entity", mantle_api::UniqueId(1234), true, true); - EXPECT_CALL(mockControllerRepository, Create(_)) - .WillOnce(ReturnRef(mockController)) - .WillOnce(ReturnRef(mockController)); + EXPECT_CALL(mock_controller_repository_, Create(_)) + .WillOnce(Return(mock_controller_)) + .WillOnce(Return(mock_controller_)); - OpenScenarioEngine::v1_3::ControllerCreator controller_creator(mockEnvironment); + OpenScenarioEngine::v1_3::ControllerCreator controller_creator(fake_environment_); controller_creator.CreateControllers(scenario_objects); } -TEST_F(ControllerCreator, GivenScenarioObjectWithController_WhenCreateIsCalled_ThenControllerServiceContainsEntitiyControllers) +TEST_F(ControllerCreatorTest, GivenScenarioObjectWithController_WhenCreateIsCalled_ThenControllerServiceContainsEntitiyControllers) { - constexpr mantle_api::UniqueId ENTITY_ID = 1234; + constexpr mantle_api::UniqueId ENTITY_ID{1234}; SETUP_ENTITY("test_entity", ENTITY_ID, true, true); - ON_CALL(mockControllerRepository, Create(_)).WillByDefault(ReturnRef(mockController)); + ON_CALL(mock_controller_repository_, Create(_)).WillByDefault(Return(mock_controller_)); - OpenScenarioEngine::v1_3::ControllerCreator controller_creator(mockEnvironment); + OpenScenarioEngine::v1_3::ControllerCreator controller_creator(fake_environment_); controller_creator.CreateControllers(scenario_objects); auto controller_service = controller_creator.GetControllerService(); auto controllers = controller_service->GetControllers(ENTITY_ID); auto internal_controller_id = controllers->internal.first; - EXPECT_THAT(internal_controller_id, Gt(0)); + EXPECT_THAT(internal_controller_id, Gt(mantle_api::UniqueId(0))); ASSERT_THAT(controllers->user_defined, SizeIs(1)); auto user_defined_controller_id = controllers->user_defined.begin()->first; - EXPECT_THAT(user_defined_controller_id, Gt(0)); + EXPECT_THAT(user_defined_controller_id, Gt(mantle_api::UniqueId(0))); ASSERT_THAT(internal_controller_id, Ne(user_defined_controller_id)); } -TEST_F(ControllerCreator, GivenExternalControllerOverrideSet_WhenCreateControllerIsCalled_ThenHostGetsUserDefinedController) +TEST_F(ControllerCreatorTest, GivenExternalControllerOverrideSet_WhenCreateControllerIsCalled_ThenHostGetsUserDefinedController) { - constexpr mantle_api::UniqueId ENTITY_ID = 1234; + constexpr mantle_api::UniqueId ENTITY_ID{1234}; // "DSpace" host "M1:..." and no external controller SETUP_ENTITY("M1:test_entity", ENTITY_ID, true, false); - mantle_api::MockController default_controller{}; + std::shared_ptr<mantle_api::MockController> default_controller{std::make_shared<mantle_api::MockController>()}; constexpr mantle_api::UniqueId DEFAULT_CONTROLLER_ID{1000}; std::string DEFAULT_CONTROLLER_NAME{"DEFAULT_CONTROLLER"}; - ON_CALL(default_controller, GetUniqueId()).WillByDefault(Return(DEFAULT_CONTROLLER_ID)); - ON_CALL(default_controller, GetName()).WillByDefault(ReturnRef(DEFAULT_CONTROLLER_NAME)); - EXPECT_CALL(default_controller, + ON_CALL(*default_controller, GetUniqueId()).WillByDefault(Return(DEFAULT_CONTROLLER_ID)); + ON_CALL(*default_controller, GetName()).WillByDefault(ReturnRef(DEFAULT_CONTROLLER_NAME)); + EXPECT_CALL(*default_controller, ChangeState(mantle_api::IController::LateralState::kActivate, mantle_api::IController::LongitudinalState::kActivate)) .Times(1); - EXPECT_CALL(default_controller, + EXPECT_CALL(*default_controller, ChangeState(mantle_api::IController::LateralState::kDeactivate, mantle_api::IController::LongitudinalState::kDeactivate)) .Times(1); - mantle_api::MockController user_defined_controller{}; + std::shared_ptr<mantle_api::MockController> user_defined_controller{std::make_shared<mantle_api::MockController>()}; constexpr mantle_api::UniqueId USER_DEFINED_CONTROLLER_ID{1001}; std::string USER_DEFINED_CONTROLLER_NAME{"USED_DEFINED_CONTROLLER"}; - ON_CALL(user_defined_controller, GetUniqueId()).WillByDefault(Return(USER_DEFINED_CONTROLLER_ID)); - ON_CALL(user_defined_controller, GetName()).WillByDefault(ReturnRef(USER_DEFINED_CONTROLLER_NAME)); - EXPECT_CALL(user_defined_controller, + ON_CALL(*user_defined_controller, GetUniqueId()).WillByDefault(Return(USER_DEFINED_CONTROLLER_ID)); + ON_CALL(*user_defined_controller, GetName()).WillByDefault(ReturnRef(USER_DEFINED_CONTROLLER_NAME)); + EXPECT_CALL(*user_defined_controller, ChangeState(mantle_api::IController::LateralState::kActivate, mantle_api::IController::LongitudinalState::kActivate)) .Times(1); - EXPECT_CALL(mockControllerRepository, Create(_)) - .WillOnce(ReturnRef(default_controller)) - .WillOnce(ReturnRef(user_defined_controller)); + EXPECT_CALL(mock_controller_repository_, Create(_)) + .WillOnce(Return(default_controller)) + .WillOnce(Return(user_defined_controller)); - OpenScenarioEngine::v1_3::ControllerCreator controller_creator(mockEnvironment); + OpenScenarioEngine::v1_3::ControllerCreator controller_creator(fake_environment_); controller_creator.EnableUserDefinedControllerOverride(); controller_creator.CreateControllers(scenario_objects); @@ -237,25 +234,25 @@ TEST_F(ControllerCreator, GivenExternalControllerOverrideSet_WhenCreateControlle EXPECT_EQ(actual_user_defined_controller_id, USER_DEFINED_CONTROLLER_ID); } -TEST_F(ControllerCreator, GivenScenarioObjectWithoutController_WhenCreateControllersIsCalled_ThenDefaultControllerIsCreatedAndActivated) +TEST_F(ControllerCreatorTest, GivenScenarioObjectWithoutController_WhenCreateControllersIsCalled_ThenDefaultControllerIsCreatedAndActivated) { - SETUP_ENTITY("test_entity", 1234, true, false); + SETUP_ENTITY("test_entity", mantle_api::UniqueId(1234), true, false); - EXPECT_CALL(mockControllerRepository, Create(_)).WillOnce(ReturnRef(mockController)); - EXPECT_CALL(mockController, ChangeState(_, _)).Times(1); - OpenScenarioEngine::v1_3::ControllerCreator controller_creator(mockEnvironment); + EXPECT_CALL(mock_controller_repository_, Create(_)).WillOnce(Return(mock_controller_)); + EXPECT_CALL(*mock_controller_, ChangeState(_, _)).Times(1); + OpenScenarioEngine::v1_3::ControllerCreator controller_creator(fake_environment_); controller_creator.CreateControllers(scenario_objects); } -TEST_F(ControllerCreator, GivenScenarioObjectWithController_WhenResetControllerMappingsIsCalled_ThenControllerServiceInternalStateIsReset) +TEST_F(ControllerCreatorTest, GivenScenarioObjectWithController_WhenResetControllerMappingsIsCalled_ThenControllerServiceInternalStateIsReset) { - constexpr mantle_api::UniqueId ENTITY_ID = 1234; + constexpr mantle_api::UniqueId ENTITY_ID{1234}; SETUP_ENTITY("test_entity", ENTITY_ID, true, true); - ON_CALL(mockControllerRepository, Create(_)).WillByDefault(ReturnRef(mockController)); + ON_CALL(mock_controller_repository_, Create(_)).WillByDefault(Return(mock_controller_)); - OpenScenarioEngine::v1_3::ControllerCreator controller_creator(mockEnvironment); + OpenScenarioEngine::v1_3::ControllerCreator controller_creator(fake_environment_); controller_creator.CreateControllers(scenario_objects); auto controller_service = controller_creator.GetControllerService(); diff --git a/engine/tests/Utils/EntityCreatorTest.cpp b/engine/tests/Utils/EntityCreatorTest.cpp index d86ac535f253ed844476c89bf18676aaffc18b0e..edbae4bb5fa353252fb76e764a936e5e5ed3d083 100644 --- a/engine/tests/Utils/EntityCreatorTest.cpp +++ b/engine/tests/Utils/EntityCreatorTest.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2023-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2023-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) * Copyright (c) 2022-2023 Ansys, Inc. * * This program and the accompanying materials are made @@ -9,12 +9,11 @@ * SPDX-License-Identifier: EPL-2.0 *******************************************************************************/ -#include "Utils/EntityCreator.h" -#include "TestUtils.h" - -#include <MantleAPI/Test/test_utils.h> #include <gtest/gtest.h> +#include "TestUtils.h" +#include "Utils/EntityCreator.h" + using testing::OpenScenarioEngine::v1_3::EngineSubModuleTestBase; using namespace units::literals; @@ -24,138 +23,140 @@ class EntityCreatorTest : public EngineSubModuleTestBase MATCHER_P(StaticObjectPropertiesEqualTo, expected_static_object_property, "") { - return arg.type == expected_static_object_property.type && - arg.static_object_type == expected_static_object_property.static_object_type && - arg.model == expected_static_object_property.model && - arg.vertical_offset == expected_static_object_property.vertical_offset && - arg.bounding_box.dimension.length == expected_static_object_property.bounding_box.dimension.length && - arg.bounding_box.dimension.width == expected_static_object_property.bounding_box.dimension.width && - arg.bounding_box.dimension.height == expected_static_object_property.bounding_box.dimension.height && - arg.bounding_box.geometric_center.x == expected_static_object_property.bounding_box.geometric_center.x && - arg.bounding_box.geometric_center.y == expected_static_object_property.bounding_box.geometric_center.y && - arg.bounding_box.geometric_center.z == expected_static_object_property.bounding_box.geometric_center.z; + return arg.type == expected_static_object_property.type && + arg.static_object_type == expected_static_object_property.static_object_type && + arg.model == expected_static_object_property.model && + arg.vertical_offset == expected_static_object_property.vertical_offset && + arg.bounding_box.dimension.length == expected_static_object_property.bounding_box.dimension.length && + arg.bounding_box.dimension.width == expected_static_object_property.bounding_box.dimension.width && + arg.bounding_box.dimension.height == expected_static_object_property.bounding_box.dimension.height && + arg.bounding_box.geometric_center.x == expected_static_object_property.bounding_box.geometric_center.x && + arg.bounding_box.geometric_center.y == expected_static_object_property.bounding_box.geometric_center.y && + arg.bounding_box.geometric_center.z == expected_static_object_property.bounding_box.geometric_center.z; } TEST_F(EntityCreatorTest, GivenScenarioWithEntities_WhenCreateEntityIsCalled_ThenCreateIsCalledInEnvironment) { - std::string xosc_file_path{GetScenariosPath(test_info_->file()) + "test_entities_valid.xosc"}; - LoadScenario(xosc_file_path); - OpenScenarioEngine::v1_3::EntityCreator entity_creator(env_); - - mantle_api::MockVehicle mock_vehicle{}; - mantle_api::MockPedestrian mock_pedestrian{}; - mantle_api::MockStaticObject mock_static_object{}; - - mantle_api::VehicleProperties vehicle_properties{}; - vehicle_properties.type = mantle_api::EntityType::kVehicle; - vehicle_properties.classification = mantle_api::VehicleClass::kMotorbike; - vehicle_properties.model = "motorbike"; - vehicle_properties.bounding_box.dimension.length = 5.0_m; - vehicle_properties.bounding_box.dimension.width = 2.0_m; - vehicle_properties.bounding_box.dimension.height = 1.8_m; - vehicle_properties.bounding_box.geometric_center.x = 1.4_m; - vehicle_properties.bounding_box.geometric_center.y = 0.0_m; - vehicle_properties.bounding_box.geometric_center.z = 0.9_m; - vehicle_properties.performance.max_acceleration = 10_mps_sq; - vehicle_properties.performance.max_deceleration = 10_mps_sq; - vehicle_properties.performance.max_speed = 70_mps; - vehicle_properties.front_axle.bb_center_to_axle_center = {1.58_m, 0.0_m, -0.5_m}; - vehicle_properties.front_axle.max_steering = 0.5_rad; - vehicle_properties.front_axle.track_width = 1.68_m; - vehicle_properties.front_axle.wheel_diameter = 0.8_m; - vehicle_properties.rear_axle.bb_center_to_axle_center = {-1.40_m, 0.0_m, -0.5_m}; - vehicle_properties.rear_axle.max_steering = 0_rad; - vehicle_properties.rear_axle.track_width = 1.68_m; - vehicle_properties.rear_axle.wheel_diameter = 0.8_m; - - mantle_api::VehicleProperties ego_properties{vehicle_properties}; - ego_properties.classification = mantle_api::VehicleClass::kMedium_car; - ego_properties.model = "medium_car"; - ego_properties.is_host = true; - ego_properties.properties.emplace("custom_property", "5"); - - mantle_api::VehicleProperties wheelchair_properties{}; - wheelchair_properties.type = mantle_api::EntityType::kVehicle; - wheelchair_properties.classification = mantle_api::VehicleClass::kWheelchair; - wheelchair_properties.bounding_box.dimension.length = 0.7_m; - wheelchair_properties.bounding_box.dimension.width = 0.7_m; - wheelchair_properties.bounding_box.dimension.height = 1.3_m; - wheelchair_properties.bounding_box.geometric_center.x = 0.35_m; - wheelchair_properties.bounding_box.geometric_center.y = 0.0_m; - wheelchair_properties.bounding_box.geometric_center.z = 0.65_m; - - mantle_api::PedestrianProperties pedestrian_properties{}; - pedestrian_properties.type = mantle_api::EntityType::kPedestrian; - pedestrian_properties.model = "male"; - pedestrian_properties.bounding_box.dimension.length = 0.3_m; - pedestrian_properties.bounding_box.dimension.width = 0.5_m; - pedestrian_properties.bounding_box.dimension.height = 1.8_m; - pedestrian_properties.bounding_box.geometric_center.x = 0.15_m; - pedestrian_properties.bounding_box.geometric_center.y = 0.0_m; - pedestrian_properties.bounding_box.geometric_center.z = 0.9_m; - - mantle_api::PedestrianProperties animal_properties{}; - animal_properties.type = mantle_api::EntityType::kAnimal; - animal_properties.model = "Deer.gltf"; - animal_properties.bounding_box.dimension.length = 1.5_m; - animal_properties.bounding_box.dimension.width = 0.5_m; - animal_properties.bounding_box.dimension.height = 1.1_m; - animal_properties.bounding_box.geometric_center.x = 0.75_m; - animal_properties.bounding_box.geometric_center.y = 0.0_m; - animal_properties.bounding_box.geometric_center.z = 0.55_m; - - mantle_api::StaticObjectProperties static_object_properties{}; - static_object_properties.type = mantle_api::EntityType::kStatic; - static_object_properties.static_object_type = mantle_api::StaticObjectType::kOther; - static_object_properties.model = "pylon"; - static_object_properties.vertical_offset = 0.5_m; - static_object_properties.bounding_box.dimension.length = 1.0_m; - static_object_properties.bounding_box.dimension.width = 1.0_m; - static_object_properties.bounding_box.dimension.height = 1.0_m; - static_object_properties.bounding_box.geometric_center.x = 0.5_m; - static_object_properties.bounding_box.geometric_center.y = 0.0_m; - static_object_properties.bounding_box.geometric_center.z = 0.5_m; - - EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), - Create(std::string("ScenarioObject6"), static_object_properties)) - .Times(1) - .WillRepeatedly(testing::ReturnRef(mock_static_object)); - - EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), - Create(std::string("ScenarioObject5"), wheelchair_properties)) - .Times(1) - .WillRepeatedly(testing::ReturnRef(mock_vehicle)); - - EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), - Create(std::string("ScenarioObject4"), animal_properties)) - .Times(1) - .WillRepeatedly(testing::ReturnRef(mock_pedestrian)); - - EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), - Create(std::string("ScenarioObject3"), vehicle_properties)) - .Times(1) - .WillRepeatedly(testing::ReturnRef(mock_vehicle)); - - EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), - Create(std::string("ScenarioObject2"), - testing::Matcher<const mantle_api::StaticObjectProperties&>( - StaticObjectPropertiesEqualTo(static_object_properties)))) - .Times(1) - .WillRepeatedly(testing::ReturnRef(mock_static_object)); - - EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), - Create(std::string("ScenarioObject1"), pedestrian_properties)) - .Times(1) - .WillRepeatedly(testing::ReturnRef(mock_pedestrian)); - - EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), - Create(std::string("Ego"), ego_properties)) - .Times(1) - .WillRepeatedly(testing::ReturnRef(mock_vehicle)); - - for (auto&& scenario_object : - scenario_ptr_->GetOpenScenarioCategory()->GetScenarioDefinition()->GetEntities()->GetScenarioObjects()) - { - entity_creator.CreateEntity(scenario_object); - } + std::string xosc_file_path{GetScenariosPath(test_info_->file()) + "test_entities_valid.xosc"}; + LoadScenario(xosc_file_path); + OpenScenarioEngine::v1_3::EntityCreator entity_creator(env_); + + std::shared_ptr<mantle_api::MockVehicle> mock_vehicle{std::make_shared<mantle_api::MockVehicle>()}; + std::shared_ptr<mantle_api::MockPedestrian> mock_pedestrian{std::make_shared<mantle_api::MockPedestrian>()}; + std::shared_ptr<mantle_api::MockStaticObject> mock_static_object{std::make_shared<mantle_api::MockStaticObject>()}; + + mantle_api::VehicleProperties vehicle_properties{}; + vehicle_properties.type = mantle_api::EntityType::kVehicle; + vehicle_properties.classification = mantle_api::VehicleClass::kMotorcycle; + vehicle_properties.model = "motorbike"; + vehicle_properties.bounding_box.dimension.length = 5.0_m; + vehicle_properties.bounding_box.dimension.width = 2.0_m; + vehicle_properties.bounding_box.dimension.height = 1.8_m; + vehicle_properties.bounding_box.geometric_center.x = 1.4_m; + vehicle_properties.bounding_box.geometric_center.y = 0.0_m; + vehicle_properties.bounding_box.geometric_center.z = 0.9_m; + vehicle_properties.performance.max_acceleration = 10_mps_sq; + vehicle_properties.performance.max_deceleration = 10_mps_sq; + vehicle_properties.performance.max_speed = 70_mps; + vehicle_properties.front_axle.bb_center_to_axle_center = {1.58_m, 0.0_m, -0.5_m}; + vehicle_properties.front_axle.max_steering = 0.5_rad; + vehicle_properties.front_axle.track_width = 1.68_m; + vehicle_properties.front_axle.wheel_diameter = 0.8_m; + vehicle_properties.rear_axle.bb_center_to_axle_center = {-1.40_m, 0.0_m, -0.5_m}; + vehicle_properties.rear_axle.max_steering = 0_rad; + vehicle_properties.rear_axle.track_width = 1.68_m; + vehicle_properties.rear_axle.wheel_diameter = 0.8_m; + + mantle_api::VehicleProperties ego_properties{vehicle_properties}; + ego_properties.classification = mantle_api::VehicleClass::kMediumCar; + ego_properties.model = "medium_car"; + ego_properties.is_host = true; + ego_properties.properties.emplace("custom_property", "5"); + + mantle_api::VehicleProperties wheelchair_properties{}; + wheelchair_properties.type = mantle_api::EntityType::kVehicle; + wheelchair_properties.classification = mantle_api::VehicleClass::kWheelchair; + wheelchair_properties.bounding_box.dimension.length = 0.7_m; + wheelchair_properties.bounding_box.dimension.width = 0.7_m; + wheelchair_properties.bounding_box.dimension.height = 1.3_m; + wheelchair_properties.bounding_box.geometric_center.x = 0.35_m; + wheelchair_properties.bounding_box.geometric_center.y = 0.0_m; + wheelchair_properties.bounding_box.geometric_center.z = 0.65_m; + + mantle_api::PedestrianProperties pedestrian_properties{}; + pedestrian_properties.type = mantle_api::EntityType::kPedestrian; + pedestrian_properties.model = "male"; + pedestrian_properties.bounding_box.dimension.length = 0.3_m; + pedestrian_properties.bounding_box.dimension.width = 0.5_m; + pedestrian_properties.bounding_box.dimension.height = 1.8_m; + pedestrian_properties.bounding_box.geometric_center.x = 0.15_m; + pedestrian_properties.bounding_box.geometric_center.y = 0.0_m; + pedestrian_properties.bounding_box.geometric_center.z = 0.9_m; + + mantle_api::PedestrianProperties animal_properties{}; + animal_properties.type = mantle_api::EntityType::kAnimal; + animal_properties.model = "Deer.gltf"; + animal_properties.bounding_box.dimension.length = 1.5_m; + animal_properties.bounding_box.dimension.width = 0.5_m; + animal_properties.bounding_box.dimension.height = 1.1_m; + animal_properties.bounding_box.geometric_center.x = 0.75_m; + animal_properties.bounding_box.geometric_center.y = 0.0_m; + animal_properties.bounding_box.geometric_center.z = 0.55_m; + + mantle_api::StaticObjectProperties static_object_properties{}; + static_object_properties.type = mantle_api::EntityType::kStatic; + static_object_properties.static_object_type = mantle_api::StaticObjectType::kOther; + static_object_properties.model = "pylon"; + static_object_properties.vertical_offset = 0.5_m; + static_object_properties.bounding_box.dimension.length = 1.0_m; + static_object_properties.bounding_box.dimension.width = 1.0_m; + static_object_properties.bounding_box.dimension.height = 1.0_m; + static_object_properties.bounding_box.geometric_center.x = 0.5_m; + static_object_properties.bounding_box.geometric_center.y = 0.0_m; + static_object_properties.bounding_box.geometric_center.z = 0.5_m; + + EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), + Create(std::string("ScenarioObject6"), + testing::Matcher<const mantle_api::StaticObjectProperties&>( + StaticObjectPropertiesEqualTo(static_object_properties)))) + .Times(1) + .WillRepeatedly(testing::Return(mock_static_object)); + + EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), + Create(std::string("ScenarioObject5"), wheelchair_properties)) + .Times(1) + .WillRepeatedly(testing::Return(mock_vehicle)); + + EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), + Create(std::string("ScenarioObject4"), animal_properties)) + .Times(1) + .WillRepeatedly(testing::Return(mock_pedestrian)); + + EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), + Create(std::string("ScenarioObject3"), vehicle_properties)) + .Times(1) + .WillRepeatedly(testing::Return(mock_vehicle)); + + EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), + Create(std::string("ScenarioObject2"), + testing::Matcher<const mantle_api::StaticObjectProperties&>( + StaticObjectPropertiesEqualTo(static_object_properties)))) + .Times(1) + .WillRepeatedly(testing::Return(mock_static_object)); + + EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), + Create(std::string("ScenarioObject1"), pedestrian_properties)) + .Times(1) + .WillRepeatedly(testing::Return(mock_pedestrian)); + + EXPECT_CALL(dynamic_cast<mantle_api::MockEntityRepository&>(env_->GetEntityRepository()), + Create(std::string("Ego"), ego_properties)) + .Times(1) + .WillRepeatedly(testing::Return(mock_vehicle)); + + for (auto&& scenario_object : + scenario_ptr_->GetOpenScenarioCategory()->GetScenarioDefinition()->GetEntities()->GetScenarioObjects()) + { + entity_creator.CreateEntity(scenario_object); + } } diff --git a/engine/tests/Utils/EntityUtilsTest.cpp b/engine/tests/Utils/EntityUtilsTest.cpp index 9f0de49e4fd1cc384cced61d7c74c9d736b77bef..fc556de936b111c1bceee3d81d51b40f6d8a1927 100644 --- a/engine/tests/Utils/EntityUtilsTest.cpp +++ b/engine/tests/Utils/EntityUtilsTest.cpp @@ -17,339 +17,340 @@ #include "Utils/EntityUtils.h" using namespace OpenScenarioEngine::v1_3; +using namespace testing::OpenScenarioEngine::v1_3; using testing::OpenScenarioEngine::v1_3::OpenScenarioEngineLibraryTestBase; using namespace units::literals; class EntityUtilsTestFixture : public OpenScenarioEngineLibraryTestBase { - protected: - void SetUp() override - { - OpenScenarioEngineLibraryTestBase::SetUp(); - LOGGER = std::make_unique<testing::OpenScenarioEngine::v1_3::TestLogger>(); - } - std::unique_ptr<testing::OpenScenarioEngine::v1_3::TestLogger> LOGGER; +protected: + void SetUp() override + { + OpenScenarioEngineLibraryTestBase::SetUp(); + LOGGER = std::make_unique<testing::OpenScenarioEngine::v1_3::TestLogger>(); + } + std::unique_ptr<testing::OpenScenarioEngine::v1_3::TestLogger> LOGGER; }; TEST_F(EntityUtilsTestFixture, GivenTwoEntitiesAt7metersDistance_WhenCalculateLongitudinalFreeSpaceDistance_ThenDistanceBetweenIsCalculated) { - mantle_api::MockVehicle master_vehicle_mock{}; - mantle_api::MockVehicle reference_vehicle_mock{}; + FakeVehicle master_vehicle_mock{}; + FakeVehicle reference_vehicle_mock{}; - mantle_api::VehicleProperties properties{}; - properties.bounding_box.dimension.length = 5.0_m; - properties.bounding_box.dimension.width = 2.0_m; - properties.bounding_box.dimension.height = 1.8_m; - properties.bounding_box.geometric_center.x = 1.4_m; - properties.bounding_box.geometric_center.y = 0.0_m; - properties.bounding_box.geometric_center.z = 0.9_m; + mantle_api::VehicleProperties properties{}; + properties.bounding_box.dimension.length = 5.0_m; + properties.bounding_box.dimension.width = 2.0_m; + properties.bounding_box.dimension.height = 1.8_m; + properties.bounding_box.geometric_center.x = 1.4_m; + properties.bounding_box.geometric_center.y = 0.0_m; + properties.bounding_box.geometric_center.z = 0.9_m; - auto master_vehicle_properties = std::make_unique<mantle_api::EntityProperties>(properties); - auto reference_vehicle_properties = std::make_unique<mantle_api::EntityProperties>(properties); + auto master_vehicle_properties = std::make_unique<mantle_api::VehicleProperties>(properties); + auto reference_vehicle_properties = std::make_unique<mantle_api::VehicleProperties>(properties); - master_vehicle_mock.SetProperties(std::move(master_vehicle_properties)); - reference_vehicle_mock.SetProperties(std::move(reference_vehicle_properties)); + master_vehicle_mock.SetProperties(std::move(master_vehicle_properties)); + reference_vehicle_mock.SetProperties(std::move(reference_vehicle_properties)); - EXPECT_CALL(master_vehicle_mock, GetPosition()) - .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m})); + EXPECT_CALL(master_vehicle_mock, GetPosition()) + .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m})); - EXPECT_CALL(master_vehicle_mock, GetOrientation()) - .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); + EXPECT_CALL(master_vehicle_mock, GetOrientation()) + .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); - EXPECT_CALL(reference_vehicle_mock, GetPosition()) - .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{10_m, 0_m, 0_m})); + EXPECT_CALL(reference_vehicle_mock, GetPosition()) + .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{10_m, 0_m, 0_m})); - EXPECT_CALL(reference_vehicle_mock, GetOrientation()) - .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); + EXPECT_CALL(reference_vehicle_mock, GetOrientation()) + .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); - const mantle_api::Vec3<units::length::meter_t> mock_position_reference{10_m, 0_m, 0_m}; + const mantle_api::Vec3<units::length::meter_t> mock_position_reference{10_m, 0_m, 0_m}; - EXPECT_CALL(dynamic_cast<const mantle_api::MockGeometryHelper&>(*(env_->GetGeometryHelper())), - TranslateGlobalPositionLocally( - reference_vehicle_mock.GetPosition(), reference_vehicle_mock.GetOrientation(), testing::_)) - .WillRepeatedly(testing::Return(mock_position_reference)); + EXPECT_CALL(dynamic_cast<const mantle_api::MockGeometryHelper&>(*(env_->GetGeometryHelper())), + TranslateGlobalPositionLocally( + reference_vehicle_mock.GetPosition(), reference_vehicle_mock.GetOrientation(), testing::_)) + .WillRepeatedly(testing::Return(mock_position_reference)); - auto expected_distance = 7.5_m; - auto actual_distance = - EntityUtils::CalculateLongitudinalFreeSpaceDistance(env_, master_vehicle_mock, reference_vehicle_mock); + auto expected_distance = 7.5_m; + auto actual_distance = + EntityUtils::CalculateLongitudinalFreeSpaceDistance(env_, master_vehicle_mock, reference_vehicle_mock); - EXPECT_EQ(expected_distance, actual_distance); + EXPECT_EQ(expected_distance, actual_distance); } TEST_F(EntityUtilsTestFixture, GivenTwoEntitiesAt5metersDistance_WhenCalculateLateralFreeSpaceDistance_ThenDistanceBetweenIsCalculated) { - mantle_api::MockVehicle master_vehicle_mock{}; - mantle_api::MockVehicle reference_vehicle_mock{}; + FakeVehicle master_vehicle_mock{}; + FakeVehicle reference_vehicle_mock{}; - mantle_api::VehicleProperties properties{}; - properties.bounding_box.dimension.length = 5.0_m; - properties.bounding_box.dimension.width = 2.0_m; - properties.bounding_box.dimension.height = 1.8_m; - properties.bounding_box.geometric_center.x = 1.4_m; - properties.bounding_box.geometric_center.y = 0.0_m; - properties.bounding_box.geometric_center.z = 0.9_m; + mantle_api::VehicleProperties properties{}; + properties.bounding_box.dimension.length = 5.0_m; + properties.bounding_box.dimension.width = 2.0_m; + properties.bounding_box.dimension.height = 1.8_m; + properties.bounding_box.geometric_center.x = 1.4_m; + properties.bounding_box.geometric_center.y = 0.0_m; + properties.bounding_box.geometric_center.z = 0.9_m; - auto master_vehicle_properties = std::make_unique<mantle_api::EntityProperties>(properties); - auto reference_vehicle_properties = std::make_unique<mantle_api::EntityProperties>(properties); + auto master_vehicle_properties = std::make_unique<mantle_api::VehicleProperties>(properties); + auto reference_vehicle_properties = std::make_unique<mantle_api::VehicleProperties>(properties); - master_vehicle_mock.SetProperties(std::move(master_vehicle_properties)); - reference_vehicle_mock.SetProperties(std::move(reference_vehicle_properties)); + master_vehicle_mock.SetProperties(std::move(master_vehicle_properties)); + reference_vehicle_mock.SetProperties(std::move(reference_vehicle_properties)); - EXPECT_CALL(master_vehicle_mock, GetPosition()) - .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m})); + EXPECT_CALL(master_vehicle_mock, GetPosition()) + .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m})); - EXPECT_CALL(master_vehicle_mock, GetOrientation()) - .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); + EXPECT_CALL(master_vehicle_mock, GetOrientation()) + .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); - EXPECT_CALL(reference_vehicle_mock, GetPosition()) - .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{10_m, 5_m, 0_m})); + EXPECT_CALL(reference_vehicle_mock, GetPosition()) + .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{10_m, 5_m, 0_m})); - EXPECT_CALL(reference_vehicle_mock, GetOrientation()) - .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_deg, 0_deg, 90_deg})); + EXPECT_CALL(reference_vehicle_mock, GetOrientation()) + .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_deg, 0_deg, 90_deg})); - const mantle_api::Vec3<units::length::meter_t> mock_position_reference{10_m, 5_m, 0_m}; + const mantle_api::Vec3<units::length::meter_t> mock_position_reference{10_m, 5_m, 0_m}; - EXPECT_CALL(dynamic_cast<const mantle_api::MockGeometryHelper&>(*(env_->GetGeometryHelper())), - TranslateGlobalPositionLocally( - reference_vehicle_mock.GetPosition(), reference_vehicle_mock.GetOrientation(), testing::_)) - .WillRepeatedly(testing::Return(mock_position_reference)); + EXPECT_CALL(dynamic_cast<const mantle_api::MockGeometryHelper&>(*(env_->GetGeometryHelper())), + TranslateGlobalPositionLocally( + reference_vehicle_mock.GetPosition(), reference_vehicle_mock.GetOrientation(), testing::_)) + .WillRepeatedly(testing::Return(mock_position_reference)); - auto expected_distance = 4.0_m; - auto actual_distance = - EntityUtils::CalculateLateralFreeSpaceDistance(env_, master_vehicle_mock, reference_vehicle_mock); + auto expected_distance = 4.0_m; + auto actual_distance = + EntityUtils::CalculateLateralFreeSpaceDistance(env_, master_vehicle_mock, reference_vehicle_mock); - EXPECT_EQ(expected_distance, actual_distance); + EXPECT_EQ(expected_distance, actual_distance); } TEST_F(EntityUtilsTestFixture, GivenTwoEntitiesLaterallyOverlapping_WhenCalculateLateralFreeSpaceDistance_ThenDistanceIsZeroAndWarningIsLogged) { - mantle_api::MockVehicle master_vehicle_mock{}; - mantle_api::MockVehicle reference_vehicle_mock{}; - - mantle_api::VehicleProperties properties{}; - properties.bounding_box.dimension.length = 5.0_m; - properties.bounding_box.dimension.width = 2.0_m; - properties.bounding_box.dimension.height = 1.8_m; - properties.bounding_box.geometric_center.x = 1.4_m; - properties.bounding_box.geometric_center.y = 0.0_m; - properties.bounding_box.geometric_center.z = 0.9_m; - - auto master_vehicle_properties = std::make_unique<mantle_api::EntityProperties>(properties); - auto reference_vehicle_properties = std::make_unique<mantle_api::EntityProperties>(properties); - - master_vehicle_mock.SetProperties(std::move(master_vehicle_properties)); - reference_vehicle_mock.SetProperties(std::move(reference_vehicle_properties)); - - EXPECT_CALL(master_vehicle_mock, GetPosition()) - .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m})); - - EXPECT_CALL(master_vehicle_mock, GetOrientation()) - .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); - - EXPECT_CALL(reference_vehicle_mock, GetPosition()) - .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{10_m, 0_m, 0_m})); - - EXPECT_CALL(reference_vehicle_mock, GetOrientation()) - .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 90_deg})); - - const mantle_api::Vec3<units::length::meter_t> mock_position_reference{10_m, 2.5_m, 0_m}; - - EXPECT_CALL(dynamic_cast<const mantle_api::MockGeometryHelper&>(*(env_->GetGeometryHelper())), - TranslateGlobalPositionLocally( - reference_vehicle_mock.GetPosition(), reference_vehicle_mock.GetOrientation(), testing::_)) - .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{11_m, -2.5_m, 0_m})) - .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{11_m, 2.5_m, 0_m})) - .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{9_m, 2.5_m, 0_m})) - .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{9_m, -2.5_m, 0_m})) - .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{11_m, -2.5_m, 1.8_m})) - .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{11_m, 2.5_m, 1.8_m})) - .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{9_m, 2.5_m, 1.8_m})) - .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{9_m, -2.5_m, 1.8_m})); - - auto expected_distance = 0.0_m; - auto actual_distance = - EntityUtils::CalculateLateralFreeSpaceDistance(env_, master_vehicle_mock, reference_vehicle_mock); - - ASSERT_EQ(expected_distance, actual_distance); - EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kWarning); - EXPECT_THAT(LOGGER->LastLogMessage(), testing::HasSubstr("Entity \"\" and \"\" are overlapping")); + FakeVehicle master_vehicle_mock{}; + FakeVehicle reference_vehicle_mock{}; + + mantle_api::VehicleProperties properties{}; + properties.bounding_box.dimension.length = 5.0_m; + properties.bounding_box.dimension.width = 2.0_m; + properties.bounding_box.dimension.height = 1.8_m; + properties.bounding_box.geometric_center.x = 1.4_m; + properties.bounding_box.geometric_center.y = 0.0_m; + properties.bounding_box.geometric_center.z = 0.9_m; + + auto master_vehicle_properties = std::make_unique<mantle_api::VehicleProperties>(properties); + auto reference_vehicle_properties = std::make_unique<mantle_api::VehicleProperties>(properties); + + master_vehicle_mock.SetProperties(std::move(master_vehicle_properties)); + reference_vehicle_mock.SetProperties(std::move(reference_vehicle_properties)); + + EXPECT_CALL(master_vehicle_mock, GetPosition()) + .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m})); + + EXPECT_CALL(master_vehicle_mock, GetOrientation()) + .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); + + EXPECT_CALL(reference_vehicle_mock, GetPosition()) + .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{10_m, 0_m, 0_m})); + + EXPECT_CALL(reference_vehicle_mock, GetOrientation()) + .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 90_deg})); + + EXPECT_CALL(dynamic_cast<const mantle_api::MockGeometryHelper&>(*(env_->GetGeometryHelper())), + TranslateGlobalPositionLocally( + reference_vehicle_mock.GetPosition(), reference_vehicle_mock.GetOrientation(), testing::_)) + .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{11_m, -2.5_m, 0_m})) + .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{11_m, 2.5_m, 0_m})) + .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{9_m, 2.5_m, 0_m})) + .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{9_m, -2.5_m, 0_m})) + .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{11_m, -2.5_m, 1.8_m})) + .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{11_m, 2.5_m, 1.8_m})) + .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{9_m, 2.5_m, 1.8_m})) + .WillOnce(testing::Return(mantle_api::Vec3<units::length::meter_t>{9_m, -2.5_m, 1.8_m})); + + auto expected_distance = 0.0_m; + auto actual_distance = + EntityUtils::CalculateLateralFreeSpaceDistance(env_, master_vehicle_mock, reference_vehicle_mock); + + ASSERT_EQ(expected_distance, actual_distance); + EXPECT_THAT(LOGGER->LastLogLevel(), mantle_api::LogLevel::kWarning); + EXPECT_THAT(LOGGER->LastLogMessage(), testing::HasSubstr("Entity \"\" and \"\" are overlapping")); } TEST_F(EntityUtilsTestFixture, GivenTwoEntitiesAt10metersDistance_WhenCalculateRelativeLongitudinalDistance_ThenDistanceBetweenIsCalculated) { - mantle_api::MockVehicle master_vehicle_mock{}; - mantle_api::MockVehicle reference_vehicle_mock{}; + FakeVehicle master_vehicle_mock{}; + FakeVehicle reference_vehicle_mock{}; - mantle_api::VehicleProperties properties{}; - properties.bounding_box.dimension.length = 5.0_m; - properties.bounding_box.dimension.width = 2.0_m; - properties.bounding_box.dimension.height = 1.8_m; - properties.bounding_box.geometric_center.x = 1.4_m; - properties.bounding_box.geometric_center.y = 0.0_m; - properties.bounding_box.geometric_center.z = 0.9_m; + mantle_api::VehicleProperties properties{}; + properties.bounding_box.dimension.length = 5.0_m; + properties.bounding_box.dimension.width = 2.0_m; + properties.bounding_box.dimension.height = 1.8_m; + properties.bounding_box.geometric_center.x = 1.4_m; + properties.bounding_box.geometric_center.y = 0.0_m; + properties.bounding_box.geometric_center.z = 0.9_m; - auto master_vehicle_properties = std::make_unique<mantle_api::EntityProperties>(properties); - auto reference_vehicle_properties = std::make_unique<mantle_api::EntityProperties>(properties); + auto master_vehicle_properties = std::make_unique<mantle_api::VehicleProperties>(properties); + auto reference_vehicle_properties = std::make_unique<mantle_api::VehicleProperties>(properties); - master_vehicle_mock.SetProperties(std::move(master_vehicle_properties)); - reference_vehicle_mock.SetProperties(std::move(reference_vehicle_properties)); + master_vehicle_mock.SetProperties(std::move(master_vehicle_properties)); + reference_vehicle_mock.SetProperties(std::move(reference_vehicle_properties)); - EXPECT_CALL(master_vehicle_mock, GetPosition()) - .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m})); + EXPECT_CALL(master_vehicle_mock, GetPosition()) + .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m})); - EXPECT_CALL(master_vehicle_mock, GetOrientation()) - .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); + EXPECT_CALL(master_vehicle_mock, GetOrientation()) + .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); - EXPECT_CALL(reference_vehicle_mock, GetPosition()) - .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{10_m, 0_m, 0_m})); + EXPECT_CALL(reference_vehicle_mock, GetPosition()) + .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{10_m, 0_m, 0_m})); - EXPECT_CALL(reference_vehicle_mock, GetOrientation()) - .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); + EXPECT_CALL(reference_vehicle_mock, GetOrientation()) + .WillRepeatedly(::testing::Return(mantle_api::Orientation3<units::angle::radian_t>{0_rad, 0_rad, 0_rad})); - const mantle_api::Vec3<units::length::meter_t> mock_position_reference{10_m, 0_m, 0_m}; - const mantle_api::Vec3<units::length::meter_t> mock_position_master{0_m, 0_m, 0_m}; + const mantle_api::Vec3<units::length::meter_t> mock_position_reference{10_m, 0_m, 0_m}; + const mantle_api::Vec3<units::length::meter_t> mock_position_master{0_m, 0_m, 0_m}; - EXPECT_CALL(dynamic_cast<const mantle_api::MockGeometryHelper&>(*(env_->GetGeometryHelper())), - TranslateGlobalPositionLocally(testing::_, testing::_, testing::_)) - .WillOnce(testing::Return(mock_position_master)) - .WillOnce(testing::Return(mock_position_reference)); + EXPECT_CALL(dynamic_cast<const mantle_api::MockGeometryHelper&>(*(env_->GetGeometryHelper())), + TranslateGlobalPositionLocally(testing::_, testing::_, testing::_)) + .WillOnce(testing::Return(mock_position_master)) + .WillOnce(testing::Return(mock_position_reference)); - auto expected_distance = 10_m; - auto actual_distance = - EntityUtils::CalculateRelativeLongitudinalDistance(env_, master_vehicle_mock, reference_vehicle_mock); + auto expected_distance = 10_m; + auto actual_distance = + EntityUtils::CalculateRelativeLongitudinalDistance(env_, master_vehicle_mock, reference_vehicle_mock); - EXPECT_EQ(expected_distance, actual_distance); + EXPECT_EQ(expected_distance, actual_distance); } TEST_F(EntityUtilsTestFixture, GivenTwoEntitiesAt10metersDistance_WhenGetBoundingBoxCornerPoints_ThenReturnObjectCornerPointsOfTheEntity) { - mantle_api::MockVehicle vehicle_mock{}; - - mantle_api::VehicleProperties properties{}; - properties.bounding_box.dimension.length = 5.0_m; - properties.bounding_box.dimension.width = 2.0_m; - properties.bounding_box.dimension.height = 1.8_m; - properties.bounding_box.geometric_center.x = 1.4_m; - properties.bounding_box.geometric_center.y = 0.0_m; - properties.bounding_box.geometric_center.z = 0.9_m; - - auto master_vehicle_properties = std::make_unique<mantle_api::EntityProperties>(properties); - vehicle_mock.SetProperties(std::move(master_vehicle_properties)); - - auto actual_corner_points = EntityUtils::GetBoundingBoxCornerPoints(vehicle_mock); - - std::vector<mantle_api::Vec3<units::length::meter_t>> expected_corner_points{ - {2.5_m, 1_m, -0.9_m}, - {2.5_m, -1_m, -0.9_m}, - {2.5_m, 1_m, 0.9_m}, - {2.5_m, -1_m, 0.9_m}, - {-2.5_m, 1_m, -0.9_m}, - {-2.5_m, -1_m, -0.9_m}, - {-2.5_m, 1_m, 0.9_m}, - {-2.5_m, -1_m, 0.9_m}, - }; - EXPECT_EQ(expected_corner_points.size(), actual_corner_points.size()); - - for (std::size_t i = 0; i < expected_corner_points.size(); i++) - { - EXPECT_EQ(expected_corner_points[i], actual_corner_points[i]); - } + FakeVehicle vehicle_mock{}; + + mantle_api::VehicleProperties properties{}; + properties.bounding_box.dimension.length = 5.0_m; + properties.bounding_box.dimension.width = 2.0_m; + properties.bounding_box.dimension.height = 1.8_m; + properties.bounding_box.geometric_center.x = 1.4_m; + properties.bounding_box.geometric_center.y = 0.0_m; + properties.bounding_box.geometric_center.z = 0.9_m; + + auto master_vehicle_properties = std::make_unique<mantle_api::VehicleProperties>(properties); + vehicle_mock.SetProperties(std::move(master_vehicle_properties)); + + auto actual_corner_points = EntityUtils::GetBoundingBoxCornerPoints(vehicle_mock); + + std::vector<mantle_api::Vec3<units::length::meter_t>> expected_corner_points{ + {2.5_m, 1_m, -0.9_m}, + {2.5_m, -1_m, -0.9_m}, + {2.5_m, 1_m, 0.9_m}, + {2.5_m, -1_m, 0.9_m}, + {-2.5_m, 1_m, -0.9_m}, + {-2.5_m, -1_m, -0.9_m}, + {-2.5_m, 1_m, 0.9_m}, + {-2.5_m, -1_m, 0.9_m}, + }; + EXPECT_EQ(expected_corner_points.size(), actual_corner_points.size()); + + for (std::size_t i = 0; i < expected_corner_points.size(); i++) + { + EXPECT_EQ(expected_corner_points[i], actual_corner_points[i]); + } } TEST_F( EntityUtilsTestFixture, GivenTwoEntitiesAt10metersDistance_WhenGetBoundingBoxCornerPointsInGlobal_ThenReturnGlobalObjectCornerPointsOfTheEntity) { - const mantle_api::Vec3<units::length::meter_t> position{10_m, 0_m, 0_m}; - const mantle_api::Orientation3<units::angle::radian_t> orientation{0_rad, 0_rad, 0_rad}; - - std::vector<mantle_api::Vec3<units::length::meter_t>> local_corner_points{ - {1_m, 1_m, -1_m}, - {1_m, -1_m, -1_m}, - {1_m, 1_m, 1_m}, - {1_m, -1_m, 1_m}, - {-1_m, 1_m, -1_m}, - {-1_m, -1_m, -1_m}, - {-1_m, 1_m, 1_m}, - {-1_m, -1_m, 1_m}, - }; - - EXPECT_CALL(dynamic_cast<const mantle_api::MockGeometryHelper&>(*(env_->GetGeometryHelper())), - TranslateGlobalPositionLocally(position, orientation, testing::_)) - .WillRepeatedly(testing::Return(position)); - auto actual_global_corner_points = - EntityUtils::GetBoundingBoxCornerPointsInGlobal(env_, position, orientation, local_corner_points); - - EXPECT_EQ(local_corner_points.size(), actual_global_corner_points.size()); - - for (std::size_t i = 0; i < actual_global_corner_points.size(); i++) - { - EXPECT_EQ(position, actual_global_corner_points[i]); - } + const mantle_api::Vec3<units::length::meter_t> position{10_m, 0_m, 0_m}; + const mantle_api::Orientation3<units::angle::radian_t> orientation{0_rad, 0_rad, 0_rad}; + + std::vector<mantle_api::Vec3<units::length::meter_t>> local_corner_points{ + {1_m, 1_m, -1_m}, + {1_m, -1_m, -1_m}, + {1_m, 1_m, 1_m}, + {1_m, -1_m, 1_m}, + {-1_m, 1_m, -1_m}, + {-1_m, -1_m, -1_m}, + {-1_m, 1_m, 1_m}, + {-1_m, -1_m, 1_m}, + }; + + EXPECT_CALL(dynamic_cast<const mantle_api::MockGeometryHelper&>(*(env_->GetGeometryHelper())), + TranslateGlobalPositionLocally(position, orientation, testing::_)) + .WillRepeatedly(testing::Return(position)); + auto actual_global_corner_points = + EntityUtils::GetBoundingBoxCornerPointsInGlobal(env_, position, orientation, local_corner_points); + + EXPECT_EQ(local_corner_points.size(), actual_global_corner_points.size()); + + for (std::size_t i = 0; i < actual_global_corner_points.size(); i++) + { + EXPECT_EQ(position, actual_global_corner_points[i]); + } } TEST_F( EntityUtilsTestFixture, GivenEntityAndEnvironment_WhenGetCornerPositionsInGlobalSortedByLongitudinalDistanceInLaneDirection_ThenReturnCornerPositionInCorrectOrder) { - auto& mocked_entity = dynamic_cast<mantle_api::MockVehicle&>(env_->GetEntityRepository().Get("").value().get()); - auto& mocked_geo_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*(env_->GetGeometryHelper())); + auto& mocked_entity = dynamic_cast<mantle_api::MockVehicle&>(*env_->GetEntityRepository().Get("").lock()); + auto& mocked_geo_helper = dynamic_cast<const mantle_api::MockGeometryHelper&>(*(env_->GetGeometryHelper())); - const auto headmost_corner = mantle_api::Vec3<units::length::meter_t>{3.0_m, 0_m, 0_m}; - const auto rearmost_corner = mantle_api::Vec3<units::length::meter_t>{-1.0_m, 0_m, 0_m}; + const auto headmost_corner = mantle_api::Vec3<units::length::meter_t>{3.0_m, 0_m, 0_m}; + const auto rearmost_corner = mantle_api::Vec3<units::length::meter_t>{-1.0_m, 0_m, 0_m}; - const auto other_corner = mantle_api::Vec3<units::length::meter_t>{0.0_m, 0_m, 0_m}; + const auto other_corner = mantle_api::Vec3<units::length::meter_t>{0.0_m, 0_m, 0_m}; - const auto entity_position = mantle_api::Vec3<units::length::meter_t>{2.0_m, 2.1_m, 0_m}; - const auto entity_orientation = mantle_api::Orientation3<units::angle::radian_t>{2.2_rad, 2.3_rad, 0_rad}; - EXPECT_CALL(mocked_entity, GetPosition()).WillOnce(testing::Return(entity_position)); - EXPECT_CALL(mocked_entity, GetOrientation()).WillOnce(testing::Return(entity_orientation)); + const auto entity_position = mantle_api::Vec3<units::length::meter_t>{2.0_m, 2.1_m, 0_m}; + const auto entity_orientation = mantle_api::Orientation3<units::angle::radian_t>{2.2_rad, 2.3_rad, 0_rad}; + EXPECT_CALL(mocked_entity, GetPosition()).WillOnce(testing::Return(entity_position)); + EXPECT_CALL(mocked_entity, GetOrientation()).WillOnce(testing::Return(entity_orientation)); - EXPECT_CALL(mocked_geo_helper, TranslateGlobalPositionLocally(entity_position, entity_orientation, testing::_)) - .Times(8) - .WillOnce(::testing::Return(headmost_corner)) - .WillOnce(::testing::Return(rearmost_corner)) - .WillRepeatedly(::testing::Return(other_corner)); + EXPECT_CALL(mocked_geo_helper, TranslateGlobalPositionLocally(entity_position, entity_orientation, testing::_)) + .Times(8) + .WillOnce(::testing::Return(headmost_corner)) + .WillOnce(::testing::Return(rearmost_corner)) + .WillRepeatedly(::testing::Return(other_corner)); - const auto local_origin = mantle_api::Vec3<units::length::meter_t>{1.0_m, 1.1_m, 0_m}; - const auto local_orientation = mantle_api::Orientation3<units::angle::radian_t>{1.2_rad, 1.3_rad, 0_rad}; - const auto corner_points_in_local = EntityUtils::GetCornerPositionsInLocalSortedByLongitudinalDistance( - env_, mocked_entity, local_origin, local_orientation); + const auto local_origin = mantle_api::Vec3<units::length::meter_t>{1.0_m, 1.1_m, 0_m}; + const auto local_orientation = mantle_api::Orientation3<units::angle::radian_t>{1.2_rad, 1.3_rad, 0_rad}; + const auto corner_points_in_local = EntityUtils::GetCornerPositionsInLocalSortedByLongitudinalDistance( + env_, mocked_entity, local_origin, local_orientation); - EXPECT_EQ(corner_points_in_local.size(), 8); // 8 corners - EXPECT_EQ(corner_points_in_local.front(), rearmost_corner); - EXPECT_EQ(corner_points_in_local.back(), headmost_corner); + EXPECT_EQ(corner_points_in_local.size(), 8); // 8 corners + EXPECT_EQ(corner_points_in_local.front(), rearmost_corner); + EXPECT_EQ(corner_points_in_local.back(), headmost_corner); } TEST_F( EntityUtilsTestFixture, GivenEntityAndEnvironment_WhenRemovingEntity_ThenControllerAndEntityAreDeleted) { - std::unique_ptr<mantle_api::MockVehicle> mocked_entity; - auto mockEnvironment = std::make_shared<mantle_api::MockEnvironment>(); - auto& mockEntityRepository = static_cast<mantle_api::MockEntityRepository&>(mockEnvironment->GetEntityRepository()); + std::shared_ptr<mantle_api::MockVehicle> mocked_entity; + auto fake_environment = std::make_shared<FakeEnvironment>(); + auto& fake_entity_repository = static_cast<FakeEntityRepository&>(fake_environment->GetEntityRepository()); auto mockControllerService = std::make_shared<testing::OpenScenarioEngine::v1_3::MockControllerService>(); - auto& mockControllerRepository = static_cast<mantle_api::MockControllerRepository&>(mockEnvironment->GetControllerRepository()); + auto& mockControllerRepository = static_cast<mantle_api::MockControllerRepository&>(fake_environment->GetControllerRepository()); - std::vector<std::unique_ptr<mantle_api::IEntity>> vehicles; - ON_CALL(mockEntityRepository, GetEntities()).WillByDefault([&vehicles, &mocked_entity]() -> std::vector<std::unique_ptr<mantle_api::IEntity>>& - { - mocked_entity = std::make_unique<mantle_api::MockVehicle>(); - vehicles.emplace_back(std::move(mocked_entity)); - ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicles.back()), GetUniqueId).WillByDefault(testing::Return(1234)); + std::vector<std::shared_ptr<mantle_api::IEntity>> vehicles; + std::vector<std::weak_ptr<mantle_api::IEntity>> weak_vehicle_vec; + ON_CALL(fake_entity_repository, GetEntities()).WillByDefault([&vehicles, &mocked_entity, &weak_vehicle_vec]() -> std::vector<std::weak_ptr<mantle_api::IEntity>>& + { + mocked_entity = std::make_shared<mantle_api::MockVehicle>(); + vehicles.emplace_back(mocked_entity); + weak_vehicle_vec.push_back(std::weak_ptr<mantle_api::IEntity>(mocked_entity)); + ON_CALL(dynamic_cast<mantle_api::MockVehicle&>(*vehicles.back()), GetUniqueId).WillByDefault(testing::Return(mantle_api::UniqueId(1234))); - return vehicles; - }); + return weak_vehicle_vec; }); - ON_CALL(*mockControllerService, GetControllerIds(1234)).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{1001})); + ON_CALL(*mockControllerService, GetControllerIds(mantle_api::UniqueId(1234))).WillByDefault(testing::Return(std::vector<mantle_api::UniqueId>{mantle_api::UniqueId(1001)})); - EXPECT_CALL(mockControllerRepository, Delete(1001)); - EXPECT_CALL(mockEntityRepository, Delete(1234)).WillRepeatedly([&mocked_entity](mantle_api::UniqueId entity_id){mocked_entity.reset();}); - EntityUtils::RemoveEntity(mockEnvironment, 1234, {1001}); + EXPECT_CALL(mockControllerRepository, Delete(mantle_api::UniqueId(1001))); + EXPECT_CALL(fake_entity_repository, Delete(mantle_api::UniqueId(1234))).WillRepeatedly([&mocked_entity](mantle_api::UniqueId entity_id) + { mocked_entity.reset(); }); + EntityUtils::RemoveEntity(fake_environment, mantle_api::UniqueId(1234), {mantle_api::UniqueId(1001)}); EXPECT_FALSE(mocked_entity.get()); } diff --git a/engine/tests/data/Scenarios/Catalogs/MiscObjects/MiscObjectCatalog.xosc b/engine/tests/data/Scenarios/Catalogs/MiscObjects/MiscObjectCatalog.xosc index d5bb02e6ee6fcae7f772ce2a802fa32ab8f02080..c0b92c006b3c0fa5a97b4b482aad5523af12923e 100644 --- a/engine/tests/data/Scenarios/Catalogs/MiscObjects/MiscObjectCatalog.xosc +++ b/engine/tests/data/Scenarios/Catalogs/MiscObjects/MiscObjectCatalog.xosc @@ -12,4 +12,4 @@ </Properties> </MiscObject> </Catalog> -</OpenSCENARIO> \ No newline at end of file +</OpenSCENARIO> diff --git a/engine/tests/data/Scenarios/Catalogs/Vehicles/VehicleCatalog.xosc b/engine/tests/data/Scenarios/Catalogs/Vehicles/VehicleCatalog.xosc index ccf99478ea177f0deb705c6f714cffa66725eb1a..6b51c61fe70074905c81ec760f553cfb2c93e6ec 100644 --- a/engine/tests/data/Scenarios/Catalogs/Vehicles/VehicleCatalog.xosc +++ b/engine/tests/data/Scenarios/Catalogs/Vehicles/VehicleCatalog.xosc @@ -23,7 +23,7 @@ </BoundingBox> <Performance maxSpeed="70" maxDeceleration="10" maxAcceleration="10" /> <Axles> - <FrontAxle maxSteering="0.5" wheelDiameter="0.8" trackWidth="1.68" positionX="2.98" positionZ="0.4" /> + <FrontAxle maxSteering="0.5" wheelDiameter="0.8" trackWidth="1.68" positionX="2.98" positionZ="0.4" /> <RearAxle maxSteering="0" wheelDiameter="0.8" trackWidth="1.68" positionX="0" positionZ="0.4" /> </Axles> <Properties></Properties> diff --git a/engine/tests/data/Scenarios/test_entities_valid.xosc b/engine/tests/data/Scenarios/test_entities_valid.xosc index 07f3c6a925e14ce1d82da8c3b744c618f565a256..f1d7016c3916aac889137236cb3efdeb3b694945 100644 --- a/engine/tests/data/Scenarios/test_entities_valid.xosc +++ b/engine/tests/data/Scenarios/test_entities_valid.xosc @@ -69,6 +69,9 @@ <Center x="0.5" y="0.0" z="0.5" /> <Dimensions width="1.0" length="1.0" height="1.0" /> </BoundingBox> + <Properties> + <Property name="mount_height" value="0.5"/> + </Properties> </MiscObject> </ScenarioObject> </Entities> diff --git a/engine/third_party/mantle_api/mantle_api.bzl b/engine/third_party/mantle_api/mantle_api.bzl index 107b3d4e61dea7c8983b4f11c86d1af725437215..02a4359676fc9cefea26e66b3e5bbc55a5655faa 100644 --- a/engine/third_party/mantle_api/mantle_api.bzl +++ b/engine/third_party/mantle_api/mantle_api.bzl @@ -1,14 +1,14 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") -_TAG = "v14.0.0" +_TAG = "prepare_integration_of_v9" def mantle_api(): maybe( http_archive, name = "mantle_api", url = "https://gitlab.eclipse.org/eclipse/openpass/mantle-api/-/archive/{tag}/mantle-api-{tag}.tar.gz".format(tag = _TAG), - sha256 = "3cb1aa0dd479a4bb457b3aaa59615f27f84a8ea7d9815f03f23ca7893e063583", + sha256 = "82fe6287474b48b9960d80bf6ac509cbe007472a6d68b49ab9068b6e8b7ec241", strip_prefix = "mantle-api-{tag}".format(tag = _TAG), type = "tar.gz", ) diff --git a/utils/ci/conan/conanfile.txt b/utils/ci/conan/conanfile.txt index 2cd59264a312b987d035dff89046a1b764f15989..6cc2ec133b628754af304f9eb860766180c7a1ab 100644 --- a/utils/ci/conan/conanfile.txt +++ b/utils/ci/conan/conanfile.txt @@ -1,6 +1,6 @@ [requires] units/2.3.4@openscenarioengine/testing -mantleapi/v14.0.0@openscenarioengine/testing +mantleapi/prepare_integration_of_v9@openscenarioengine/testing yase/d0c0e58d17358044cc9018c74308b45f6097ecfb@openscenarioengine/testing openscenario_api/v1.4.0@openscenarioengine/testing stochastics/0.11.0@openscenarioengine/testing diff --git a/utils/ci/conan/recipe/mantleapi/all/conandata.yml b/utils/ci/conan/recipe/mantleapi/all/conandata.yml index 6bd5d1be36147e7ec256931e305f5a0a64135524..b1e3f44c9137d3213dd6373836ca5856d375e1d2 100644 --- a/utils/ci/conan/recipe/mantleapi/all/conandata.yml +++ b/utils/ci/conan/recipe/mantleapi/all/conandata.yml @@ -61,5 +61,9 @@ sources: url: https://gitlab.eclipse.org/eclipse/openpass/mantle-api.git sha256: "5541bf1ab65333cf791739bd9d7296837cdf5381" + "prepare_integration_of_v9": + url: https://gitlab.eclipse.org/eclipse/openpass/mantle-api.git + sha256: "ed710922db6a9dddd7f536958cbfe89bfe49ebec" + "default": url: https://gitlab.eclipse.org/eclipse/openpass/mantle-api.git