/**
\file test_TimePattern.cpp
Copyright Notice\n
Copyright (C) 2020 Jan Rogall - developer\n
This file is part of hueplusplus.
hueplusplus 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.
hueplusplus 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 a copy of the GNU Lesser General Public License
along with hueplusplus. If not, see .
**/
#include
#include
using namespace hueplusplus::time;
using std::chrono::system_clock;
using namespace std::chrono_literals;
TEST(AbsoluteTime, Constructor)
{
system_clock::time_point now = system_clock::now();
{
AbsoluteTime time(now);
EXPECT_EQ(now, time.getBaseTime());
EXPECT_EQ(0s, time.getRandomVariation());
}
system_clock::duration variation = 4h + 2min;
{
AbsoluteTime time(now, variation);
EXPECT_EQ(now, time.getBaseTime());
EXPECT_EQ(variation, time.getRandomVariation());
}
}
TEST(AbsoluteTime, toString)
{
std::tm time {};
time.tm_year = 2020 - 1900;
time.tm_mon = 2;
time.tm_mday = 3;
time.tm_hour = 20;
time.tm_min = 53;
time.tm_sec = 3;
std::time_t ctime = std::mktime(&time);
const system_clock::time_point timePoint = system_clock::from_time_t(ctime);
EXPECT_EQ("2020-03-03T20:53:03", AbsoluteTime(timePoint).toString());
const system_clock::duration noVariation = 0s;
EXPECT_EQ("2020-03-03T20:53:03", AbsoluteTime(timePoint, noVariation).toString());
const system_clock::duration variation = 1h + 2min + 1s;
EXPECT_EQ("2020-03-03T20:53:03A01:02:01", AbsoluteTime(timePoint, variation).toString());
}
TEST(Weekdays, Constructor)
{
EXPECT_TRUE(Weekdays().isNone());
EXPECT_TRUE(Weekdays(0).isMonday());
EXPECT_TRUE(Weekdays(6).isSunday());
}
TEST(Weekdays, isXXX)
{
Weekdays none = Weekdays::none();
EXPECT_TRUE(none.isNone());
EXPECT_FALSE(none.isAll());
EXPECT_FALSE(none.isMonday());
EXPECT_FALSE(none.isTuesday());
EXPECT_FALSE(none.isWednesday());
EXPECT_FALSE(none.isThursday());
EXPECT_FALSE(none.isFriday());
EXPECT_FALSE(none.isSaturday());
EXPECT_FALSE(none.isSunday());
Weekdays all = Weekdays::all();
EXPECT_FALSE(all.isNone());
EXPECT_TRUE(all.isAll());
EXPECT_TRUE(all.isMonday());
EXPECT_TRUE(all.isTuesday());
EXPECT_TRUE(all.isWednesday());
EXPECT_TRUE(all.isThursday());
EXPECT_TRUE(all.isFriday());
EXPECT_TRUE(all.isSaturday());
EXPECT_TRUE(all.isSunday());
// Test that for all days, only their own isXXX function is true
std::vector days {Weekdays::monday(), Weekdays::tuesday(), Weekdays::wednesday(), Weekdays::thursday(),
Weekdays::friday(), Weekdays::saturday(), Weekdays::sunday()};
using BoolGetter = bool (Weekdays::*)() const;
std::vector getters {&Weekdays::isMonday, &Weekdays::isTuesday, &Weekdays::isWednesday,
&Weekdays::isThursday, &Weekdays::isFriday, &Weekdays::isSaturday, &Weekdays::isSunday};
for (int i = 0; i < days.size(); ++i)
{
Weekdays day = days[i];
EXPECT_FALSE(day.isNone());
EXPECT_FALSE(day.isAll());
for (int j = 0; j < getters.size(); ++j)
{
EXPECT_EQ(j == i, (day.*getters[j])()) << "on Day " << i << ": getter for day " << j << " has wrong result";
}
}
}
TEST(Weekdays, unionWith)
{
Weekdays day = Weekdays::monday().unionWith(Weekdays::saturday());
EXPECT_TRUE(day.isMonday());
EXPECT_TRUE(day.isSaturday());
day = Weekdays::monday() | Weekdays::tuesday() | Weekdays::all();
EXPECT_TRUE(day.isAll());
}
TEST(Weekdays, toString)
{
EXPECT_EQ("001", Weekdays(0).toString());
EXPECT_EQ("064", Weekdays(6).toString());
EXPECT_EQ("112", (Weekdays(6) | Weekdays(5) | Weekdays(4)).toString());
}