@@ -73,6 +73,105 @@ class IterableGraphTest : public ::testing::Test
7373 IterableGraph *loop_{nullptr };
7474};
7575
76+ TEST_F (IterableGraphTest, BasicNonLoopingSeries)
77+ {
78+ CoreData coreData;
79+ Dissolve dissolve (coreData);
80+ auto root = std::make_unique<DissolveGraph>(dissolve);
81+ auto loop = dynamic_cast <IterableGraph *>(root->createNode (" Iterator" , " Iterator" ));
82+ auto i = dynamic_cast <NumberNode *>(root->createNode (" Number" , " i" ));
83+ auto a = dynamic_cast <AddNode *>(loop->createNode (" Add" , " a" ));
84+ auto b = dynamic_cast <AddNode *>(loop->createNode (" Add" , " b" ));
85+ auto c = dynamic_cast <AddNode *>(loop->createNode (" Add" , " c" ));
86+ ASSERT_TRUE (loop->setOption <Number>(" N" , 1 ));
87+ EXPECT_TRUE (root->addEdge ({" i" , " X" , " Iterator" , " I" }));
88+
89+ /*
90+ * i, 1 -> itA, 1 + 1 = 2
91+ */
92+
93+ // This should actually result in the sole internal node not being run
94+ i->setOption <Number>(" X" , 1 );
95+ a->setInput <Number>(" Y" , 1 );
96+ b->setInput <Number>(" Y" , 1 );
97+ c->setInput <Number>(" Y" , 1 );
98+ EXPECT_TRUE (loop->addEdge ({" Inputs" , " I" , " a" , " X" }));
99+ EXPECT_EQ (loop->run (), NodeConstants::ProcessResult::Success);
100+ auto res1 = a->getOutputValue <Number>(" Result" ).asInteger ();
101+ EXPECT_TRUE (a->versionIndex () == 0 );
102+ EXPECT_TRUE (loop->versionIndex () == 0 );
103+ ASSERT_EQ (res1, 2 );
104+
105+ // No loopbacks occur
106+ EXPECT_TRUE (loop->loopBacks ()->versionIndex () == -1 );
107+
108+ /*
109+ * i, 1 -> itA, 1 + 1 = 2 -> itB, 1 + 2 = 3
110+ */
111+ EXPECT_TRUE (loop->addEdge ({" a" , " Result" , " b" , " X" }));
112+ ASSERT_TRUE (loop->setOption <Number>(" N" , 1 ));
113+ EXPECT_EQ (loop->run (), NodeConstants::ProcessResult::Success);
114+ auto res2 = b->getOutputValue <Number>(" Result" ).asInteger ();
115+ EXPECT_TRUE (a->versionIndex () == 1 );
116+ EXPECT_TRUE (b->versionIndex () == 0 );
117+ EXPECT_TRUE (loop->versionIndex () == 1 );
118+ ASSERT_EQ (res2, 3 );
119+
120+ // No loopbacks occur
121+ EXPECT_TRUE (loop->loopBacks ()->versionIndex () == -1 );
122+
123+ /*
124+ * i, 1 -> itA, 1 + 1 = 2 -> itB, 1 + 2 = 3 -> itC, 1 + 3 = 4
125+ */
126+ EXPECT_TRUE (loop->addEdge ({" b" , " Result" , " c" , " X" }));
127+ ASSERT_TRUE (loop->setOption <Number>(" N" , 1 ));
128+ EXPECT_EQ (loop->run (), NodeConstants::ProcessResult::Success);
129+ auto res3 = c->getOutputValue <Number>(" Result" ).asInteger ();
130+ EXPECT_TRUE (a->versionIndex () == 2 );
131+ EXPECT_TRUE (b->versionIndex () == 1 );
132+ EXPECT_TRUE (c->versionIndex () == 0 );
133+ EXPECT_TRUE (loop->versionIndex () == 2 );
134+ ASSERT_EQ (res3, 4 );
135+
136+ // No loopbacks occur
137+ EXPECT_TRUE (loop->loopBacks ()->versionIndex () == -1 );
138+
139+ // Run 100 times
140+ ASSERT_TRUE (loop->setOption <Number>(" N" , 100 ));
141+ EXPECT_EQ (loop->run (), NodeConstants::ProcessResult::Success);
142+ ASSERT_EQ (a->getOutputValue <Number>(" Result" ).asInteger (), 2 );
143+ ASSERT_EQ (b->getOutputValue <Number>(" Result" ).asInteger (), 3 );
144+ ASSERT_EQ (c->getOutputValue <Number>(" Result" ).asInteger (), 4 );
145+ EXPECT_TRUE (a->versionIndex () == 3 );
146+ EXPECT_TRUE (b->versionIndex () == 2 );
147+ EXPECT_TRUE (c->versionIndex () == 1 );
148+ EXPECT_TRUE (loop->versionIndex () == 3 );
149+
150+ // No loopbacks occur
151+ EXPECT_TRUE (loop->loopBacks ()->versionIndex () == -1 );
152+
153+ // Upstream node change
154+ i->setOption <Number>(" X" , 2 );
155+
156+ /*
157+ * i, 2 -> itA, 1 + 2 = 3 -> itB, 1 + 3 = 4 -> itC, 1 + 4 = 5
158+ */
159+
160+ // Run again
161+ ASSERT_TRUE (loop->setOption <Number>(" N" , 1 ));
162+ EXPECT_EQ (loop->run (), NodeConstants::ProcessResult::Success);
163+ ASSERT_EQ (a->getOutputValue <Number>(" Result" ).asInteger (), 3 );
164+ ASSERT_EQ (b->getOutputValue <Number>(" Result" ).asInteger (), 4 );
165+ ASSERT_EQ (c->getOutputValue <Number>(" Result" ).asInteger (), 5 );
166+ EXPECT_TRUE (a->versionIndex () == 4 );
167+ EXPECT_TRUE (b->versionIndex () == 3 );
168+ EXPECT_TRUE (c->versionIndex () == 2 );
169+ EXPECT_TRUE (loop->versionIndex () == 4 );
170+
171+ // No loopbacks occur
172+ EXPECT_TRUE (loop->loopBacks ()->versionIndex () == -1 );
173+ }
174+
76175TEST_F (IterableGraphTest, NoRun)
77176{
78177 createGraph ();
0 commit comments