/
time_stack_item.cr
58 lines (51 loc) · 1.47 KB
/
time_stack_item.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
module Timecop
enum MockType
Freeze
Travel
Scale
end
class TimeStackItem
getter mock_type : MockType
delegate :year, :month, :day, :hour, :minute, :second,
to: @time
@prev_time : Time
@monotonic : Time::Span
def initialize(@mock_type : MockType, @time : Time, @scaling_factor : Float64 = 1.0)
@prev_time = Time.local_without_mock_time
@monotonic = Time.monotonic_without_mock_time
end
def initialize(@mock_type : MockType, @scaling_factor : Float64 = 1.0)
initialize(@mock_type, Time.local, @scaling_factor)
end
# :nodoc:
def time(location : Time::Location = Time::Location.local) : Time
case @mock_type
when .freeze?
@time.in(location)
when .travel?
offset = @time - @prev_time
Time.local_without_mock_time(location) + offset
when .scale?
diff = Time.local_without_mock_time(location) - @prev_time
@time + (diff * @scaling_factor)
else
raise "Unknown mock_type #{@mock_type}"
end
end
# :nodoc:
def monotonic : Time::Span
case @mock_type
when .freeze?
@monotonic + (@time - @prev_time)
when .travel?
offset = @time - @prev_time
Time.monotonic_without_mock_time + offset
when .scale?
diff = Time.monotonic_without_mock_time - @monotonic
@monotonic + (diff * @scaling_factor)
else
raise "Unknown mock_type #{@mock_type}"
end
end
end
end