From 2a3b8914e5042116a5636b84de29eb37a2aa8441 Mon Sep 17 00:00:00 2001 From: Per Malmberg Date: Thu, 14 Mar 2019 22:29:22 +0100 Subject: [PATCH] #1 - Randomization tests green. --- libcron/include/libcron/CronRandomization.h | 26 +++-- libcron/src/CronRandomization.cpp | 9 +- test/CronRandomizationTest.cpp | 108 +++++++++----------- 3 files changed, 67 insertions(+), 76 deletions(-) diff --git a/libcron/include/libcron/CronRandomization.h b/libcron/include/libcron/CronRandomization.h index 34c7524..338597f 100644 --- a/libcron/include/libcron/CronRandomization.h +++ b/libcron/include/libcron/CronRandomization.h @@ -61,17 +61,21 @@ namespace libcron std::to_string(left) + "-" + std::to_string(right), numbers); // Remove items outside limits. -// for(auto it = numbers.begin(); it != numbers.end();) -// { -// if(CronData::value_of(*it) < limit.first || CronData::value_of(*it) > limit.second) -// { -// it = numbers.erase(it); -// } -// else -// { -// ++it; -// } -// } + if(limit.first != -1 && limit.second != -1) + { + for (auto it = numbers.begin(); + it != numbers.end();) + { + if (CronData::value_of(*it) < limit.first || CronData::value_of(*it) > limit.second) + { + it = numbers.erase(it); + } + else + { + ++it; + } + } + } if (res.first) { diff --git a/libcron/src/CronRandomization.cpp b/libcron/src/CronRandomization.cpp index 62d7188..107164e 100644 --- a/libcron/src/CronRandomization.cpp +++ b/libcron/src/CronRandomization.cpp @@ -49,7 +49,7 @@ namespace libcron std::set month_range{}; if (selected_value == -1) { - // Month is not specific, we need to get the 'max minimum' day of month to use. + // Month is not specific, get the range. CronData cr; res &= cr.convert_from_string_range_to_number_range(all_sections[5].str(), month_range); } @@ -77,7 +77,7 @@ namespace libcron std::pair CronRandomization::day_limiter(const std::set& months) { - auto max = 31; + int max = CronData::value_of(DayOfMonth::Last); for (auto month : months) { @@ -90,12 +90,9 @@ namespace libcron CronData::months_with_31.end(), month) == CronData::months_with_31.end()) { + // Not among the months with 31 days max = std::min(max, 30); } - else - { - max = std::min(max, 31); - } } auto res = std::pair{ CronData::value_of(DayOfMonth::First), max }; diff --git a/test/CronRandomizationTest.cpp b/test/CronRandomizationTest.cpp index 6b6e8df..7ac08c9 100644 --- a/test/CronRandomizationTest.cpp +++ b/test/CronRandomizationTest.cpp @@ -8,81 +8,71 @@ using namespace libcron; +void test(const char* const random_schedule) +{ + libcron::CronRandomization cr; + std::unordered_map> results{}; + + for (int i = 0; i < 10000; ++i) + { + auto res = cr.parse(random_schedule); + REQUIRE(std::get<0>(res)); + auto schedule = std::get<1>(res); + + INFO("schedule:" << schedule); + Cron<> cron; + REQUIRE(cron.add_schedule("validate schedule", schedule, []() {})); + } +} + SCENARIO("Randomize all the things") { - const char* full_random = "R(0-59) R(0-59) R(0-23) R(1-31) R(1-12) ?"; - Cron<> cron; + const char* random_schedule = "R(0-59) R(0-59) R(0-23) R(1-31) R(1-12) ?"; - GIVEN(full_random) + GIVEN(random_schedule) { THEN("Only valid schedules generated") { - libcron::CronRandomization cr; - std::unordered_map> results{}; - - for (int i = 0; i < 1000; ++i) - { - auto res = cr.parse(full_random); - REQUIRE(std::get<0>(res)); - auto schedule = std::get<1>(res); - - auto start = schedule.begin(); - auto space = std::find(schedule.begin(), schedule.end(), ' '); - - for (int section = 0; start != schedule.end() && section < 5; ++section) - { - auto& map = results[section]; - auto s = std::string{start, space}; - auto value = std::stoi(s); - map[value]++; - start = space + 1; - space = std::find(start, schedule.end(), ' '); - } - - REQUIRE(results.size() == 5); - INFO("schedule:" << schedule); - REQUIRE(cron.add_schedule("validate schedule", schedule, []() {})); - } + test(random_schedule); } } } SCENARIO("Randomize all the things with reverse ranges") { - // Only generate DayOfMonth up to 28 to prevent failing tests where the month doesn't have more days. - const char* full_random = "R(45-15) R(30-0) R(18-2) R(28-15) 2 ?"; - Cron<> cron; + const char* random_schedule = "R(45-15) R(30-0) R(18-2) R(28-15) R(8-3) ?"; - GIVEN(full_random) + GIVEN(random_schedule) { THEN("Only valid schedules generated") { - libcron::CronRandomization cr; - std::unordered_map> results{}; - - for (int i = 0; i < 1000; ++i) - { - auto res = cr.parse(full_random); - REQUIRE(std::get<0>(res)); - auto schedule = std::get<1>(res); - - auto start = schedule.begin(); - auto space = std::find(schedule.begin(), schedule.end(), ' '); - - for (int section = 0; start != schedule.end() && section < 5; ++section) - { - auto& map = results[section]; - auto s = std::string{start, space}; - auto value = std::stoi(s); - map[value]++; - start = space + 1; - space = std::find(start, schedule.end(), ' '); - } - - REQUIRE(results.size() == 5); - INFO("schedule:" << schedule); - REQUIRE(cron.add_schedule("validate schedule", schedule, []() {})); - } + test(random_schedule); + } + } +} + +SCENARIO("Randomize all the things - day of week") +{ + const char* random_schedule = "R(0-59) R(0-59) R(0-23) ? R(1-12) R(0-6)"; + + GIVEN(random_schedule) + { + THEN("Only valid schedules generated") + { + test(random_schedule); + } + } +} + +SCENARIO("Randomize all the things with reverse ranges - day of week") +{ + const char* random_schedule = "R(45-15) R(30-0) R(18-2) ? R(8-3) R(4-1)"; + + GIVEN(random_schedule) + { + THEN("Only valid schedules generated") + { + test(random_schedule); } } }