You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
5.4 KiB
145 lines
5.4 KiB
// License: Apache 2.0. See LICENSE file in root directory.
|
|
// Copyright(c) 2020 Intel Corporation. All Rights Reserved.
|
|
|
|
//#cmake:dependencies rsutils
|
|
|
|
#include "common.h"
|
|
#include <rsutils/time/work-week.h>
|
|
#include <ctime>
|
|
|
|
using namespace rsutils::time;
|
|
|
|
// Test description:
|
|
// > Test the c'tor
|
|
TEST_CASE( "test work_week c'tor", "[work_week]" )
|
|
{
|
|
tm set_time = { 0 };
|
|
set_time.tm_year = 117; // 2017
|
|
set_time.tm_mday = 1;
|
|
set_time.tm_isdst = -1;
|
|
// The work week of the first day of the year is 1 because work weeks are 1 based
|
|
work_week first_day( std::mktime( &set_time ) );
|
|
CHECK( first_day.get_work_week() == 1 );
|
|
set_time.tm_mday = 7;
|
|
set_time.tm_wday = 6;
|
|
// This should be the last day of the first work week because 2017 started on Sunday
|
|
work_week sixth_day( std::mktime( &set_time ) );
|
|
CHECK( sixth_day.get_work_week() == 1 );
|
|
set_time.tm_mday = 8;
|
|
set_time.tm_wday = 0;
|
|
// This should be the first day of the second work week
|
|
work_week seventh_day( std::mktime( &set_time ) );
|
|
CHECK( seventh_day.get_work_week() == 2 );
|
|
// If the year didn't start on a Sunday (for example 2018), Jan 7th should be in work week 2
|
|
set_time.tm_year = 118; // 2018
|
|
set_time.tm_mday = 7;
|
|
work_week second_week( std::mktime( &set_time ) );
|
|
CHECK( second_week.get_work_week() == 2 );
|
|
|
|
// Checking valid and invalid wprk weeks
|
|
CHECK_THROWS_WITH( work_week( 2020, 0 ),
|
|
"Invalid work week given: 2020 doesn't have a work week 0" );
|
|
CHECK_THROWS_WITH( work_week( 2020, 53 ),
|
|
"Invalid work week given: 2020 doesn't have a work week 53" );
|
|
CHECK_NOTHROW( work_week( 2016, 53 ) );
|
|
|
|
// checking edge case of 31st of December is actualy part of work week 1 of the next year
|
|
set_time.tm_year = 117; // 2017
|
|
set_time.tm_mon = 11; // December (it's 0 based)
|
|
set_time.tm_mday = 31;
|
|
work_week belons_to_next_year( std::mktime( &set_time ) );
|
|
CHECK( belons_to_next_year.get_work_week() == 1 );
|
|
CHECK( belons_to_next_year.get_year() == 2018 );
|
|
}
|
|
|
|
// Test description:
|
|
// > Test all work_week creation options are equivalent
|
|
TEST_CASE( "test work_week c'tor equivalence", "[work_week]" )
|
|
{
|
|
// Compare current with c'tor using current time
|
|
auto current_ww = work_week::current();
|
|
auto now = std::time( nullptr );
|
|
work_week now_to_work_week( now );
|
|
CHECK( current_ww.get_year() == now_to_work_week.get_year() );
|
|
CHECK( current_ww.get_work_week() == now_to_work_week.get_work_week() );
|
|
|
|
// Test copy c'tor
|
|
work_week copy( current_ww );
|
|
CHECK( current_ww.get_year() == copy.get_year() );
|
|
CHECK( current_ww.get_work_week() == copy.get_work_week() );
|
|
|
|
// Compare manual c'tor with c'tor from given time
|
|
tm set_time = { 0 };
|
|
set_time.tm_year = 117; // 2017
|
|
set_time.tm_mday = 1;
|
|
set_time.tm_isdst = -1;
|
|
work_week manual( 2017, 1 );
|
|
work_week from_time( std::mktime( &set_time ) );
|
|
CHECK( manual.get_year() == from_time.get_year() );
|
|
CHECK( manual.get_work_week() == from_time.get_work_week() );
|
|
}
|
|
|
|
// Test description:
|
|
// > Test the subtraction operator for work_week
|
|
TEST_CASE( "test work_week subtraction", "[work_week]" )
|
|
{
|
|
// Simple cases
|
|
CHECK( work_week( 2019, 7 ) - work_week( 2018, 7 ) == 52 );
|
|
CHECK( work_week( 2019, 7 ) - work_week( 2018, 3 ) == 56 );
|
|
CHECK( work_week( 2019, 7 ) - work_week( 2018, 10 ) == 49 );
|
|
|
|
// Simple cases with negative results
|
|
CHECK( work_week( 2018, 7 ) - work_week( 2019, 7 ) == -52 );
|
|
CHECK( work_week( 2018, 3 ) - work_week( 2019, 7 ) == -56 );
|
|
CHECK( work_week( 2018, 10 ) - work_week( 2019, 7 ) == -49 );
|
|
|
|
// 2016 had 53 work weeks
|
|
CHECK( work_week( 2017, 7 ) - work_week( 2016, 7 ) == 53 );
|
|
CHECK( work_week( 2017, 7 ) - work_week( 2016, 3 ) == 57 );
|
|
CHECK( work_week( 2017, 7 ) - work_week( 2016, 10 ) == 50 );
|
|
CHECK( work_week( 2017, 1 ) - work_week( 2016, 52 ) == 2 );
|
|
|
|
// Subtraction of consecutive weeks
|
|
CHECK( work_week( 2017, 1 ) - work_week( 2016, 53 ) == 1 );
|
|
tm Jan_1_2017 = { 0 };
|
|
Jan_1_2017.tm_year = 117; // 2017
|
|
Jan_1_2017.tm_mon = 0; // January (it's 0 based)
|
|
Jan_1_2017.tm_mday = 1;
|
|
Jan_1_2017.tm_wday = 0;
|
|
Jan_1_2017.tm_yday = 0;
|
|
Jan_1_2017.tm_isdst = -1;
|
|
tm Dec_31_2016 = { 0 };
|
|
Dec_31_2016.tm_year = 116; // 2016
|
|
Dec_31_2016.tm_mon = 11; // December (it's 0 based)
|
|
Dec_31_2016.tm_mday = 31;
|
|
Dec_31_2016.tm_wday = 5;
|
|
Dec_31_2016.tm_yday = 365;
|
|
Dec_31_2016.tm_isdst = -1;
|
|
CHECK( work_week( std::mktime( &Jan_1_2017 ) ) - work_week( std::mktime( &Dec_31_2016 ) )
|
|
== 1 );
|
|
|
|
// Subtracting days from the same work week. December 31st 2017 is part of work week 1 of 2018
|
|
tm Jan_1_2018 = { 0 };
|
|
Jan_1_2018.tm_year = 118; // 2018
|
|
Jan_1_2018.tm_mon = 0; // January (it's 0 based)
|
|
Jan_1_2018.tm_mday = 1;
|
|
Jan_1_2018.tm_isdst = -1;
|
|
tm Dec_31_2017 = { 0 };
|
|
Dec_31_2017.tm_year = 117; // 2017
|
|
Dec_31_2017.tm_mon = 11; // December (it's 0 based)
|
|
Dec_31_2017.tm_mday = 31;
|
|
Dec_31_2017.tm_isdst = -1;
|
|
CHECK( work_week( std::mktime( &Jan_1_2018 ) ) - work_week( std::mktime( &Dec_31_2017 ) )
|
|
== 0 );
|
|
}
|
|
|
|
// Test description:
|
|
// > Test the get_work_weeks_since function
|
|
TEST_CASE( "test get_work_weeks_since", "[work_week]" )
|
|
{
|
|
CHECK( get_work_weeks_since( work_week::current() ) == 0 );
|
|
|
|
work_week zero( 0, 1 );
|
|
CHECK( get_work_weeks_since( zero ) == work_week::current() - zero );
|
|
}
|