lib/timecop/time_stack_item.rb in timecop-0.5.6 vs lib/timecop/time_stack_item.rb in timecop-0.5.7
- old
+ new
@@ -1,93 +1,100 @@
-
class Timecop
- # A data class for carrying around "time movement" objects. Makes it easy to keep track of the time
- # movements on a simple stack.
- class TimeStackItem #:nodoc:
- attr_reader :mock_type
+ # A data class for carrying around "time movement" objects. Makes it easy to keep track of the time
+ # movements on a simple stack.
+ class TimeStackItem #:nodoc:
+ attr_reader :mock_type
- def initialize(mock_type, *args)
- raise "Unknown mock_type #{mock_type}" unless [:freeze, :travel, :scale].include?(mock_type)
- @scaling_factor = args.shift if mock_type == :scale
- @mock_type = mock_type
- @time = parse_time(*args)
- @time_was = Time.now_without_mock_time
- @travel_offset = compute_travel_offset
- @dst_adjustment = compute_dst_adjustment(@time)
- end
+ def initialize(mock_type, *args)
+ raise "Unknown mock_type #{mock_type}" unless [:freeze, :travel, :scale].include?(mock_type)
+ @scaling_factor = args.shift if mock_type == :scale
+ @mock_type = mock_type
+ @time = parse_time(*args)
+ @time_was = Time.now_without_mock_time
+ @travel_offset = compute_travel_offset
+ @dst_adjustment = compute_dst_adjustment(@time)
+ end
- def year
- time.year
- end
+ def year
+ time.year
+ end
- def month
- time.month
- end
+ def month
+ time.month
+ end
- def day
- time.day
- end
+ def day
+ time.day
+ end
- def hour
- time.hour
- end
+ def hour
+ time.hour
+ end
- def min
- time.min
- end
+ def min
+ time.min
+ end
- def sec
- time.sec
- end
+ def sec
+ time.sec
+ end
- def utc_offset
- time.utc_offset
- end
+ def utc_offset
+ time.utc_offset
+ end
- def travel_offset
- @travel_offset
- end
+ def travel_offset
+ @travel_offset
+ end
- def scaling_factor
- @scaling_factor
- end
-
- def time(time_klass = Time) #:nodoc:
- if travel_offset.nil?
- time_klass.at(@time)
- elsif scaling_factor.nil?
- time_klass.at(Time.now_without_mock_time + travel_offset)
- else
- time_klass.at(scaled_time)
+ def scaling_factor
+ @scaling_factor
end
- end
- def scaled_time
- (@time + (Time.now_without_mock_time - @time_was) * scaling_factor).to_f
- end
+ def time(time_klass = Time) #:nodoc:
+ actual_time = time_klass.at(@time)
+ calculated_time = time_klass.at(@time.to_f)
- def date(date_klass = Date)
- date_klass.jd(time.__send__(:to_date).jd)
- end
+ if travel_offset.nil?
+ if times_are_equal_within_epsilon(actual_time, calculated_time, 1)
+ actual_time
+ else
+ calculated_time
+ end
+ elsif scaling_factor.nil?
+ time_klass.at(Time.now_without_mock_time + travel_offset)
+ else
+ time_klass.at(scaled_time)
+ end
+ end
- def datetime(datetime_klass = DateTime)
- our_offset = utc_offset + dst_adjustment
+ def scaled_time
+ (@time + (Time.now_without_mock_time - @time_was) * scaling_factor).to_f
+ end
- if Float.method_defined?(:to_r)
- fractions_of_a_second = time.to_f % 1
- datetime_klass.new(year, month, day, hour, min, sec + fractions_of_a_second, utc_offset_to_rational(our_offset))
- else
+ def date(date_klass = Date)
+ date_klass.jd(time.__send__(:to_date).jd)
+ end
+
+ def datetime(datetime_klass = DateTime)
our_offset = utc_offset + dst_adjustment
- datetime_klass.new(year, month, day, hour, min, sec, utc_offset_to_rational(our_offset))
+
+ if Float.method_defined?(:to_r)
+ fractions_of_a_second = time.to_f % 1
+ datetime_klass.new(year, month, day, hour, min, sec + fractions_of_a_second, utc_offset_to_rational(our_offset))
+ else
+ our_offset = utc_offset + dst_adjustment
+ datetime_klass.new(year, month, day, hour, min, sec, utc_offset_to_rational(our_offset))
+ end
end
- end
- def dst_adjustment
- @dst_adjustment
- end
+ def dst_adjustment
+ @dst_adjustment
+ end
- private
+ private
+
def rational_to_utc_offset(rational)
((24.0 / rational.denominator) * rational.numerator) * (60 * 60)
end
def utc_offset_to_rational(utc_offset)
@@ -137,7 +144,11 @@
def compute_travel_offset
return nil if mock_type == :freeze
time - Time.now_without_mock_time
end
- end
-end
+
+ def times_are_equal_within_epsilon t1, t2, epsilon_in_seconds
+ (t1 - t2).abs < epsilon_in_seconds
+ end
+ end
+ end
\ No newline at end of file