#include <gtest/gtest.h>
#include <json.hpp>
//#define private public
#include <Registration.h>


using namespace mdd;
namespace TEST_MODULE_SWITCH {

    auto regi = Registration();
    TEST(ModuleSwitch, EasySwitch){
        IModule::Ptr sModule = regi.generateModule("ModuleSwitch");
        json config = sModule->getConfiguration();
        config["configure"]["size"]["value"] = 2;
        sModule->configure(config);

        sModule->getInput(0)->setValue() = { 0 };
        sModule->getInput(1)->setValue() = { 1 };
        sModule->getInput(2)->setValue() = { 2 };

        sModule->update();

        EXPECT_EQ(sModule->getOutput(0)->getValue()[0], 1);

        sModule->getInput(0)->setValue() = { 1 };
        sModule->update();
        EXPECT_EQ(sModule->getOutput(0)->getValue()[0], 1);

        sModule->getInput(0)->setValue() = { 2 };
        sModule->update();
        EXPECT_EQ(sModule->getOutput(0)->getValue()[0], 2);

        sModule->getInput(0)->setValue() = { 3 };
        sModule->update();
        EXPECT_EQ(sModule->getOutput(0)->getValue()[0], 2);
        sModule->getInput(0)->setValue() = { 33 };
        sModule->update();
        EXPECT_EQ(sModule->getOutput(0)->getValue()[0], 2);
    }

    TEST(ModuleSwitch, ConnectTest){
        IModule::Ptr f0 = regi.generateModule("ModuleMath");
        json config = f0->getConfiguration();
        config["configure"]["operation"]["value"] = "multiply";
        f0->configure(config);
       
        f0->getInput(0)->setValue() = { 1 };
        f0->getInput(1)->setValue() = { 1 };

        IModule::Ptr f1 = regi.generateModule("ModuleMath");
        config = f1->getConfiguration();
        config["configure"]["operation"]["value"] = "multiply";
        f1->configure(config);

        f1->getInput(0)->setValue() = { 2 };
        f1->getInput(1)->setValue() = { 3 };

        IModule::Ptr f2 = regi.generateModule("ModuleMath");
        config = f2->getConfiguration();
        config["configure"]["operation"]["value"] = "multiply";
        f2->configure(config);

        f2->getInput(0)->setValue() = { 5 };
        f2->getInput(1)->setValue() = { 7 };

        IModule::Ptr sModule = regi.generateModule("ModuleSwitch");
        config = sModule->getConfiguration();
        config["configure"]["size"]["value"] = 2;
        sModule->configure(config);

        sModule->getInput(0)->connect(f0->getOutput(0));
        sModule->getInput(1)->connect(f1->getOutput(0));
        sModule->getInput(2)->connect(f2->getOutput(0));

        f0->update();
        f1->update();
        f2->update();
        sModule->update();

        //std::cout << sModule.getOutput(sModule.getOutputIDs()[0])->getValue()["value"].dump() << std::endl;
        EXPECT_EQ(sModule->getOutput(0)->getValue()[0], 6);
    }//*/
}