Skip to content

Commit d9773a7

Browse files
authored
Refactor tests (#12)
* Test each state separately * Refactor tests
1 parent 7d20714 commit d9773a7

File tree

7 files changed

+412
-213
lines changed

7 files changed

+412
-213
lines changed

src/DateRange.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,14 @@ public function setEndDate(DateTimeInterface $end): DateRangeInterface
146146
return $clone;
147147
}
148148

149+
/**
150+
* {@inheritdoc}
151+
*/
152+
public function isFinite(): bool
153+
{
154+
return $this->hasStartDate() && $this->hasEndDate();
155+
}
156+
149157
/**
150158
* {@inheritdoc}
151159
*/
@@ -170,7 +178,7 @@ public function isStarted(): bool
170178
if ($this->hasStartDate()) {
171179
return $this->state->compareStartDate(new DateTimeImmutable()) <= 0;
172180
} else {
173-
return $this->hasEndDate();
181+
return !$this->isEnded();
174182
}
175183
}
176184

src/DateRangeInterface.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,13 @@ public function setStartDate(DateTimeInterface $start): DateRangeInterface;
7373
*/
7474
public function setEndDate(DateTimeInterface $end): DateRangeInterface;
7575

76+
/**
77+
* Returns whether the starting and ending date is defined.
78+
*
79+
* @return bool
80+
*/
81+
public function isFinite(): bool;
82+
7683
/**
7784
* Tells whether range is started at specific date.
7885
*

tests/DateRangeTest.php

Lines changed: 42 additions & 212 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@
1212

1313
use DateInterval;
1414
use DateTimeImmutable;
15-
use DateTimeZone;
16-
use DomainException;
1715
use PHPUnit\Framework\TestCase;
18-
use Zee\DateRange\States\UndefinedRange;
1916

2017
/**
2118
* Class DateRangeTest.
@@ -25,247 +22,80 @@ class DateRangeTest extends TestCase
2522
/**
2623
* @test
2724
*/
28-
public function undefinedRange()
25+
public function rangeIsCastingToString()
2926
{
30-
$now = new DateTimeImmutable();
31-
$actual = new DateRange();
32-
33-
self::assertFalse($actual->hasStartDate());
34-
self::assertFalse($actual->hasEndDate());
35-
self::assertFalse($actual->isStarted());
36-
self::assertFalse($actual->isEnded());
37-
self::assertFalse($actual->isStartedOn($now));
38-
self::assertFalse($actual->isEndedOn($now));
39-
self::assertSame('-/-', (string) $actual);
40-
self::assertSame(
41-
json_encode(['startDate' => null, 'endDate' => null]),
42-
json_encode($actual)
43-
);
44-
45-
$changed = $actual->setStartDate($now);
46-
47-
self::assertNotSame($actual, $changed);
48-
self::assertSame($now, $changed->getStartDate());
49-
50-
$changed = $actual->setEndDate($now);
51-
52-
self::assertNotSame($actual, $changed);
53-
self::assertSame($now, $changed->getEndDate());
54-
}
55-
56-
/**
57-
* @test
58-
*/
59-
public function undefinedRangeHasNostartDate()
60-
{
61-
$actual = new DateRange();
62-
63-
$this->expectException(DomainException::class);
64-
$this->expectExceptionMessage('Range start is undefined');
65-
66-
$actual->getStartDate();
67-
}
68-
69-
/**
70-
* @test
71-
*/
72-
public function undefinedRangeHasNoendDate()
73-
{
74-
$actual = new DateRange();
75-
76-
$this->expectException(DomainException::class);
77-
$this->expectExceptionMessage('Range end is undefined');
78-
79-
$actual->getEndDate();
80-
}
81-
82-
/**
83-
* @test
84-
*/
85-
public function cannotCompareUndefinedStart()
86-
{
87-
$actual = new UndefinedRange();
88-
89-
$this->expectException(DomainException::class);
90-
$this->expectExceptionMessage('Range start is undefined');
91-
92-
$actual->compareStartDate(new DateTimeImmutable());
93-
}
94-
95-
/**
96-
* @test
97-
*/
98-
public function cannotCompareUndefinedEnd()
99-
{
100-
$actual = new UndefinedRange();
101-
102-
$this->expectException(DomainException::class);
103-
$this->expectExceptionMessage('Range end is undefined');
27+
$yesterday = new DateTimeImmutable('-1 day');
28+
$tomorrow = new DateTimeImmutable('+1 day');
10429

105-
$actual->compareEndDate(new DateTimeImmutable());
30+
self::assertSame('-/-', (string) new DateRange());
31+
self::assertSame("{$yesterday->format('c')}/-", (string) new DateRange($yesterday));
32+
self::assertSame("-/{$tomorrow->format('c')}", (string) new DateRange(null, $tomorrow));
33+
self::assertSame("{$yesterday->format('c')}/{$tomorrow->format('c')}", (string) new DateRange($yesterday, $tomorrow));
10634
}
10735

