Completed
Push — master ( dfdf66...d12fc2 )
by Frank
02:19
created

TestClock   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 53
Duplicated Lines 0 %

Test Coverage

Coverage 90%

Importance

Changes 4
Bugs 0 Features 0
Metric Value
eloc 15
dl 0
loc 53
ccs 18
cts 20
cp 0.9
rs 10
c 4
b 0
f 0
wmc 8

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 2
A tick() 0 3 1
A dateTime() 0 3 1
A pointInTime() 0 3 1
A fixate() 0 10 2
A timeZone() 0 3 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace EventSauce\EventSourcing\Time;
6
7
use DateTimeImmutable;
8
use DateTimeZone;
9
use EventSauce\EventSourcing\PointInTime;
10
use InvalidArgumentException;
11
12
class TestClock implements Clock
13
{
14
    /**
15
     * @private
16
     */
17
    const FORMAT_OF_TIME = 'Y-m-d H:i:s.uO';
18
19
    /**
20
     * @var DateTimeImmutable
21
     */
22
    private $time;
23
24
    /**
25
     * @var DateTimeZone
26
     */
27
    private $timeZone;
28
29 24
    public function __construct(DateTimeZone $timeZone = null)
30
    {
31 24
        $this->timeZone = $timeZone ?: new DateTimeZone('UTC');
32 24
        $this->tick();
33 24
    }
34
35 24
    public function tick(): void
36
    {
37 24
        $this->time = new DateTimeImmutable('now', $this->timeZone);
38 24
    }
39
40 2
    public function fixate(string $input): void
41
    {
42 2
        $preciseTime = sprintf('%s.000000', $input);
43 2
        $dateTime = DateTimeImmutable::createFromFormat('Y-m-d H:i:s.u', $preciseTime, $this->timeZone);
44
45 2
        if ( ! $dateTime instanceof DateTimeImmutable) {
46 1
            throw new InvalidArgumentException("Invalid input for date/time fixation provided: {$input}");
47
        }
48
49 1
        $this->time = $dateTime;
50 1
    }
51
52 8
    public function dateTime(): DateTimeImmutable
53
    {
54 8
        return $this->time;
55
    }
56
57 5
    public function pointInTime(): PointInTime
58
    {
59 5
        return PointInTime::fromDateTime($this->dateTime());
60
    }
61
62
    public function timeZone(): DateTimeZone
63
    {
64
        return $this->timeZone;
65
    }
66
}
67