From d28ec823e247b4a2c254544b888f8c4b50b8bb16 Mon Sep 17 00:00:00 2001
From: "ziqi.zhou" <ziqi.zhou@ansys.com>
Date: Fri, 14 Mar 2025 09:50:56 +0100
Subject: [PATCH 1/8] feat: support traveled distance condition

---
 .../TraveledDistanceCondition_impl.cpp        | 27 -----------
 .../TraveledDistanceCondition_impl.cpp        | 46 +++++++++++++++++++
 .../TraveledDistanceCondition_impl.h          | 11 ++++-
 3 files changed, 55 insertions(+), 29 deletions(-)
 delete mode 100644 engine/gen/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
 create mode 100644 engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
 rename engine/{gen => src}/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h (78%)

diff --git a/engine/gen/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp b/engine/gen/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
deleted file mode 100644
index f06cb272..00000000
--- a/engine/gen/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/********************************************************************************
- * Copyright (c) 2021-2024 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
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- ********************************************************************************/
-
-#include "Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h"
-
-#include "Utils/Logger.h"
-
-namespace OpenScenarioEngine::v1_3
-{
-
-bool TraveledDistanceCondition::IsSatisfied() const
-{
-  // Note:
-  // - Access to values parse to mantle/ose datatypes: this->values.xxx
-  // - Access to mantle interfaces: this->mantle.xxx
-  Logger::Error("Method TraveledDistanceCondition::IsSatisfied() not implemented yet (returning \"true\" by default)");
-  return true;
-}
-
-}  // namespace OpenScenarioEngine::v1_3
diff --git a/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp b/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
new file mode 100644
index 00000000..4d01bd76
--- /dev/null
+++ b/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
@@ -0,0 +1,46 @@
+/********************************************************************************
+ * Copyright (c) 2021-2024 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
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+#include "Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h"
+
+#include "Utils/Logger.h"
+
+namespace OpenScenarioEngine::v1_3
+{
+
+bool TraveledDistanceCondition::IsSatisfied()
+{
+  const auto& entity = mantle.environment->GetEntityRepository().Get(values.triggeringEntity);
+  if (!entity)
+  {
+    Logger::Warning("TraveledDistanceCondition: TraveledDistanceCondition cannot be satisfied (entity undefined).");
+    return false;
+  }
+
+  auto current_position = entity->get().GetPosition();
+
+  if (!is_initialized)
+  {
+    last_position = current_position;
+    traveled_distance = 0.0;
+    is_initialized = true;
+    return traveled_distance >= values.value;
+  }
+
+  const auto distance_delta = (current_position - last_position).Length().value();
+
+  traveled_distance += distance_delta;
+  last_position = current_position;
+
+  return traveled_distance >= values.value;
+}
+
+}  // namespace OpenScenarioEngine::v1_3
diff --git a/engine/gen/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h b/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h
similarity index 78%
rename from engine/gen/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h
rename to engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h
index b1c2f545..5ccbf9a4 100644
--- a/engine/gen/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h
+++ b/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h
@@ -1,5 +1,6 @@
 /********************************************************************************
  * Copyright (c) 2021-2024 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
@@ -10,7 +11,9 @@
 
 #pragma once
 
+#include <MantleAPI/Common/vector.h>
 #include <MantleAPI/Execution/i_environment.h>
+#include <units.h>
 
 #include "Utils/EntityBroker.h"
 
@@ -34,11 +37,15 @@ public:
       : values{std::move(values)},
         mantle{std::move(interfaces)} {};
 
-  bool IsSatisfied() const;
+  bool IsSatisfied();
 
 private:
   Values values;
   Interfaces mantle;
+
+  double traveled_distance{};
+  mantle_api::Vec3<units::length::meter_t> last_position;
+  bool is_initialized{false};
 };
 
-}  // namespace OpenScenarioEngine::v1_3
\ No newline at end of file
+}  // namespace OpenScenarioEngine::v1_3
-- 
GitLab


From ce939583114eb0b677fd2d1dc2bdfbd33dd58bd3 Mon Sep 17 00:00:00 2001
From: "ziqi.zhou" <ziqi.zhou@ansys.com>
Date: Fri, 14 Mar 2025 09:51:09 +0100
Subject: [PATCH 2/8] test: add mock tests

---
 .../TraveledDistanceConditionTest.cpp         | 83 +++++++++++++++++++
 1 file changed, 83 insertions(+)
 create mode 100644 engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp

diff --git a/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp b/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp
new file mode 100644
index 00000000..c7a79908
--- /dev/null
+++ b/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp
@@ -0,0 +1,83 @@
+/********************************************************************************
+ * 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
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+#include <MantleAPI/Test/test_utils.h>
+#include <gtest/gtest.h>
+
+#include "Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h"
+#include "TestUtils/TestLogger.h"
+
+using namespace mantle_api;
+using namespace units::literals;
+
+class TraveledDistanceConditionTestFixture : public ::testing::Test
+{
+protected:
+  void SetUp() override
+  {
+    mock_environment_ = std::make_shared<MockEnvironment>();
+  }
+
+  std::shared_ptr<MockEnvironment> mock_environment_;
+  OpenScenarioEngine::v1_3::TraveledDistanceCondition::Values condition_values_{.triggeringEntity = "vehicle1",
+                                                                                .value = 10.0};
+};
+
+TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithMockedEntities_WhenCheckingCondition_ThenDoesNotThrow)
+{
+  OpenScenarioEngine::v1_3::TraveledDistanceCondition traveled_distance_condition(condition_values_,
+                                                                                  {mock_environment_});
+
+  EXPECT_NO_THROW([[maybe_unused]] auto _ = traveled_distance_condition.IsSatisfied());
+}
+
+TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithNoMovement_WhenCheckingCondition_ThenReturnsFalse)
+{
+  OpenScenarioEngine::v1_3::TraveledDistanceCondition traveled_distance_condition(condition_values_,
+                                                                                  {mock_environment_});
+
+  EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(mock_environment_->GetEntityRepository().Get(condition_values_.triggeringEntity).value().get()),
+              GetPosition())
+      .WillOnce(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m}));
+
+  EXPECT_FALSE(traveled_distance_condition.IsSatisfied());
+}
+
+TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithSatisfcatoryTraveledDistance_WhenCheckingCondition_ThenReturnsTrue)
+{
+  const auto moved_distance = 11.0_m;
+  OpenScenarioEngine::v1_3::TraveledDistanceCondition traveled_distance_condition(condition_values_,
+                                                                                  {mock_environment_});
+
+  EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(mock_environment_->GetEntityRepository().Get(condition_values_.triggeringEntity).value().get()),
+              GetPosition())
+      .WillOnce(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m}))
+      .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{moved_distance, 0_m, 0_m}));
+
+  EXPECT_FALSE(traveled_distance_condition.IsSatisfied());
+  // Condition is satisfied after the second call.
+  EXPECT_TRUE(traveled_distance_condition.IsSatisfied());
+}
+
+TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithUnsatisfcatoryTraveledDistance_WhenCheckingCondition_ThenReturnsFalse)
+{
+  const auto moved_distance = 5.0_m;
+  OpenScenarioEngine::v1_3::TraveledDistanceCondition traveled_distance_condition(condition_values_,
+                                                                                  {mock_environment_});
+
+  EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(mock_environment_->GetEntityRepository().Get(condition_values_.triggeringEntity).value().get()),
+              GetPosition())
+      .WillOnce(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m}))
+      .WillOnce(::testing::Return(mantle_api::Vec3<units::length::meter_t>{moved_distance, 0_m, 0_m}));
+
+  EXPECT_FALSE(traveled_distance_condition.IsSatisfied());
+  // Condition is still not satisfied after the second call.
+  EXPECT_FALSE(traveled_distance_condition.IsSatisfied());
+}
-- 
GitLab


From 4cda26e409d4bfe86ae91ea3f7f280b35c4f7865 Mon Sep 17 00:00:00 2001
From: "ziqi.zhou" <ziqi.zhou@ansys.com>
Date: Fri, 14 Mar 2025 09:51:21 +0100
Subject: [PATCH 3/8] chore: update cmake

---
 engine/CMakeLists.txt              | 9 +++++----
 engine/cmake/generated_files.cmake | 4 ++--
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt
index c6a104d6..2e937ef7 100644
--- a/engine/CMakeLists.txt
+++ b/engine/CMakeLists.txt
@@ -70,10 +70,10 @@ target_include_directories(
             $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
 )
 
-target_link_libraries(${PROJECT_NAME} PUBLIC openscenario_api::shared 
-                                             antlr4_runtime::shared 
-                                             Yase::agnostic_behavior_tree 
-                                             units::units 
+target_link_libraries(${PROJECT_NAME} PUBLIC openscenario_api::shared
+                                             antlr4_runtime::shared
+                                             Yase::agnostic_behavior_tree
+                                             units::units
                                              MantleAPI::MantleAPI
                                       PRIVATE Stochastics::Stochastics)
 
@@ -195,6 +195,7 @@ target_sources(
           ${CMAKE_CURRENT_LIST_DIR}/tests/Storyboard/ByEntityCondition/SpeedConditionTest.cpp
           ${CMAKE_CURRENT_LIST_DIR}/tests/Storyboard/ByEntityCondition/TimeHeadwayConditionTest.cpp
           ${CMAKE_CURRENT_LIST_DIR}/tests/Storyboard/ByEntityCondition/TimeToCollisionConditionTest.cpp
+          ${CMAKE_CURRENT_LIST_DIR}/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp
           ${CMAKE_CURRENT_LIST_DIR}/tests/Storyboard/ByValueCondition/SimulationTimeConditionTest.cpp
           ${CMAKE_CURRENT_LIST_DIR}/tests/Storyboard/ByValueCondition/UserDefinedValueConditionTest.cpp
           ${CMAKE_CURRENT_LIST_DIR}/tests/Storyboard/GenericAction/AcquirePositionActionTest.cpp
diff --git a/engine/cmake/generated_files.cmake b/engine/cmake/generated_files.cmake
index 20fd7859..a1d1a403 100644
--- a/engine/cmake/generated_files.cmake
+++ b/engine/cmake/generated_files.cmake
@@ -111,7 +111,6 @@ list(APPEND ${PROJECT_NAME}_SOURCES
     gen/Storyboard/ByEntityCondition/RelativeAngleCondition_impl.cpp
     gen/Storyboard/ByEntityCondition/RelativeClearanceCondition_impl.cpp
     gen/Storyboard/ByEntityCondition/StandStillCondition_impl.cpp
-    gen/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
     gen/Storyboard/ByValueCondition/ParameterCondition_impl.cpp
     gen/Storyboard/ByValueCondition/StoryboardElementStateCondition_impl.cpp
     gen/Storyboard/ByValueCondition/TimeOfDayCondition_impl.cpp
@@ -207,6 +206,7 @@ list(APPEND ${PROJECT_NAME}_SOURCES
     src/Storyboard/ByEntityCondition/SpeedCondition_impl.cpp
     src/Storyboard/ByEntityCondition/TimeHeadwayCondition_impl.cpp
     src/Storyboard/ByEntityCondition/TimeToCollisionCondition_impl.cpp
+    src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
     src/Storyboard/ByValueCondition/SimulationTimeCondition_impl.cpp
     src/Storyboard/ByValueCondition/UserDefinedValueCondition_impl.cpp
     src/Storyboard/GenericAction/AcquirePositionAction_impl.cpp
@@ -378,7 +378,6 @@ list(APPEND ${PROJECT_NAME}_HEADERS
     gen/Storyboard/ByEntityCondition/TimeHeadwayCondition_impl.h
     gen/Storyboard/ByEntityCondition/TimeToCollisionCondition.h
     gen/Storyboard/ByEntityCondition/TraveledDistanceCondition.h
-    gen/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h
     gen/Storyboard/ByValueCondition/ParameterCondition.h
     gen/Storyboard/ByValueCondition/ParameterCondition_impl.h
     gen/Storyboard/ByValueCondition/SimulationTimeCondition.h
@@ -571,6 +570,7 @@ list(APPEND ${PROJECT_NAME}_HEADERS
     src/Node/TrafficSignalPhaseNode.h
     src/Node/TriggerableCompositeNode.h
     src/Storyboard/ByEntityCondition/TimeToCollisionCondition_impl.h
+    src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h
     src/Storyboard/ByValueCondition/UserDefinedValueCondition_impl.h
     src/Storyboard/GenericAction/ActivateControllerAction.h
     src/Storyboard/GenericAction/ActivateControllerAction_base.h
-- 
GitLab


From 096944036fe304fbee8aca99a8b5d48887da0a05 Mon Sep 17 00:00:00 2001
From: "ziqi.zhou" <ziqi.zhou@ansys.com>
Date: Mon, 17 Mar 2025 10:10:45 +0100
Subject: [PATCH 4/8] docs: update readme

---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index 0484affe..a475cafc 100644
--- a/README.md
+++ b/README.md
@@ -115,6 +115,7 @@ The following Actions and Conditions of [ASAM OpenSCENARIO XML](https://publicat
 | ByEntityCondition | [SpeedCondition](https://publications.pages.asam.net/standards/ASAM_OpenSCENARIO/ASAM_OpenSCENARIO_XML/latest/generated/content/SpeedCondition.html)       | ✔️ Without direction                                                                                                   |
 | ByEntityCondition | [TimeHeadwayCondition](https://publications.pages.asam.net/standards/ASAM_OpenSCENARIO/ASAM_OpenSCENARIO_XML/latest/generated/content/TimeHeadwayCondition.html)           | Supports only `DistanceType::kEuclidean` and `CoordinateSystem::kEntity` or `CoordinateSystem::kLane`                             |
 | ByEntityCondition | [TimeToCollisionCondition](https://publications.pages.asam.net/standards/ASAM_OpenSCENARIO/ASAM_OpenSCENARIO_XML/latest/generated/content/TimeToCollisionCondition.html)   | In clarification: [Issue #7](https://gitlab.eclipse.org/eclipse/openopass/openscenario1_engine/-/issues/7) |
+| ByEntityCondition  | [TraveledDistanceCondition](https://publications.pages.asam.net/standards/ASAM_OpenSCENARIO/ASAM_OpenSCENARIO_XML/latest/generated/content/TraveledDistanceCondition.html)     | ✔️ Complete |
 | ByValueCondition  | [SimulationTimeCondition](https://publications.pages.asam.net/standards/ASAM_OpenSCENARIO/ASAM_OpenSCENARIO_XML/latest/generated/content/SimulationTimeCondition.html)     | ✔️ Complete |
 | ByValueCondition  | [UserDefinedValueCondition](https://publications.pages.asam.net/standards/ASAM_OpenSCENARIO/ASAM_OpenSCENARIO_XML/latest/generated/content/UserDefinedValueCondition.html)     | ✔️ Complete |
 
-- 
GitLab


From ea6006b23a98af459ff7444c58bac98ba9e7edb6 Mon Sep 17 00:00:00 2001
From: "ziqi.zhou" <ziqi.zhou@ansys.com>
Date: Mon, 17 Mar 2025 13:10:37 +0100
Subject: [PATCH 5/8] feat: remove redundent part

---
 .../TraveledDistanceCondition_impl.cpp               | 12 +++---------
 1 file changed, 3 insertions(+), 9 deletions(-)

diff --git a/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp b/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
index 4d01bd76..afd6694e 100644
--- a/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
+++ b/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
@@ -11,6 +11,7 @@
 
 #include "Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h"
 
+#include "Utils/EntityUtils.h"
 #include "Utils/Logger.h"
 
 namespace OpenScenarioEngine::v1_3
@@ -18,21 +19,14 @@ namespace OpenScenarioEngine::v1_3
 
 bool TraveledDistanceCondition::IsSatisfied()
 {
-  const auto& entity = mantle.environment->GetEntityRepository().Get(values.triggeringEntity);
-  if (!entity)
-  {
-    Logger::Warning("TraveledDistanceCondition: TraveledDistanceCondition cannot be satisfied (entity undefined).");
-    return false;
-  }
+  const auto& entity = EntityUtils::GetEntityByName(mantle.environment, values.triggeringEntity);
 
-  auto current_position = entity->get().GetPosition();
+  auto current_position = entity.GetPosition();
 
   if (!is_initialized)
   {
     last_position = current_position;
-    traveled_distance = 0.0;
     is_initialized = true;
-    return traveled_distance >= values.value;
   }
 
   const auto distance_delta = (current_position - last_position).Length().value();
-- 
GitLab


From 0aa412b80975198a93687a3f49b3f4979bf3d3e9 Mon Sep 17 00:00:00 2001
From: "ziqi.zhou" <ziqi.zhou@ansys.com>
Date: Mon, 24 Mar 2025 15:46:41 +0100
Subject: [PATCH 6/8] fix: modify based on review

---
 .../TraveledDistanceCondition_impl.cpp        | 13 ++++---
 .../TraveledDistanceCondition_impl.h          |  5 ++-
 .../TraveledDistanceConditionTest.cpp         | 35 ++++++++++---------
 3 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp b/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
index afd6694e..11e1a10b 100644
--- a/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
+++ b/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.cpp
@@ -23,18 +23,17 @@ bool TraveledDistanceCondition::IsSatisfied()
 
   auto current_position = entity.GetPosition();
 
-  if (!is_initialized)
+  if (!last_position_.has_value())
   {
-    last_position = current_position;
-    is_initialized = true;
+    last_position_ = current_position;
   }
 
-  const auto distance_delta = (current_position - last_position).Length().value();
+  const auto distance_delta = (current_position - last_position_.value()).Length();
 
-  traveled_distance += distance_delta;
-  last_position = current_position;
+  traveled_distance_ += distance_delta;
+  last_position_ = current_position;
 
-  return traveled_distance >= values.value;
+  return traveled_distance_.value() >= values.value;
 }
 
 }  // namespace OpenScenarioEngine::v1_3
diff --git a/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h b/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h
index 5ccbf9a4..90179ad1 100644
--- a/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h
+++ b/engine/src/Storyboard/ByEntityCondition/TraveledDistanceCondition_impl.h
@@ -43,9 +43,8 @@ private:
   Values values;
   Interfaces mantle;
 
-  double traveled_distance{};
-  mantle_api::Vec3<units::length::meter_t> last_position;
-  bool is_initialized{false};
+  units::length::meter_t traveled_distance_{};
+  std::optional<mantle_api::Vec3<units::length::meter_t>> last_position_;
 };
 
 }  // namespace OpenScenarioEngine::v1_3
diff --git a/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp b/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp
index c7a79908..3f7ed423 100644
--- a/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp
+++ b/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp
@@ -16,6 +16,9 @@
 
 using namespace mantle_api;
 using namespace units::literals;
+using testing::Eq;
+using testing::Return;
+using TestPosition = mantle_api::Vec3<units::length::meter_t>;
 
 class TraveledDistanceConditionTestFixture : public ::testing::Test
 {
@@ -23,9 +26,12 @@ 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);
   }
 
   std::shared_ptr<MockEnvironment> mock_environment_;
+  MockVehicle *entity_under_test_;
   OpenScenarioEngine::v1_3::TraveledDistanceCondition::Values condition_values_{.triggeringEntity = "vehicle1",
                                                                                 .value = 10.0};
 };
@@ -43,41 +49,36 @@ TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithNoMovement_WhenCh
   OpenScenarioEngine::v1_3::TraveledDistanceCondition traveled_distance_condition(condition_values_,
                                                                                   {mock_environment_});
 
-  EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(mock_environment_->GetEntityRepository().Get(condition_values_.triggeringEntity).value().get()),
-              GetPosition())
-      .WillOnce(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m}));
+  EXPECT_CALL(*entity_under_test_, GetPosition())
+      .WillOnce(::testing::Return(TestPosition{0_m, 0_m, 0_m}));
 
   EXPECT_FALSE(traveled_distance_condition.IsSatisfied());
 }
 
 TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithSatisfcatoryTraveledDistance_WhenCheckingCondition_ThenReturnsTrue)
 {
-  const auto moved_distance = 11.0_m;
   OpenScenarioEngine::v1_3::TraveledDistanceCondition traveled_distance_condition(condition_values_,
                                                                                   {mock_environment_});
 
-  EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(mock_environment_->GetEntityRepository().Get(condition_values_.triggeringEntity).value().get()),
-              GetPosition())
-      .WillOnce(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m}))
-      .WillRepeatedly(::testing::Return(mantle_api::Vec3<units::length::meter_t>{moved_distance, 0_m, 0_m}));
+  EXPECT_CALL(*entity_under_test_, GetPosition())
+      .WillOnce(::testing::Return(TestPosition{0_m, 0_m, 0_m}))
+      .WillRepeatedly(::testing::Return(TestPosition{10_m, 0_m, 0_m}));
 
-  EXPECT_FALSE(traveled_distance_condition.IsSatisfied());
+  EXPECT_THAT(traveled_distance_condition.IsSatisfied(), Eq(false));
   // Condition is satisfied after the second call.
-  EXPECT_TRUE(traveled_distance_condition.IsSatisfied());
+  EXPECT_THAT(traveled_distance_condition.IsSatisfied(), Eq(true));
 }
 
 TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithUnsatisfcatoryTraveledDistance_WhenCheckingCondition_ThenReturnsFalse)
 {
-  const auto moved_distance = 5.0_m;
   OpenScenarioEngine::v1_3::TraveledDistanceCondition traveled_distance_condition(condition_values_,
                                                                                   {mock_environment_});
 
-  EXPECT_CALL(dynamic_cast<mantle_api::MockVehicle &>(mock_environment_->GetEntityRepository().Get(condition_values_.triggeringEntity).value().get()),
-              GetPosition())
-      .WillOnce(::testing::Return(mantle_api::Vec3<units::length::meter_t>{0_m, 0_m, 0_m}))
-      .WillOnce(::testing::Return(mantle_api::Vec3<units::length::meter_t>{moved_distance, 0_m, 0_m}));
+  EXPECT_CALL(*entity_under_test_, GetPosition())
+      .WillOnce(Return(TestPosition{0_m, 0_m, 0_m}))
+      .WillOnce(Return(TestPosition{1_m, 0_m, 0_m}));
 
-  EXPECT_FALSE(traveled_distance_condition.IsSatisfied());
+  EXPECT_THAT(traveled_distance_condition.IsSatisfied(), Eq(false));
   // Condition is still not satisfied after the second call.
-  EXPECT_FALSE(traveled_distance_condition.IsSatisfied());
+  EXPECT_THAT(traveled_distance_condition.IsSatisfied(), Eq(false));
 }
-- 
GitLab


From 186a5678e6c7508be5e0470cee699aff51c8c1ef Mon Sep 17 00:00:00 2001
From: "ziqi.zhou" <ziqi.zhou@ansys.com>
Date: Mon, 24 Mar 2025 16:46:07 +0100
Subject: [PATCH 7/8] test: make tests clear

---
 .../ByEntityCondition/TraveledDistanceConditionTest.cpp     | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp b/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp
index 3f7ed423..a051eeac 100644
--- a/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp
+++ b/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp
@@ -50,7 +50,7 @@ TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithNoMovement_WhenCh
                                                                                   {mock_environment_});
 
   EXPECT_CALL(*entity_under_test_, GetPosition())
-      .WillOnce(::testing::Return(TestPosition{0_m, 0_m, 0_m}));
+      .WillOnce(Return(TestPosition{0_m, 0_m, 0_m}));
 
   EXPECT_FALSE(traveled_distance_condition.IsSatisfied());
 }
@@ -61,8 +61,8 @@ TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithSatisfcatoryTrave
                                                                                   {mock_environment_});
 
   EXPECT_CALL(*entity_under_test_, GetPosition())
-      .WillOnce(::testing::Return(TestPosition{0_m, 0_m, 0_m}))
-      .WillRepeatedly(::testing::Return(TestPosition{10_m, 0_m, 0_m}));
+      .WillOnce(Return(TestPosition{0_m, 0_m, 0_m}))
+      .WillRepeatedly(Return(TestPosition{10_m, 0_m, 0_m}));
 
   EXPECT_THAT(traveled_distance_condition.IsSatisfied(), Eq(false));
   // Condition is satisfied after the second call.
-- 
GitLab


From 6099e856d90e905c1928e49c4571c709fc8c0cb3 Mon Sep 17 00:00:00 2001
From: "ziqi.zhou" <ziqi.zhou@ansys.com>
Date: Tue, 25 Mar 2025 09:11:03 +0100
Subject: [PATCH 8/8] test: modify test value

---
 .../TraveledDistanceConditionTest.cpp                  | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp b/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp
index a051eeac..07417f45 100644
--- a/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp
+++ b/engine/tests/Storyboard/ByEntityCondition/TraveledDistanceConditionTest.cpp
@@ -33,7 +33,7 @@ protected:
   std::shared_ptr<MockEnvironment> mock_environment_;
   MockVehicle *entity_under_test_;
   OpenScenarioEngine::v1_3::TraveledDistanceCondition::Values condition_values_{.triggeringEntity = "vehicle1",
-                                                                                .value = 10.0};
+                                                                                .value = 5.0};
 };
 
 TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithMockedEntities_WhenCheckingCondition_ThenDoesNotThrow)
@@ -61,8 +61,8 @@ TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithSatisfcatoryTrave
                                                                                   {mock_environment_});
 
   EXPECT_CALL(*entity_under_test_, GetPosition())
-      .WillOnce(Return(TestPosition{0_m, 0_m, 0_m}))
-      .WillRepeatedly(Return(TestPosition{10_m, 0_m, 0_m}));
+      .WillOnce(Return(TestPosition{1_m, 1_m, 1_m}))
+      .WillOnce(Return(TestPosition{4_m, 5_m, 1_m}));
 
   EXPECT_THAT(traveled_distance_condition.IsSatisfied(), Eq(false));
   // Condition is satisfied after the second call.
@@ -75,8 +75,8 @@ TEST_F(TraveledDistanceConditionTestFixture, GivenConditionWithUnsatisfcatoryTra
                                                                                   {mock_environment_});
 
   EXPECT_CALL(*entity_under_test_, GetPosition())
-      .WillOnce(Return(TestPosition{0_m, 0_m, 0_m}))
-      .WillOnce(Return(TestPosition{1_m, 0_m, 0_m}));
+      .WillOnce(Return(TestPosition{1_m, 1_m, 1_m}))
+      .WillOnce(Return(TestPosition{4_m, 4_m, 1_m}));
 
   EXPECT_THAT(traveled_distance_condition.IsSatisfied(), Eq(false));
   // Condition is still not satisfied after the second call.
-- 
GitLab