10836
/**
10937
* @test
11038
*/
111-
public function infiniteEndRange()
39+
public function rangeIsJsonSerializable()
11240
{
113-
$now = new DateTimeImmutable();
41+
$yesterday = new DateTimeImmutable('-1 day');
11442
$tomorrow = new DateTimeImmutable('+1 day');
115-
$actual = new DateRange($now);
11643

117-
self::assertTrue($actual->hasStartDate());
118-
self::assertFalse($actual->hasEndDate());
119-
self::assertTrue($actual->isStarted());
120-
self::assertFalse($actual->isEnded());
121-
self::assertTrue($actual->isStartedOn($now));
122-
self::assertFalse($actual->isStartedOn($tomorrow));
123-
self::assertFalse($actual->isEndedOn($now));
124-
self::assertSame("{$now->format('c')}/-", (string) $actual);
12544
self::assertSame(
126-
json_encode(['startDate' => $now->format('c'), 'endDate' => null]),
127-
json_encode($actual)
45+
json_encode(['startDate' => null, 'endDate' => null]),
46+
json_encode(new DateRange())
12847
);
129-
130-
$changed = $actual->setStartDate($tomorrow);
131-
132-
self::assertNotSame($actual, $changed);
133-
self::assertSame($tomorrow, $changed->getStartDate());
134-
135-
$changed = $actual->setEndDate($tomorrow);
136-
137-
self::assertNotSame($actual, $changed);
138-
self::assertSame($now, $changed->getStartDate());
139-
self::assertSame($tomorrow, $changed->getEndDate());
140-
}
141-
142-
/**
143-
* @test
144-
*/
145-
public function infiniteEndRangeHasNoendDate()
146-
{
147-
$now = new DateTimeImmutable();
148-
$actual = new DateRange($now);
149-
150-
$this->expectException(DomainException::class);
151-
$this->expectExceptionMessage('Range end is undefined');
152-
153-
$actual->getEndDate();
154-
}
155-
156-
/**
157-
* @test
158-
*/
159-
public function infiniteStartRange()
160-
{
161-
$now = new DateTimeImmutable();
162-
$yesterday = new DateTimeImmutable('-1 day');
163-
$actual = new DateRange(null, $now);
164-
165-
self::assertFalse($actual->hasStartDate());
166-
self::assertTrue($actual->hasEndDate());
167-
self::assertTrue($actual->isStarted());
168-
self::assertFalse($actual->isEnded());
169-
self::assertFalse($actual->isStartedOn($now));
170-
self::assertTrue($actual->isEndedOn($now));
171-
self::assertFalse($actual->isEndedOn($yesterday));
172-
self::assertSame("-/{$now->format('c')}", (string) $actual);
17348
self::assertSame(
174-
json_encode(['startDate' => null, 'endDate' => $now->format('c')]),
175-
json_encode($actual)
49+
json_encode(['startDate' => $yesterday->format('c'), 'endDate' => null]),
50+
json_encode(new DateRange($yesterday))
51+
);
52+
self::assertSame(
53+
json_encode(['startDate' => null, 'endDate' => $tomorrow->format('c')]),
54+
json_encode(new DateRange(null, $tomorrow))
17655
);
177-
178-
$changed = $actual->setEndDate($yesterday);
179-
180-
self::assertNotSame($actual, $changed);
181-
self::assertSame($yesterday, $changed->getEndDate());
182-
self::assertTrue($changed->isEnded());
183-
184-
$changed = $actual->setStartDate($yesterday);
185-
186-
self::assertNotSame($actual, $changed);
187-
self::assertSame($yesterday, $changed->getStartDate());
188-
self::assertSame($now, $changed->getEndDate());
189-
}
190-
191-
/**
192-
* @test
193-
*/
194-
public function infiniteStartRangeHasNostartDate()
195-
{
196-
$now = new DateTimeImmutable();
197-
$actual = new DateRange(null, $now);
198-
199-
$this->expectException(DomainException::class);
200-
$this->expectExceptionMessage('Range start is undefined');
201-
202-
$actual->getStartDate();
203-
}
204-
205-
/**
206-
* @test
207-
*/
208-
public function finiteRange()
209-
{
210-
$now = new DateTimeImmutable();
211-
$yesterday = new DateTimeImmutable('-1 day');
212-
$tomorrow = new DateTimeImmutable('+1 day');
213-
$actual = new DateRange($yesterday, $tomorrow);
214-
215-
self::assertTrue($actual->hasStartDate());
216-
self::assertTrue($actual->hasEndDate());
217-
self::assertTrue($actual->isStarted());
218-
self::assertFalse($actual->isEnded());
219-
self::assertFalse($actual->isStartedOn($now));
220-
self::assertTrue($actual->isStartedOn($yesterday));
221-
self::assertFalse($actual->isEndedOn($now));
222-
self::assertTrue($actual->isEndedOn($tomorrow));
223-
self::assertSame("{$yesterday->format('c')}/{$tomorrow->format('c')}", (string) $actual);
22456
self::assertSame(
22557
json_encode(['startDate' => $yesterday->format('c'), 'endDate' => $tomorrow->format('c')]),
226-
json_encode($actual)
58+
json_encode(new DateRange($yesterday, $tomorrow))
22759
);
228-
229-
$changed = $actual->setEndDate($now);
230-
231-
self::assertNotSame($actual, $changed);
232-
self::assertSame($now, $changed->getEndDate());
233-
self::assertSame($yesterday, $changed->getStartDate());
234-
235-
$changed = $actual->setStartDate($now);
236-
237-
self::assertNotSame($actual, $changed);
238-
self::assertSame($now, $changed->getStartDate());
239-
self::assertSame($tomorrow, $changed->getEndDate());
24060
}
24161

