|
@@ -24,13 +24,17 @@
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
*/
|
|
|
|
|
|
-#include "artis-star/common/context/Context.hpp"
|
|
|
|
-#include "artis-star/common/observer/Observer.hpp"
|
|
|
|
-#include "artis-star/common/observer/View.hpp"
|
|
|
|
-#include "artis-star/kernel/pdevs/Dynamics.hpp"
|
|
|
|
-#include "artis-star/kernel/pdevs/Simulator.hpp"
|
|
|
|
|
|
+#include <artis-star/common/RootCoordinator.hpp>
|
|
|
|
+#include <artis-star/common/context/Context.hpp>
|
|
|
|
+#include <artis-star/common/observer/Observer.hpp>
|
|
|
|
+#include <artis-star/common/observer/View.hpp>
|
|
#include <artis-star/common/time/DoubleTime.hpp>
|
|
#include <artis-star/common/time/DoubleTime.hpp>
|
|
|
|
|
|
|
|
+#include <artis-star/kernel/pdevs/Coordinator.hpp>
|
|
|
|
+#include <artis-star/kernel/pdevs/Dynamics.hpp>
|
|
|
|
+#include <artis-star/kernel/pdevs/GraphManager.hpp>
|
|
|
|
+#include <artis-star/kernel/pdevs/Simulator.hpp>
|
|
|
|
+
|
|
#define BOOST_TEST_MODULE Common_Observe_Tests
|
|
#define BOOST_TEST_MODULE Common_Observe_Tests
|
|
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
#include <boost/test/unit_test.hpp>
|
|
@@ -39,6 +43,29 @@
|
|
* Tests
|
|
* Tests
|
|
*************************************************/
|
|
*************************************************/
|
|
|
|
|
|
|
|
+template<typename M>
|
|
|
|
+class OnlyOneGraphManager :
|
|
|
|
+ public artis::pdevs::GraphManager<artis::common::DoubleTime> {
|
|
|
|
+public:
|
|
|
|
+ enum sub_models {
|
|
|
|
+ OneM
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ OnlyOneGraphManager(artis::common::Coordinator<artis::common::DoubleTime> *coordinator,
|
|
|
|
+ const artis::common::NoParameters ¶meters,
|
|
|
|
+ const artis::common::NoParameters &graph_parameters)
|
|
|
|
+ :
|
|
|
|
+ artis::pdevs::GraphManager<artis::common::DoubleTime>(coordinator, parameters, graph_parameters),
|
|
|
|
+ model("a", parameters) {
|
|
|
|
+ this->add_child(OneM, &model);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ~OnlyOneGraphManager() override = default;
|
|
|
|
+
|
|
|
|
+private:
|
|
|
|
+ artis::pdevs::Simulator<artis::common::DoubleTime, M> model;
|
|
|
|
+};
|
|
|
|
+
|
|
class MyDynamics : public artis::pdevs::Dynamics<artis::common::DoubleTime, MyDynamics> {
|
|
class MyDynamics : public artis::pdevs::Dynamics<artis::common::DoubleTime, MyDynamics> {
|
|
public:
|
|
public:
|
|
struct vars {
|
|
struct vars {
|
|
@@ -49,24 +76,40 @@ public:
|
|
|
|
|
|
MyDynamics(const std::string &name,
|
|
MyDynamics(const std::string &name,
|
|
const artis::pdevs::Context<artis::common::DoubleTime, MyDynamics, artis::common::NoParameters> &context)
|
|
const artis::pdevs::Context<artis::common::DoubleTime, MyDynamics, artis::common::NoParameters> &context)
|
|
- : artis::pdevs::Dynamics<artis::common::DoubleTime, MyDynamics, artis::common::NoParameters>(name, context) {
|
|
|
|
|
|
+ : artis::pdevs::Dynamics<artis::common::DoubleTime, MyDynamics, artis::common::NoParameters>(name, context),
|
|
|
|
+ _counter(1) {
|
|
observables({{vars::VALUE, "value"}});
|
|
observables({{vars::VALUE, "value"}});
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ void dint(const artis::common::DoubleTime::type & /* t */) override {
|
|
|
|
+ if (_counter < 100) { ++_counter; } else { _counter = 1; }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void start(const artis::common::DoubleTime::type & /* t */) override {
|
|
|
|
+ _counter = 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ artis::common::DoubleTime::type ta(const artis::common::DoubleTime::type & /* t */) const override {
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
artis::common::event::Value observe(const artis::common::DoubleTime::type & /* t */,
|
|
artis::common::event::Value observe(const artis::common::DoubleTime::type & /* t */,
|
|
unsigned int index) const override {
|
|
unsigned int index) const override {
|
|
if (index == vars::VALUE) {
|
|
if (index == vars::VALUE) {
|
|
- return (int) 1;
|
|
|
|
|
|
+ return (unsigned int) _counter;
|
|
}
|
|
}
|
|
return {};
|
|
return {};
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+private:
|
|
|
|
+ unsigned int _counter;
|
|
};
|
|
};
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(Common_Observe_TestCase_1)
|
|
BOOST_AUTO_TEST_CASE(Common_Observe_TestCase_1)
|
|
{
|
|
{
|
|
artis::pdevs::Simulator<artis::common::DoubleTime, MyDynamics> model("A", {});
|
|
artis::pdevs::Simulator<artis::common::DoubleTime, MyDynamics> model("A", {});
|
|
artis::common::observer::View<artis::common::DoubleTime> view;
|
|
artis::common::observer::View<artis::common::DoubleTime> view;
|
|
- artis::common::event::Value ref{1};
|
|
|
|
|
|
+ artis::common::event::Value ref{(unsigned int) 1};
|
|
|
|
|
|
view.attachModel(&model);
|
|
view.attachModel(&model);
|
|
view.selector("value", {MyDynamics::vars::VALUE});
|
|
view.selector("value", {MyDynamics::vars::VALUE});
|
|
@@ -80,7 +123,7 @@ BOOST_AUTO_TEST_CASE(Common_Observe_TestCase_2)
|
|
artis::pdevs::Simulator<artis::common::DoubleTime, MyDynamics> model("A", {});
|
|
artis::pdevs::Simulator<artis::common::DoubleTime, MyDynamics> model("A", {});
|
|
auto view = new artis::common::observer::View<artis::common::DoubleTime>();
|
|
auto view = new artis::common::observer::View<artis::common::DoubleTime>();
|
|
artis::common::observer::Observer<artis::common::DoubleTime> observer(&model);
|
|
artis::common::observer::Observer<artis::common::DoubleTime> observer(&model);
|
|
- artis::common::event::Value ref{1};
|
|
|
|
|
|
+ artis::common::event::Value ref{(unsigned int) 1};
|
|
|
|
|
|
view->selector("value", {MyDynamics::vars::VALUE});
|
|
view->selector("value", {MyDynamics::vars::VALUE});
|
|
observer.attachView("global", view);
|
|
observer.attachView("global", view);
|
|
@@ -89,4 +132,55 @@ BOOST_AUTO_TEST_CASE(Common_Observe_TestCase_2)
|
|
|
|
|
|
BOOST_REQUIRE_EQUAL(observer.views().at("global")->get("value").back().second, ref);
|
|
BOOST_REQUIRE_EQUAL(observer.views().at("global")->get("value").back().second, ref);
|
|
BOOST_REQUIRE_EQUAL(observer.view("global").get("value").back().second, ref);
|
|
BOOST_REQUIRE_EQUAL(observer.view("global").get("value").back().second, ref);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+BOOST_AUTO_TEST_CASE(Common_Observe_TestCase_3)
|
|
|
|
+{
|
|
|
|
+ artis::pdevs::Simulator<artis::common::DoubleTime, MyDynamics> model("A", {});
|
|
|
|
+ auto view = new artis::common::observer::View<artis::common::DoubleTime>();
|
|
|
|
+ artis::common::observer::Observer<artis::common::DoubleTime> observer(&model);
|
|
|
|
+ artis::common::event::Value ref{(unsigned int) 1};
|
|
|
|
+
|
|
|
|
+ view->selector("value", {OnlyOneGraphManager<MyDynamics>::OneM, MyDynamics::vars::VALUE});
|
|
|
|
+
|
|
|
|
+ artis::common::context::Context<artis::common::DoubleTime> context(0, 200);
|
|
|
|
+ artis::common::RootCoordinator<artis::common::DoubleTime, artis::pdevs::Coordinator<
|
|
|
|
+ artis::common::DoubleTime, OnlyOneGraphManager<MyDynamics>,
|
|
|
|
+ artis::common::NoParameters, artis::common::NoParameters>> rc(context, "root", artis::common::NoParameters(),
|
|
|
|
+ artis::common::NoParameters());
|
|
|
|
+
|
|
|
|
+ rc.attachView("global", view);
|
|
|
|
+ rc.run(context);
|
|
|
|
+
|
|
|
|
+ BOOST_REQUIRE_EQUAL(rc.observer().view("global").get("value").back().second, ref);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+BOOST_AUTO_TEST_CASE(Common_Observe_TestCase_4)
|
|
|
|
+{
|
|
|
|
+ artis::pdevs::Simulator<artis::common::DoubleTime, MyDynamics> model("A", {});
|
|
|
|
+ auto view = new artis::common::observer::View<artis::common::DoubleTime>();
|
|
|
|
+ artis::common::observer::Observer<artis::common::DoubleTime> observer(&model);
|
|
|
|
+ artis::common::event::Value ref1{(unsigned int) 11};
|
|
|
|
+ artis::common::event::Value ref2{(unsigned int) 21};
|
|
|
|
+
|
|
|
|
+ view->selector("value", {OnlyOneGraphManager<MyDynamics>::OneM, MyDynamics::vars::VALUE});
|
|
|
|
+
|
|
|
|
+ artis::common::context::Context<artis::common::DoubleTime> context(0, 200);
|
|
|
|
+ artis::common::RootCoordinator<artis::common::DoubleTime, artis::pdevs::Coordinator<
|
|
|
|
+ artis::common::DoubleTime, OnlyOneGraphManager<MyDynamics>,
|
|
|
|
+ artis::common::NoParameters, artis::common::NoParameters>> rc(context, "root", artis::common::NoParameters(),
|
|
|
|
+ artis::common::NoParameters());
|
|
|
|
+
|
|
|
|
+ rc.attachView("global", view);
|
|
|
|
+ rc.switch_to_timed_observer(0.1);
|
|
|
|
+ rc.start(context);
|
|
|
|
+ rc.run(10);
|
|
|
|
+
|
|
|
|
+ BOOST_REQUIRE_EQUAL(rc.observer().view("global").get("value").back().second, ref1);
|
|
|
|
+ BOOST_REQUIRE_EQUAL(rc.observer().view("global").get("value").size(), 100);
|
|
|
|
+
|
|
|
|
+ rc.run(10);
|
|
|
|
+
|
|
|
|
+ BOOST_REQUIRE_EQUAL(rc.observer().view("global").get("value").back().second, ref2);
|
|
|
|
+ BOOST_REQUIRE_EQUAL(rc.observer().view("global").get("value").size(), 100);
|
|
}
|
|
}
|