lib/timecop/time_stack_item.rb in timecop-0.9.8 vs lib/timecop/time_stack_item.rb in timecop-0.9.9
- old
+ new
@@ -7,10 +7,11 @@
def initialize(mock_type, *args)
raise "Unknown mock_type #{mock_type}" unless [:freeze, :travel, :scale].include?(mock_type)
@travel_offset = @scaling_factor = nil
@scaling_factor = args.shift if mock_type == :scale
@mock_type = mock_type
+ @monotonic = parse_monotonic_time(*args) if RUBY_VERSION >= '2.1.0'
@time = parse_time(*args)
@time_was = Time.now_without_mock_time
@travel_offset = compute_travel_offset
end
@@ -52,10 +53,30 @@
def scaling_factor
@scaling_factor
end
+ if RUBY_VERSION >= '2.1.0'
+ def monotonic
+ if travel_offset.nil?
+ @monotonic
+ elsif scaling_factor.nil?
+ current_monotonic + travel_offset * (10 ** 9)
+ else
+ (@monotonic + (current_monotonic - @monotonic) * scaling_factor).to_i
+ end
+ end
+
+ def current_monotonic
+ Process.clock_gettime_without_mock(Process::CLOCK_MONOTONIC, :nanosecond)
+ end
+
+ def current_monotonic_with_mock
+ Process.clock_gettime_mock_time(Process::CLOCK_MONOTONIC, :nanosecond)
+ end
+ end
+
def time(time_klass = Time) #:nodoc:
if @time.respond_to?(:in_time_zone)
time = time_klass.at(@time.dup.localtime)
else
time = time_klass.at(@time)
@@ -93,9 +114,19 @@
((24.0 / rational.denominator) * rational.numerator) * (60 * 60)
end
def utc_offset_to_rational(utc_offset)
Rational(utc_offset, 24 * 60 * 60)
+ end
+
+ def parse_monotonic_time(*args)
+ arg = args.shift
+ offset_in_nanoseconds = if args.empty? && (arg.kind_of?(Integer) || arg.kind_of?(Float))
+ arg * 1_000_000_000
+ else
+ 0
+ end
+ current_monotonic_with_mock + offset_in_nanoseconds
end
def parse_time(*args)
arg = args.shift
if arg.is_a?(Time)