Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / t / helper / datetime.t
1 use Test::More tests => 60;
2
3 use lib 't';
4
5 use Data::Dumper;
6
7 use DateTime;
8 use_ok 'SL::Helper::DateTime';
9
10 my $local_tz   = DateTime::TimeZone->new(name => 'local');
11 my $mon_012345 = DateTime->new(year => 2014, month => 6, day => 23, hour => 1, minute => 23, second => 45, time_zone => $local_tz);
12
13 sub mon { DateTime->new(year => 2014, month => 6, day => 23) }
14 sub tue { DateTime->new(year => 2014, month => 6, day => 24) }
15 sub wed { DateTime->new(year => 2014, month => 6, day => 25) }
16 sub thu { DateTime->new(year => 2014, month => 6, day => 26) }
17 sub fri { DateTime->new(year => 2014, month => 6, day => 27) }
18 sub sat { DateTime->new(year => 2014, month => 6, day => 28) }
19 sub sun { DateTime->new(year => 2014, month => 6, day => 29) }
20
21
22 is mon->add_businessdays(days => 5)->day_of_week, 1, "mon + 5 => mon";
23 is mon->add_businessdays(days => 12)->day_of_week, 3, "mon + 12 => wed";
24 is fri->add_businessdays(days => 2)->day_of_week, 2, "fri + 2 => tue";
25 is tue->add_businessdays(days => 9)->day_of_week, 1, "tue + 9 => mon";
26 is tue->add_businessdays(days => 8)->day_of_week, 5, "tue + 8 => fri";
27
28 # same with 6day week
29 is mon->add_businessdays(businessweek => 6, days => 5)->day_of_week, 6, "mon + 5 => sat (6dw)";
30 is mon->add_businessdays(businessweek => 6, days => 12)->day_of_week, 1, "mon + 12 => mon (6dw)";
31 is fri->add_businessdays(businessweek => 6, days => 2)->day_of_week, 1, "fri + 2 => mon (6dw)";
32 is tue->add_businessdays(businessweek => 6, days => 9)->day_of_week, 5, "tue + 9 => fri (6dw)";
33 is tue->add_businessdays(businessweek => 6, days => 8)->day_of_week, 4, "tue + 8 => thu (6dw)";
34
35 # absolute dates
36
37 is mon->add_businessdays(days => 5), mon->add(days => 7), "mon + 5 => mon (date)";
38 is mon->add_businessdays(days => 12), mon->add(days => 16), "mon + 12 => wed (date)";
39 is fri->add_businessdays(days => 2), fri->add(days => 4), "fri + 2 => tue (date)";
40 is tue->add_businessdays(days => 9), tue->add(days => 13), "tue + 9 => mon (date)";
41 is tue->add_businessdays(days => 8), tue->add(days => 10), "tue + 8 => fri (date)";
42
43 # same with 6day week
44 is mon->add_businessdays(businessweek => 6, days => 5), mon->add(days => 5), "mon + 5 => sat (date) (6dw)";
45 is mon->add_businessdays(businessweek => 6, days => 12), mon->add(days => 14), "mon + 12 => mon (date) (6dw)";
46 is fri->add_businessdays(businessweek => 6, days => 2), fri->add(days => 3), "fri + 2 => mon (date) (6dw)";
47 is tue->add_businessdays(businessweek => 6, days => 9), tue->add(days => 10), "tue + 9 => fri (date) (6dw)";
48 is tue->add_businessdays(businessweek => 6, days => 8), tue->add(days => 9), "tue + 8 => thu (date) (6dw)";
49
50
51 # same with subtract
52
53 is mon->subtract_businessdays(days => 5)->day_of_week, 1, "mon - 5 => mon";
54 is mon->subtract_businessdays(days => 12)->day_of_week, 4, "mon - 12 => thu";
55 is fri->subtract_businessdays(days => 2)->day_of_week, 3, "fri - 2 => wed";
56 is tue->subtract_businessdays(days => 9)->day_of_week, 3, "tue - 9 => wed";
57 is tue->subtract_businessdays(days => 8)->day_of_week, 4, "tue - 8 => thu";
58
59 # same with 6day week
60 is mon->subtract_businessdays(businessweek => 6, days => 5)->day_of_week, 2, "mon - 5 => tue (6dw)";
61 is mon->subtract_businessdays(businessweek => 6, days => 12)->day_of_week, 1, "mon - 12 => mon (6dw)";
62 is fri->subtract_businessdays(businessweek => 6, days => 4)->day_of_week, 1, "fri - 4 => mon (6dw)";
63 is tue->subtract_businessdays(businessweek => 6, days => 9)->day_of_week, 5, "tue - 9 => fri (6dw)";
64 is tue->subtract_businessdays(businessweek => 6, days => 8)->day_of_week, 6, "tue - 8 => sat (6dw)";
65
66 # absolute dates
67
68 is mon->subtract_businessdays(days => 5), mon->add(days => -7), "mon - 5 => mon (date)";
69 is mon->subtract_businessdays(days => 12), mon->add(days => -18), "mon - 12 => thu (date)";
70 is fri->subtract_businessdays(days => 2), fri->add(days => -2), "fri - 2 => wed (date)";
71 is tue->subtract_businessdays(days => 9), tue->add(days => -13), "tue - 9 => wed (date)";
72 is tue->subtract_businessdays(days => 8), tue->add(days => -12), "tue - 8 => thu (date)";
73
74 # same with 6day week
75 is mon->subtract_businessdays(businessweek => 6, days => 5), mon->add(days => -6), "mon - 5 => tue (date) (6dw)";
76 is mon->subtract_businessdays(businessweek => 6, days => 12), mon->add(days => -14), "mon - 12 => mon (date) (6dw)";
77 is fri->subtract_businessdays(businessweek => 6, days => 4), fri->add(days => -4), "fri - 4 => mon (date) (6dw)";
78 is tue->subtract_businessdays(businessweek => 6, days => 9), tue->add(days => -11), "tue - 9 => fri (date) (6dw)";
79 is tue->subtract_businessdays(businessweek => 6, days => 8), tue->add(days => -10), "tue - 8 => sat (date) (6dw)";
80
81 # add with negative days?
82 is mon->add_businessdays(businessweek => 6, days => -5), mon->add(days => -6), "mon - 5 => tue (date) (6dw)";
83 is mon->add_businessdays(businessweek => 6, days => -12), mon->add(days => -14), "mon - 12 => mon (date) (6dw)";
84 is fri->add_businessdays(businessweek => 6, days => -4), fri->add(days => -4), "fri - 4 => mon (date) (6dw)";
85 is tue->add_businessdays(businessweek => 6, days => -9), tue->add(days => -11), "tue - 9 => fri (date) (6dw)";
86 is tue->add_businessdays(businessweek => 6, days => -8), tue->add(days => -10), "tue - 8 => sat (date) (6dw)";
87
88 # what if staring date falls into eekend?
89 is sun->add_businessdays(days => 1), sun->add(days => 1), "1 day after sun is mon";
90 is sat->add_businessdays(days => 1), sat->add(days => 2), "1 day after sut is mon";
91 is sun->add_businessdays(days => -1), sun->add(days => -2), "1 day before sun is fri";
92 is sat->add_businessdays(days => -1), sat->add(days => -1), "1 day before sut is fri";
93
94 # parsing YYYY-MM-DD formatted strings
95 is(DateTime->from_ymd(),                                 undef,                                     "no argument results in undef");
96 is(DateTime->from_ymd(''),                               undef,                                     "empty argument results in undef");
97 is(DateTime->from_ymd('chunky bacon'),                   undef,                                     "invalid argument results in undef");
98 is(DateTime->from_ymd('2014-06-23'),                     $mon_012345->clone->truncate(to => 'day'), "2014-06-23 is parsed correctly");
99 is(DateTime->from_ymd('2014-06-23')->strftime('%H%M%S'), '000000',                                  "2014-06-23 is parsed correctly");
100
101 # parsing YYYY-MM-DDTHH:MM:SS formatted strings
102 is(DateTime->from_ymdhms(),                      undef,       "no argument results in undef");
103 is(DateTime->from_ymdhms(''),                    undef,       "empty argument results in undef");
104 is(DateTime->from_ymdhms('chunky bacon'),        undef,       "invalid argument results in undef");
105 is(DateTime->from_ymdhms('2014-06-23T01:23:45'), $mon_012345, "2014-06-23T01:23:45 is parsed correctly");
106 is(DateTime->from_ymdhms('2014-06-23 01:23:45'), $mon_012345, "2014-06-23 01:23:45 is parsed correctly");