From 97afe641002254c2e4104b2f533b3ee9b5cec588 Mon Sep 17 00:00:00 2001
From: Martin Killenberg <martin.killenberg@desy.de>
Date: Fri, 28 May 2021 09:18:07 +0200
Subject: [PATCH] added more complex circular network, which throws during
 detection

---
 .../testCircularDependencyFaultyFlags.cc      | 121 ++++++++++++++++++
 1 file changed, 121 insertions(+)

diff --git a/tests/executables_src/testCircularDependencyFaultyFlags.cc b/tests/executables_src/testCircularDependencyFaultyFlags.cc
index a2bdff92..e9cfe7f7 100644
--- a/tests/executables_src/testCircularDependencyFaultyFlags.cc
+++ b/tests/executables_src/testCircularDependencyFaultyFlags.cc
@@ -354,3 +354,124 @@ BOOST_FIXTURE_TEST_CASE(TwoFaultyInTwoModules, CircularAppTestFixcture<TestAppli
   readAllLatest();
   checkAllDataValidity(ctk::DataValidity::ok);
 }
+
+// A more complicated network with three entangled circles and one separate circle
+// AA-->BB-->CC-->DD-->AA    /->HH
+// ^     |   |     ^       GG<-/
+// |-EE<-|   |->FF-|
+
+// Don't try to pass any data through the network. It will be stuck because there are no main loops. It's just used to test the static circular network detection.
+
+struct AA : ctk::ApplicationModule {
+  using ApplicationModule::ApplicationModule;
+
+  ctk::ScalarPushInput<int> fromEE{this, "fromEE", "", ""};
+  ctk::ScalarPushInput<int> fromDD{this, "fromDD", "", ""};
+
+  struct /*OutputGroup*/ : public ctk::VariableGroup {
+    using ctk::VariableGroup::VariableGroup;
+    ctk::ScalarOutput<int> fromAA{this, "fromAA", "", ""};
+  } outputGroup{this, "BB", "", ctk::HierarchyModifier::oneLevelUp};
+
+  void mainLoop() override {}
+};
+
+struct BB : ctk::ApplicationModule {
+  using ApplicationModule::ApplicationModule;
+
+  ctk::ScalarPushInput<int> fromAA{this, "fromAA", "", ""};
+
+  struct /*OutputGroup*/ : public ctk::VariableGroup {
+    using ctk::VariableGroup::VariableGroup;
+    ctk::ScalarOutput<int> fromBB{this, "fromBB", "", ""};
+  } outputGroup{this, "CC", "", ctk::HierarchyModifier::oneLevelUp};
+
+  struct /*OutputGroup*/ : public ctk::VariableGroup {
+    using ctk::VariableGroup::VariableGroup;
+    ctk::ScalarOutput<int> fromBB{this, "fromBB", "", ""};
+  } outputGroup2{this, "EE", "", ctk::HierarchyModifier::oneLevelUp};
+
+  void mainLoop() override {}
+};
+
+struct EE : ctk::ApplicationModule {
+  using ApplicationModule::ApplicationModule;
+
+  ctk::ScalarPushInput<int> fromBB{this, "fromBB", "", ""};
+
+  struct /*OutputGroup*/ : public ctk::VariableGroup {
+    using ctk::VariableGroup::VariableGroup;
+    ctk::ScalarOutput<int> fromEE{this, "fromEE", "", ""};
+  } outputGroup{this, "AA", "", ctk::HierarchyModifier::oneLevelUp};
+
+  void mainLoop() override {}
+};
+
+struct CC : ctk::ApplicationModule {
+  using ApplicationModule::ApplicationModule;
+
+  ctk::ScalarPushInput<int> fromBB{this, "fromBB", "", ""};
+
+  struct /*OutputGroup*/ : public ctk::VariableGroup {
+    using ctk::VariableGroup::VariableGroup;
+    ctk::ScalarOutput<int> fromCC{this, "fromCC", "", ""};
+  } outputGroup{this, "DD", "", ctk::HierarchyModifier::oneLevelUp};
+
+  struct /*OutputGroup*/ : public ctk::VariableGroup {
+    using ctk::VariableGroup::VariableGroup;
+    ctk::ScalarOutput<int> fromCC{this, "fromCC", "", ""};
+  } outputGroup2{this, "FF", "", ctk::HierarchyModifier::oneLevelUp};
+
+  void mainLoop() override {}
+};
+
+struct DD : ctk::ApplicationModule {
+  using ApplicationModule::ApplicationModule;
+
+  ctk::ScalarPushInput<int> fromCC{this, "fromCC", "", ""};
+  ctk::ScalarPushInput<int> fromFF{this, "fromFF", "", ""};
+
+  struct /*OutputGroup*/ : public ctk::VariableGroup {
+    using ctk::VariableGroup::VariableGroup;
+    ctk::ScalarOutput<int> fromDD{this, "fromDD", "", ""};
+  } outputGroup{this, "AA", "", ctk::HierarchyModifier::oneLevelUp};
+
+  void mainLoop() override {}
+};
+
+struct FF : ctk::ApplicationModule {
+  using ApplicationModule::ApplicationModule;
+
+  ctk::ScalarPushInput<int> fromCC{this, "fromCC", "", ""};
+
+  struct /*OutputGroup*/ : public ctk::VariableGroup {
+    using ctk::VariableGroup::VariableGroup;
+    ctk::ScalarOutput<int> fromFF{this, "fromFF", "", ""};
+  } outputGroup{this, "DD", "", ctk::HierarchyModifier::oneLevelUp};
+
+  void mainLoop() override {}
+};
+
+struct TestApplication2 : ctk::Application {
+  TestApplication2() : Application("connectionTestSuite") {}
+  ~TestApplication2() { shutdown(); }
+
+  void defineConnections() { findTag(".*").connectTo(cs); }
+
+  AA aa{this, "AA", ""};
+  BB bb{this, "BB", ""};
+  CC cc{this, "CC", ""};
+  DD dd{this, "DD", ""};
+  EE ee{this, "EE", ""};
+  FF ff{this, "FF", ""};
+
+  ctk::ControlSystemModule cs;
+};
+
+BOOST_AUTO_TEST_CASE(TestCircularInputDetection2) {
+  TestApplication2 app;
+  ctk::TestFacility test;
+
+  test.runApplication();
+  app.dumpConnections();
+}
-- 
GitLab