text: /*
   * Copyright (C) 2013      Trent Houliston <trent@houliston.me>, Jake Woods <jake.f.woods@gmail.com>
   *               2014-2017 Trent Houliston <trent@houliston.me>
   *
   * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
   * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
   * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
   * permit persons to whom the Software is furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
   * Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
   * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
   * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
   * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
   */
  
  #include <catch.hpp>
  
  #include "nuclear"
  
  namespace {
  
  template <int i>
  struct Message {
      int val;
      Message(int val) : val(val){};
  };
  
  class TestReactor : public NUClear::Reactor {
  public:
      TestReactor(std::unique_ptr<NUClear::Environment> environment) : Reactor(std::move(environment)) {
  
          on<Trigger<Message<1>>, With<Message<2>>, With<Message<3>>, With<Message<4>>>().then(
              [this](const Message<2>& m2, const Message<4>& m4) {
  
                  REQUIRE(m2.val == 2 + 4);
                  REQUIRE(m4.val == 4 + 4);
  
                  powerplant.shutdown();
              });
  
          on<Startup>().then([this] {
  
              // Emit from message 4 to 1
              emit(std::make_unique<Message<4>>(8));
              emit(std::make_unique<Message<3>>(7));
              emit(std::make_unique<Message<2>>(6));
              emit(std::make_unique<Message<1>>(5));
  
          });
      }
  };
  }  // namespace
  
  TEST_CASE("Testing that when arguments missing from the call it can still run", "[api][missing_arguments]") {
  
      NUClear::PowerPlant::Configuration config;
      config.thread_count = 1;
      NUClear::PowerPlant plant(config);
      plant.install<TestReactor>();
  
      plant.start();
  }
  