24262
/**
24363
* @test
24464
*/
245-
public function setEndOnStart()
65+
public function checkRange()
24666
{
247-
$cet = new DateTimeImmutable('now', new DateTimeZone('CET'));
248-
$est = new DateTimeImmutable('now', new DateTimeZone('EST'));
249-
250-
self::assertSame($cet->getTimestamp(), $est->getTimestamp());
251-
252-
$this->expectExceptionMessage('Invalid end date, must be after start');
253-
254-
new DateRange($cet, $cet);
67+
$yesterday = new DateTimeImmutable('-1 day');
68+
$tomorrow = new DateTimeImmutable('+1 day');
69+
$range = new DateRange($yesterday, $tomorrow);
70+
71+
self::assertTrue($range->hasStartDate());
72+
self::assertTrue($range->hasEndDate());
73+
self::assertSame($yesterday, $range->getStartDate());
74+
self::assertSame($tomorrow, $range->getEndDate());
75+
self::assertNotSame($range, $range->setStartDate(new DateTimeImmutable()));
76+
self::assertNotSame($range, $range->setEndDate(new DateTimeImmutable()));
77+
self::assertTrue($range->isFinite());
78+
self::assertTrue($range->isStarted());
79+
self::assertFalse($range->isEnded());
80+
self::assertTrue($range->isStartedOn($yesterday));
81+
self::assertTrue($range->isEndedOn($tomorrow));
25582
}
25683

25784
/**
25885
* @test
25986
*/
260-
public function setEndBeforeStart()
87+
public function startedTillEndOnInfiniteStart()
26188
{
262-
$yesterday = new DateTimeImmutable('-1 day');
26389
$tomorrow = new DateTimeImmutable('+1 day');
90+
$yesterday = new DateTimeImmutable('-1 day');
91+
92+
$range = new DateRange(null, $tomorrow);
93+
94+
self::assertTrue($range->isStarted());
26495

265-
$this->expectException(DomainException::class);
266-
$this->expectExceptionMessage('Invalid end date, must be after start');
96+
$range = new DateRange(null, $yesterday);
26797

268-
new DateRange($tomorrow, $yesterday);
98+
self::assertFalse($range->isStarted());
26999
}
270100

271101
/**

0 commit comments

Comments
 (0)