From 143f35b19deb435e5adf1fa65685ca9a338e8a48 Mon Sep 17 00:00:00 2001
From: Andreas Rauschert <andreas.rb.rauschert@bmw.de>
Date: Fri, 10 Nov 2023 16:12:02 +0000
Subject: [PATCH] fix: set environment defaults before initializing environment
 and don't stop creating controllers on non-controllable entities

---
 engine/src/OpenScenarioEngine.cpp            |  7 ++++---
 engine/src/Utils/ControllerCreator.cpp       |  2 +-
 engine/tests/OpenScenarioEngineTest.cpp      |  8 ++++++--
 engine/tests/Utils/ControllerCreatorTest.cpp | 11 +++++++++++
 4 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/engine/src/OpenScenarioEngine.cpp b/engine/src/OpenScenarioEngine.cpp
index fd160301..b1ffd41a 100644
--- a/engine/src/OpenScenarioEngine.cpp
+++ b/engine/src/OpenScenarioEngine.cpp
@@ -95,6 +95,8 @@ void OpenScenarioEngine::Init()
 
   controller_creator_->GetControllerService()->ResetControllerMappings();
 
+  SetEnvironmentDefaults();
+
   ParseScenarioFile();
 
   LoadRoadNetwork();
@@ -104,8 +106,6 @@ void OpenScenarioEngine::Init()
   CreateControllers();
 
   CreateAndInitStoryboard();
-
-  SetEnvironmentDefaults();
 }
 
 mantle_api::ScenarioInfo OpenScenarioEngine::GetScenarioInfo() const
@@ -333,7 +333,8 @@ mantle_api::Time OpenScenarioEngine::GetDuration() const
   for (const auto& condition_group : condition_groups)
   {
     auto conditions = condition_group->GetConditions();
-    std::for_each(conditions.begin(), conditions.end(), [&durations](const auto& condition) {
+    std::for_each(conditions.begin(), conditions.end(), [&durations](const auto& condition)
+                  {
             if (const auto& by_val_condition = condition->GetByValueCondition())
             {
                 if (const auto& sim_time_condition = by_val_condition->GetSimulationTimeCondition())
diff --git a/engine/src/Utils/ControllerCreator.cpp b/engine/src/Utils/ControllerCreator.cpp
index 1b013312..540dc1e2 100644
--- a/engine/src/Utils/ControllerCreator.cpp
+++ b/engine/src/Utils/ControllerCreator.cpp
@@ -136,7 +136,7 @@ void ControllerCreator::CreateControllers(const std::vector<std::shared_ptr<NET_
     if (detail::IsNotControllable(scenario_object))
     {
       Logger::Info("ControllerCreator: No controller created for non-vehicle and non-pedestrian type scenario object \"" + entity_name + "\"");
-      return;
+      continue;
     }
 
     const auto entity = environment_.GetEntityRepository().Get(entity_name);
diff --git a/engine/tests/OpenScenarioEngineTest.cpp b/engine/tests/OpenScenarioEngineTest.cpp
index b28445c3..baa8fdfa 100644
--- a/engine/tests/OpenScenarioEngineTest.cpp
+++ b/engine/tests/OpenScenarioEngineTest.cpp
@@ -46,11 +46,15 @@ class OpenScenarioEngineTest : public OpenScenarioEngineTestBase
     std::string controller_name {"TestController"s};
 };
 
-TEST_F(OpenScenarioEngineTest, GivenValidScenarioFile_WhenInitialized_ThenDefaultRoutingBehaviourIsSetToRandom)
+TEST_F(OpenScenarioEngineTest, GivenValidScenarioFile_WhenInitialized_ThenDefaultRoutingBehaviourIsSetBeforeControllersAreCreated)
 {
     std::string xosc_file_path{GetScenariosPath(test_info_->file()) + default_xosc_scenario_};
 
-    EXPECT_CALL(*env_, SetDefaultRoutingBehavior(mantle_api::DefaultRoutingBehavior::kRandomRoute)).Times(1);
+    {
+        testing::InSequence s;
+        EXPECT_CALL(*env_, SetDefaultRoutingBehavior(mantle_api::DefaultRoutingBehavior::kRandomRoute)).Times(1);
+        EXPECT_CALL(env_->GetControllerRepository(), Create(_)).Times(2);
+    }
 
     OpenScenarioEngine::v1_2::OpenScenarioEngine engine(xosc_file_path, env_);
 
diff --git a/engine/tests/Utils/ControllerCreatorTest.cpp b/engine/tests/Utils/ControllerCreatorTest.cpp
index b56659c9..3273dee9 100644
--- a/engine/tests/Utils/ControllerCreatorTest.cpp
+++ b/engine/tests/Utils/ControllerCreatorTest.cpp
@@ -144,6 +144,17 @@ TEST_F(ControllerCreator, GivenUncontrollableScenarioObject_WhenCreateIsCalled_T
   EXPECT_THAT(LOGGER->LastLogMessage(), HasSubstr("test_entity"));
 }
 
+TEST_F(ControllerCreator, GivenUncontrollableAndControllableScenarioObject_WhenCreateIsCalled_ThenControllerOnlyForControllableObjectIsCreated)
+{
+  SETUP_ENTITY("uncontrollable_entity", 1234, false, false);
+  SETUP_ENTITY("entity_2", 5678, true, false);
+
+  EXPECT_CALL(mockControllerRepository, Create(_)).Times(1).WillOnce(ReturnRef(mockController));
+  OpenScenarioEngine::v1_2::ControllerCreator controller_creator(mockEnvironment);
+
+  controller_creator.CreateControllers(scenario_objects);
+}
+
 TEST_F(ControllerCreator, GivenScenarioObjectWithController_WhenCreateIsCalled_ThenCreatesDefaultAndUserDefinedController)
 {
   SETUP_ENTITY("test_entity", 1234, true, true);
-- 
GitLab