• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

heiglandreas / holidayChecker / 5771162338

pending completion
5771162338

push

github

web-flow
Merge pull request #157 from heiglandreas/refactoring

208 of 208 new or added lines in 20 files covered. (100.0%)

401 of 413 relevant lines covered (97.09%)

12.69 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

94.34
/src/CalendarDay.php
1
<?php
2

3
declare(strict_types=1);
4

5
/**
6
 * Copyright (c) Andreas Heigl<andreas@heigl.org>
7
 *
8
 * Licensed under the MIT-license. For details see the included file LICENSE.md
9
 */
10

11
namespace Org_Heigl\Holidaychecker;
12

13
use DateTimeInterface;
14
use IntlCalendar;
15

16
class CalendarDay
17
{
18
        /** @var int */
19
        private $day;
20

21
        /** @var int */
22
        private $month;
23

24
        /** @var int|null */
25
        private $year = null;
26

27
        /** @var IntlCalendar */
28
        private $calendar;
29

30
        public function __construct(int $day, int $month, IntlCalendar $calendar)
31
        {
32
                $this->day = $day;
54✔
33
                $this->month = $month;
54✔
34
                $this->calendar = $calendar;
54✔
35
                $this->calendar->set(IntlCalendar::FIELD_DAY_OF_MONTH, $day);
54✔
36
                $this->calendar->set(IntlCalendar::FIELD_MONTH, $month - 1);
54✔
37
                $this->calendar->set(IntlCalendar::FIELD_HOUR_OF_DAY, 12);
54✔
38
                $this->calendar->set(IntlCalendar::FIELD_MINUTE, 0);
54✔
39
                $this->calendar->set(IntlCalendar::FIELD_SECOND, 0);
54✔
40
                $this->calendar->set(IntlCalendar::FIELD_MILLISECOND, 0);
54✔
41
        }
42

43
        public function setYear(int $year): void
44
        {
45
                $this->year = $year;
8✔
46
                $this->calendar->set(IntlCalendar::FIELD_YEAR, $year);
8✔
47
        }
48

49
        public function setGregorianYear(int $year): void
50
        {
51
                $calendarYear = (int) $this->calendar->toDateTime()->format('Y');
1✔
52

53
                $diff = $year - $calendarYear;
1✔
54
                $realYear = $this->calendar->get(IntlCalendar::FIELD_YEAR);
1✔
55

56
                $this->year = $realYear + $diff;
1✔
57
                $this->calendar->add(IntlCalendar::FIELD_YEAR, $diff);
1✔
58
        }
59

60
        public function isSameDay(DateTimeInterface $dateTime): bool
61
        {
62
                $cal = clone $this->calendar;
33✔
63
                $cal->setTime($dateTime->getTimestamp() * 1000);
33✔
64

65
                if (null !== $this->year &&
33✔
66
                        $cal->get(IntlCalendar::FIELD_YEAR) !== $this->calendar->get(IntlCalendar::FIELD_YEAR)
33✔
67
                ) {
68
                        return false;
2✔
69
                }
70

71
                if ($cal->get(IntlCalendar::FIELD_MONTH) !== $this->calendar->get(IntlCalendar::FIELD_MONTH)) {
32✔
72
                        return false;
24✔
73
                }
74

75
                return $cal->get(IntlCalendar::FIELD_DAY_OF_MONTH) === $this->calendar->get(IntlCalendar::FIELD_DAY_OF_MONTH);
29✔
76
        }
77

78
        public function getCalendar(): IntlCalendar
79
        {
80
                return clone $this->calendar;
3✔
81
        }
82

83
        public function hasYearSet(): bool
84
        {
85
                return null !== $this->year;
3✔
86
        }
87

88
        public function isFollowUpDay(DateTimeInterface $dateTime, string $followUpDay): bool
89
        {
90
                return $this->isModifiedDate($dateTime, $followUpDay, 'next');
2✔
91
        }
92

93
        private function isModifiedDate(DateTimeInterface $dateTime, string $modifiedDay, string $direction): bool
94
        {
95
                $cal = clone $this->calendar;
2✔
96
                $cal = self::setGregorianYearForDate((int) $dateTime->format('Y'), $cal);
2✔
97
                $day = $cal->toDateTime();
2✔
98
                $day->modify($direction . ' ' . $modifiedDay);
2✔
99
                $cal->setTime($day->getTimestamp() * 1000);
2✔
100
                $cal2 = clone $this->calendar;
2✔
101
                $cal2->setTime($dateTime->getTimestamp() * 1000);
2✔
102

103
                if (null !== $this->year && $cal->get(IntlCalendar::FIELD_YEAR) !== $cal2->get(IntlCalendar::FIELD_YEAR)) {
2✔
104
                        return false;
×
105
                }
106

107
                if ($cal->get(IntlCalendar::FIELD_MONTH) !== $cal2->get(IntlCalendar::FIELD_MONTH)) {
2✔
108
                        return false;
×
109
                }
110

111
                return $cal->get(IntlCalendar::FIELD_DAY_OF_MONTH) === $cal2->get(IntlCalendar::FIELD_DAY_OF_MONTH);
2✔
112
        }
113

114
        public static function setGregorianYearForDate(int $year, IntlCalendar $calendar): IntlCalendar
115
        {
116
                $datetime = $calendar->toDateTime();
19✔
117
                $yearDiff = $year - (int) $datetime->format('Y');
19✔
118

119
                $calendar->set(IntlCalendar::FIELD_YEAR, $calendar->get(IntlCalendar::FIELD_YEAR) + $yearDiff);
19✔
120
                if ($calendar->toDateTime()->format('Y') < $year) {
19✔
121
                        $calendar->set(IntlCalendar::FIELD_YEAR, $calendar->get(IntlCalendar::FIELD_YEAR) + 1);
×
122
                }
123
                if ($calendar->toDateTime()->format('Y') > $year) {
19✔
124
                        $calendar->set(IntlCalendar::FIELD_YEAR, $calendar->get(IntlCalendar::FIELD_YEAR) - 1);
4✔
125
                }
126

127
                return $calendar;
19✔
128
        }
129

130
        public function getWeekdayForGregorianYear(int $year): int
131
        {
132
                $cal = $this->getDayForGregorianYear($year);
17✔
133

134
                return $cal->get(IntlCalendar::FIELD_DAY_OF_WEEK);
17✔
135
        }
136

137
        private function getDayForGregorianYear(int $gregorianYear): IntlCalendar
138
        {
139
                $cal = clone $this->calendar;
17✔
140
                $cal->set(IntlCalendar::FIELD_MONTH, $this->month - 1);
17✔
141
                $cal->set(IntlCalendar::FIELD_DAY_OF_MONTH, $this->day);
17✔
142

143
                return self::setGregorianYearForDate($gregorianYear, $cal);
17✔
144
        }
145
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc