/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
 * Copyright (c) 2013-2016 Regents of the University of California.
 *
 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
 *
 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
 *
 * You should have received copies of the GNU General Public License and GNU Lesser
 * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
 * <http://www.gnu.org/licenses/>.
 *
 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
 */

#include "util/time-unit-test-clock.hpp"
#include "util/scheduler.hpp"

#include "boost-test.hpp"
#include "../unit-test-time-fixture.hpp"

#include <boost/lexical_cast.hpp>
#include <thread>

namespace ndn {
namespace tests {

BOOST_AUTO_TEST_SUITE(Util)
BOOST_FIXTURE_TEST_SUITE(TestTimeUnitTestClock, UnitTestTimeFixture)

BOOST_AUTO_TEST_CASE(SystemClock)
{
  BOOST_CHECK_EQUAL(time::system_clock::now().time_since_epoch(),
                    time::UnitTestClockTraits<time::system_clock>::getDefaultStartTime());
  std::this_thread::sleep_for(std::chrono::milliseconds(100));

  BOOST_CHECK_EQUAL(time::system_clock::now().time_since_epoch(),
                    time::UnitTestClockTraits<time::system_clock>::getDefaultStartTime());

  steadyClock->advance(time::days(1));
  BOOST_CHECK_EQUAL(time::system_clock::now().time_since_epoch(),
                    time::UnitTestClockTraits<time::system_clock>::getDefaultStartTime());

  systemClock->advance(time::days(1));
  BOOST_CHECK_GT(time::system_clock::now().time_since_epoch(),
                 time::UnitTestClockTraits<time::system_clock>::getDefaultStartTime());

  time::system_clock::TimePoint referenceTime =
    time::fromUnixTimestamp(time::milliseconds(1390966967032LL));
  BOOST_CHECK_GT(time::system_clock::now(), referenceTime);

  systemClock->setNow(referenceTime.time_since_epoch());
  BOOST_CHECK_EQUAL(time::system_clock::now(), referenceTime);

  BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(time::system_clock::now()),
                    "1390966967032000000 nanoseconds since unit test clock advancements");

  BOOST_CHECK_EQUAL(time::toIsoString(referenceTime), "20140129T034247.032000");
  BOOST_CHECK_EQUAL(time::toString(referenceTime), "2014-01-29 03:42:47");
  BOOST_CHECK_EQUAL(time::toString(referenceTime), "2014-01-29 03:42:47");

  // Unfortunately, not all systems has lv_LV locale installed :(
  // BOOST_CHECK_EQUAL(time::toString(referenceTime, "%Y. gada %d. %B",
  //                                  std::locale("lv_LV.UTF-8")),
  //                   "2014. gada 29. Janvāris");

  BOOST_CHECK_EQUAL(time::toString(referenceTime, "%Y -- %d -- %B",
                                   std::locale("C")),
                    "2014 -- 29 -- January");

  BOOST_CHECK_EQUAL(time::fromIsoString("20140129T034247.032000"), referenceTime);
  BOOST_CHECK_EQUAL(time::fromIsoString("20140129T034247.032000Z"), referenceTime);
  BOOST_CHECK_EQUAL(time::fromString("2014-01-29 03:42:47"),
                    time::fromUnixTimestamp(time::seconds(1390966967)));

  // Unfortunately, not all systems has lv_LV locale installed :(
  // BOOST_CHECK_EQUAL(time::fromString("2014. gada 29. Janvāris", "%Y. gada %d. %B",
  //                                    std::locale("lv_LV.UTF-8")),
  //                   time::fromUnixTimestamp(time::seconds(1390953600)));

  BOOST_CHECK_EQUAL(time::fromString("2014 -- 29 -- January", "%Y -- %d -- %B",
                                     std::locale("C")),
                    time::fromUnixTimestamp(time::seconds(1390953600)));
}

BOOST_AUTO_TEST_CASE(SteadyClock)
{
  BOOST_CHECK_EQUAL(time::steady_clock::now().time_since_epoch(),
                    time::steady_clock::duration::zero());

  std::this_thread::sleep_for(std::chrono::milliseconds(100));
  BOOST_CHECK_EQUAL(time::steady_clock::now().time_since_epoch(),
                    time::steady_clock::duration::zero());

  systemClock->advance(time::days(36500));
  BOOST_CHECK_EQUAL(time::steady_clock::now().time_since_epoch(),
                    time::steady_clock::duration::zero());

  steadyClock->advance(time::nanoseconds(100));
  BOOST_CHECK_EQUAL(time::steady_clock::now().time_since_epoch(), time::nanoseconds(100));

  steadyClock->advance(time::microseconds(100));
  BOOST_CHECK_EQUAL(time::steady_clock::now().time_since_epoch(), time::nanoseconds(100100));

  steadyClock->setNow(time::nanoseconds(100));
  BOOST_CHECK_EQUAL(time::steady_clock::now().time_since_epoch(), time::nanoseconds(100));

  BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(time::steady_clock::now()),
                    "100 nanoseconds since unit test clock advancements");
}

BOOST_AUTO_TEST_CASE(Scheduler)
{
  ndn::Scheduler scheduler(io);

  bool hasFired = false;
  scheduler.scheduleEvent(time::seconds(100), [&] { hasFired = true; });

  io.poll();
  BOOST_CHECK_EQUAL(hasFired, false);

  steadyClock->advance(time::seconds(100));

  io.poll();
  BOOST_CHECK_EQUAL(hasFired, true);
}

BOOST_AUTO_TEST_SUITE_END() // TestTimeUnitTestClock
BOOST_AUTO_TEST_SUITE_END() // Util

} // namespace tests
} // namespace ndn
