#include <fsfw/osal/osal.h>
#include <fsfw/tasks/SemaphoreFactory.h>
#include <fsfw/timemanager/Stopwatch.h>

#include <catch2/catch_test_macros.hpp>

// binary semaphores currently only supported on linux
#ifdef FSFW_OSAL_LINUX

TEST_CASE("Binary Semaphore Test", "[BinSemaphore]") {
  // perform set-up here
  SemaphoreIF* binSemaph = SemaphoreFactory::instance()->createBinarySemaphore();
  REQUIRE(binSemaph != nullptr);
  SECTION("Simple Test") {
    // set-up is run for each section
    REQUIRE(binSemaph->getSemaphoreCounter() == 1);
    REQUIRE(binSemaph->release() == static_cast<int>(SemaphoreIF::SEMAPHORE_NOT_OWNED));
    REQUIRE(binSemaph->acquire(SemaphoreIF::POLLING) == returnvalue::OK);
    {
      // not precise enough on linux.. should use clock instead..
      // Stopwatch stopwatch(false);
      // REQUIRE(binSemaph->acquire(SemaphoreIF::TimeoutType::WAITING, 5) ==
      //		SemaphoreIF::SEMAPHORE_TIMEOUT);
      // dur_millis_t time = stopwatch.stop();
      // CHECK(time == 5);
    }
    REQUIRE(binSemaph->getSemaphoreCounter() == 0);
    REQUIRE(binSemaph->release() == returnvalue::OK);
  }
  SemaphoreFactory::instance()->deleteSemaphore(binSemaph);
  // perform tear-down here
}

TEST_CASE("Counting Semaphore Test", "[CountingSemaph]") {
  SECTION("Simple Test") {}
}

#endif