timecop 0.8.0 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/LICENSE +1 -1
- data/README.markdown +8 -2
- data/Rakefile +9 -3
- data/lib/timecop/time_extensions.rb +60 -27
- data/lib/timecop/time_stack_item.rb +11 -8
- data/lib/timecop/timecop.rb +77 -19
- data/lib/timecop/version.rb +1 -1
- data/test/test_helper.rb +9 -8
- data/test/time_stack_item_test.rb +27 -5
- data/test/timecop_test.rb +54 -13
- data/test/timecop_without_date_but_with_time_test.rb +4 -6
- data/test/timecop_without_date_test.rb +4 -4
- metadata +11 -13
- data/test/run_tests.sh +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 778eafd7d7e50dcf0aa223c181fdc6155955ecd2ab47abf996204dddec6362d5
|
4
|
+
data.tar.gz: 4e54ef041daff39c88d6363a2de8843bfaa9ce44bdc1f515f1c7d236ff15b689
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2caa5c9934809e05002b813b5907c0761886c937444b769531b13d19e443f9a73756ae4713569db03e4f75f20b7563550813cd1e3b3026f26ad8e3fd74cfd25
|
7
|
+
data.tar.gz: a984ade8c2067409acb19b65f85d042d9208fa31df66a38c21787e741ba2cb24fc87946fa11609bb2f62fdbd7bc7bb9fe195034ed6dcd5c152bd457f1b1638dd
|
data/LICENSE
CHANGED
data/README.markdown
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# timecop
|
2
2
|
|
3
|
-
[](http://travis-ci.org/travisjeffery/timecop)
|
4
4
|
|
5
5
|
## DESCRIPTION
|
6
6
|
|
@@ -104,7 +104,7 @@ being able to simulate activity via subsequent calls to your application.
|
|
104
104
|
Timecop.scale(3600)
|
105
105
|
Time.now
|
106
106
|
# => 2012-09-20 21:23:25 -0500
|
107
|
-
# seconds later, hours have
|
107
|
+
# seconds later, hours have passed and it's gone from 9pm at night to 6am in the morning
|
108
108
|
Time.now
|
109
109
|
# => 2012-09-21 06:22:59 -0500
|
110
110
|
```
|
@@ -128,6 +128,12 @@ Timecop.freeze
|
|
128
128
|
# => Timecop::SafeModeException: Safe mode is enabled, only calls passing a block are allowed.
|
129
129
|
```
|
130
130
|
|
131
|
+
### Rails v Ruby Date/Time libraries
|
132
|
+
|
133
|
+
Sometimes [Rails Date/Time methods don't play nicely with Ruby Date/Time methods.](https://rails.lighthouseapp.com/projects/8994/tickets/6410-dateyesterday-datetoday)
|
134
|
+
|
135
|
+
Be careful mixing Ruby `Date.today` with Rails `Date.tomorrow` / `Date.yesterday` as things might break.
|
136
|
+
|
131
137
|
## Contribute
|
132
138
|
|
133
139
|
timecop is maintained by [travisjeffery](http://github.com/travisjeffery), and
|
data/Rakefile
CHANGED
@@ -3,8 +3,6 @@ require 'bundler/gem_tasks'
|
|
3
3
|
require 'rake/testtask'
|
4
4
|
require 'rdoc/task'
|
5
5
|
|
6
|
-
$LOAD_PATH.unshift("lib")
|
7
|
-
|
8
6
|
Rake::RDocTask.new do |rdoc|
|
9
7
|
if File.exist?('VERSION')
|
10
8
|
version = File.read('VERSION')
|
@@ -21,7 +19,15 @@ Rake::RDocTask.new do |rdoc|
|
|
21
19
|
end
|
22
20
|
|
23
21
|
task :test do
|
24
|
-
|
22
|
+
failed = Dir["test/*_test.rb"].map do |test|
|
23
|
+
command = "ruby #{test}"
|
24
|
+
puts
|
25
|
+
puts command
|
26
|
+
command unless system(command)
|
27
|
+
end.compact
|
28
|
+
if failed.any?
|
29
|
+
abort "#{failed.count} Tests failed\n#{failed.join("\n")}"
|
30
|
+
end
|
25
31
|
end
|
26
32
|
|
27
33
|
desc 'Default: run tests'
|
@@ -27,19 +27,8 @@ class Time #:nodoc:
|
|
27
27
|
end
|
28
28
|
|
29
29
|
class Date #:nodoc:
|
30
|
-
WEEKDAYS = {
|
31
|
-
"sunday" => 0,
|
32
|
-
"monday" => 1,
|
33
|
-
"tuesday" => 2,
|
34
|
-
"wednesday" => 3,
|
35
|
-
"thursday" => 4,
|
36
|
-
"friday" => 5,
|
37
|
-
"saturday" => 6
|
38
|
-
}
|
39
|
-
|
40
30
|
class << self
|
41
31
|
def mock_date
|
42
|
-
mocked_time_stack_item = Timecop.top_stack_item
|
43
32
|
mocked_time_stack_item.nil? ? nil : mocked_time_stack_item.date(self)
|
44
33
|
end
|
45
34
|
|
@@ -59,32 +48,67 @@ class Date #:nodoc:
|
|
59
48
|
"supports Date::ITALY for the start argument."
|
60
49
|
end
|
61
50
|
|
62
|
-
|
51
|
+
d = Date._strptime(str, fmt) || Date.strptime_without_mock_date(str, fmt)
|
52
|
+
now = Time.now.to_date
|
53
|
+
year = d[:year] || now.year
|
54
|
+
mon = d[:mon] || now.mon
|
55
|
+
if d[:mday]
|
56
|
+
Date.new(year, mon, d[:mday])
|
57
|
+
elsif d[:wday]
|
58
|
+
Date.new(year, mon, now.mday) + (d[:wday] - now.wday)
|
59
|
+
elsif d[:yday]
|
60
|
+
Date.new(year).next_day(d[:yday] - 1)
|
61
|
+
elsif d[:cwyear] && d[:cweek]
|
62
|
+
if d[:cwday]
|
63
|
+
Date.commercial(d[:cwyear], d[:cweek], d[:cwday])
|
64
|
+
else
|
65
|
+
Date.commercial(d[:cwyear], d[:cweek])
|
66
|
+
end
|
67
|
+
elsif d[:seconds]
|
68
|
+
Time.at(d[:seconds]).to_date
|
69
|
+
else
|
70
|
+
Date.new(year, mon)
|
71
|
+
end
|
63
72
|
end
|
64
73
|
|
65
74
|
alias_method :strptime, :strptime_with_mock_date
|
66
75
|
|
67
76
|
def parse_with_mock_date(*args)
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
77
|
+
parsed_date = parse_without_mock_date(*args)
|
78
|
+
return parsed_date unless mocked_time_stack_item
|
79
|
+
date_hash = Date._parse(*args)
|
80
|
+
|
81
|
+
case
|
82
|
+
when date_hash[:year] && date_hash[:mon]
|
83
|
+
parsed_date
|
84
|
+
when date_hash[:mon] && date_hash[:mday]
|
85
|
+
Date.new(mocked_time_stack_item.year, date_hash[:mon], date_hash[:mday])
|
86
|
+
when date_hash[:wday]
|
87
|
+
closest_wday(date_hash[:wday])
|
73
88
|
else
|
74
|
-
|
89
|
+
parsed_date + mocked_time_stack_item.travel_offset_days
|
75
90
|
end
|
76
91
|
end
|
77
92
|
|
78
93
|
alias_method :parse_without_mock_date, :parse
|
79
94
|
alias_method :parse, :parse_with_mock_date
|
80
95
|
|
96
|
+
def mocked_time_stack_item
|
97
|
+
Timecop.top_stack_item
|
98
|
+
end
|
99
|
+
|
100
|
+
def closest_wday(wday)
|
101
|
+
today = Date.today
|
102
|
+
result = today - today.wday
|
103
|
+
result += 1 until wday == result.wday
|
104
|
+
result
|
105
|
+
end
|
81
106
|
end
|
82
107
|
end
|
83
108
|
|
84
109
|
class DateTime #:nodoc:
|
85
110
|
class << self
|
86
111
|
def mock_time
|
87
|
-
mocked_time_stack_item = Timecop.top_stack_item
|
88
112
|
mocked_time_stack_item.nil? ? nil : mocked_time_stack_item.datetime(self)
|
89
113
|
end
|
90
114
|
|
@@ -97,19 +121,28 @@ class DateTime #:nodoc:
|
|
97
121
|
alias_method :now, :now_with_mock_time
|
98
122
|
|
99
123
|
def parse_with_mock_date(*args)
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
124
|
+
date_hash = Date._parse(*args)
|
125
|
+
parsed_date = parse_without_mock_date(*args)
|
126
|
+
return parsed_date unless mocked_time_stack_item
|
127
|
+
date_hash = DateTime._parse(*args)
|
128
|
+
|
129
|
+
case
|
130
|
+
when date_hash[:year] && date_hash[:mon]
|
131
|
+
parsed_date
|
132
|
+
when date_hash[:mon] && date_hash[:mday]
|
133
|
+
DateTime.new(mocked_time_stack_item.year, date_hash[:mon], date_hash[:mday])
|
134
|
+
when date_hash[:wday]
|
135
|
+
Date.closest_wday(date_hash[:wday]).to_datetime
|
107
136
|
else
|
108
|
-
|
137
|
+
parsed_date + mocked_time_stack_item.travel_offset_days
|
109
138
|
end
|
110
139
|
end
|
111
140
|
|
112
141
|
alias_method :parse_without_mock_date, :parse
|
113
142
|
alias_method :parse, :parse_with_mock_date
|
143
|
+
|
144
|
+
def mocked_time_stack_item
|
145
|
+
Timecop.top_stack_item
|
146
|
+
end
|
114
147
|
end
|
115
148
|
end
|
@@ -43,7 +43,11 @@ class Timecop
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def travel_offset
|
46
|
-
@travel_offset
|
46
|
+
@travel_offset unless mock_type == :freeze
|
47
|
+
end
|
48
|
+
|
49
|
+
def travel_offset_days
|
50
|
+
(@travel_offset / 60 / 60 / 24).round
|
47
51
|
end
|
48
52
|
|
49
53
|
def scaling_factor
|
@@ -52,7 +56,7 @@ class Timecop
|
|
52
56
|
|
53
57
|
def time(time_klass = Time) #:nodoc:
|
54
58
|
if @time.respond_to?(:in_time_zone)
|
55
|
-
time = time_klass.at(@time.dup.
|
59
|
+
time = time_klass.at(@time.dup.localtime)
|
56
60
|
else
|
57
61
|
time = time_klass.at(@time)
|
58
62
|
end
|
@@ -60,7 +64,7 @@ class Timecop
|
|
60
64
|
if travel_offset.nil?
|
61
65
|
time
|
62
66
|
elsif scaling_factor.nil?
|
63
|
-
time_klass.at(
|
67
|
+
time_klass.at(Time.now_without_mock_time + travel_offset)
|
64
68
|
else
|
65
69
|
time_klass.at(scaled_time)
|
66
70
|
end
|
@@ -101,13 +105,13 @@ class Timecop
|
|
101
105
|
time_klass.at(arg.to_time.to_f).getlocal
|
102
106
|
elsif Object.const_defined?(:Date) && arg.is_a?(Date)
|
103
107
|
time_klass.local(arg.year, arg.month, arg.day, 0, 0, 0)
|
104
|
-
elsif args.empty? && arg.kind_of?(Integer)
|
105
|
-
|
108
|
+
elsif args.empty? && (arg.kind_of?(Integer) || arg.kind_of?(Float))
|
109
|
+
time_klass.now + arg
|
106
110
|
elsif arg.nil?
|
107
|
-
|
111
|
+
time_klass.now
|
108
112
|
else
|
109
113
|
if arg.is_a?(String) && Time.respond_to?(:parse)
|
110
|
-
|
114
|
+
time_klass.parse(arg)
|
111
115
|
else
|
112
116
|
# we'll just assume it's a list of y/m/d/h/m/s
|
113
117
|
year = arg || 2000
|
@@ -122,7 +126,6 @@ class Timecop
|
|
122
126
|
end
|
123
127
|
|
124
128
|
def compute_travel_offset
|
125
|
-
return nil if mock_type == :freeze
|
126
129
|
time - Time.now_without_mock_time
|
127
130
|
end
|
128
131
|
|
data/lib/timecop/timecop.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'singleton'
|
2
|
-
require File.join(File.dirname(__FILE__), "time_extensions")
|
3
2
|
require File.join(File.dirname(__FILE__), "time_stack_item")
|
4
3
|
|
5
4
|
# Timecop
|
@@ -93,6 +92,7 @@ class Timecop
|
|
93
92
|
nil
|
94
93
|
end
|
95
94
|
end
|
95
|
+
alias :unfreeze :return
|
96
96
|
|
97
97
|
def return_to_baseline
|
98
98
|
instance.send(:return_to_baseline)
|
@@ -100,7 +100,7 @@ class Timecop
|
|
100
100
|
end
|
101
101
|
|
102
102
|
def top_stack_item #:nodoc:
|
103
|
-
instance.
|
103
|
+
instance.send(:stack).last
|
104
104
|
end
|
105
105
|
|
106
106
|
def safe_mode=(safe)
|
@@ -111,9 +111,17 @@ class Timecop
|
|
111
111
|
@safe_mode ||= false
|
112
112
|
end
|
113
113
|
|
114
|
+
def thread_safe=(t)
|
115
|
+
instance.send(:thread_safe=, t)
|
116
|
+
end
|
117
|
+
|
118
|
+
def thread_safe
|
119
|
+
instance.send(:thread_safe)
|
120
|
+
end
|
121
|
+
|
114
122
|
# Returns whether or not Timecop is currently frozen/travelled
|
115
123
|
def frozen?
|
116
|
-
!instance.
|
124
|
+
!instance.send(:stack).empty?
|
117
125
|
end
|
118
126
|
|
119
127
|
private
|
@@ -125,50 +133,97 @@ class Timecop
|
|
125
133
|
|
126
134
|
private
|
127
135
|
|
128
|
-
def baseline=(
|
129
|
-
|
130
|
-
|
136
|
+
def baseline=(b)
|
137
|
+
set_baseline(b)
|
138
|
+
stack << TimeStackItem.new(:travel, b)
|
139
|
+
end
|
140
|
+
|
141
|
+
def baseline
|
142
|
+
if @thread_safe
|
143
|
+
Thread.current[:timecop_baseline]
|
144
|
+
else
|
145
|
+
@baseline
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def set_baseline(b)
|
150
|
+
if @thread_safe
|
151
|
+
Thread.current[:timecop_baseline] = b
|
152
|
+
else
|
153
|
+
@baseline = b
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def stack
|
158
|
+
if @thread_safe
|
159
|
+
Thread.current[:timecop_stack] ||= []
|
160
|
+
Thread.current[:timecop_stack]
|
161
|
+
else
|
162
|
+
@stack
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def set_stack(s)
|
167
|
+
if @thread_safe
|
168
|
+
Thread.current[:timecop_stack] = s
|
169
|
+
else
|
170
|
+
@stack = s
|
171
|
+
end
|
131
172
|
end
|
132
173
|
|
133
174
|
def initialize #:nodoc:
|
134
|
-
@
|
175
|
+
@stack = []
|
176
|
+
@safe = nil
|
177
|
+
@thread_safe = false
|
178
|
+
end
|
179
|
+
|
180
|
+
def thread_safe=(t)
|
181
|
+
initialize
|
182
|
+
@thread_safe = t
|
183
|
+
end
|
184
|
+
|
185
|
+
def thread_safe
|
186
|
+
@thread_safe
|
135
187
|
end
|
136
188
|
|
137
189
|
def travel(mock_type, *args, &block) #:nodoc:
|
138
|
-
raise SafeModeException if Timecop.safe_mode? && !block_given?
|
190
|
+
raise SafeModeException if Timecop.safe_mode? && !block_given? && !@safe
|
139
191
|
|
140
192
|
stack_item = TimeStackItem.new(mock_type, *args)
|
141
193
|
|
142
|
-
stack_backup =
|
143
|
-
|
194
|
+
stack_backup = stack.dup
|
195
|
+
stack << stack_item
|
144
196
|
|
145
197
|
if block_given?
|
198
|
+
safe_backup = @safe
|
199
|
+
@safe = true
|
146
200
|
begin
|
147
201
|
yield stack_item.time
|
148
202
|
ensure
|
149
|
-
|
203
|
+
stack.replace stack_backup
|
204
|
+
@safe = safe_backup
|
150
205
|
end
|
151
206
|
end
|
152
207
|
end
|
153
208
|
|
154
209
|
def return(&block)
|
155
|
-
current_stack =
|
156
|
-
current_baseline =
|
210
|
+
current_stack = stack
|
211
|
+
current_baseline = baseline
|
157
212
|
unmock!
|
158
213
|
yield
|
159
214
|
ensure
|
160
|
-
|
161
|
-
|
215
|
+
set_stack current_stack
|
216
|
+
set_baseline current_baseline
|
162
217
|
end
|
163
218
|
|
164
219
|
def unmock! #:nodoc:
|
165
|
-
|
166
|
-
|
220
|
+
set_baseline nil
|
221
|
+
set_stack []
|
167
222
|
end
|
168
223
|
|
169
224
|
def return_to_baseline
|
170
|
-
if
|
171
|
-
|
225
|
+
if baseline
|
226
|
+
set_stack [stack.shift]
|
172
227
|
else
|
173
228
|
unmock!
|
174
229
|
end
|
@@ -180,3 +235,6 @@ class Timecop
|
|
180
235
|
end
|
181
236
|
end
|
182
237
|
end
|
238
|
+
|
239
|
+
# This must be done after TimeCop is available
|
240
|
+
require File.join(File.dirname(__FILE__), "time_extensions")
|
data/lib/timecop/version.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -1,16 +1,13 @@
|
|
1
|
-
require 'rubygems'
|
2
1
|
require 'bundler/setup'
|
3
2
|
require 'minitest/autorun'
|
3
|
+
require 'minitest/rg'
|
4
|
+
require 'pry'
|
4
5
|
|
5
6
|
$VERBOSE = true # enable ruby warnings
|
6
7
|
|
7
|
-
|
8
|
-
require 'mocha/setup'
|
9
|
-
rescue LoadError
|
10
|
-
require 'mocha'
|
11
|
-
end
|
8
|
+
require 'mocha/minitest'
|
12
9
|
|
13
|
-
class Minitest::
|
10
|
+
class Minitest::Test
|
14
11
|
private
|
15
12
|
# Tests to see that two times are within the given distance,
|
16
13
|
# in seconds, from each other.
|
@@ -32,7 +29,7 @@ class Minitest::Unit::TestCase
|
|
32
29
|
Time.at(time.to_i).to_datetime.offset
|
33
30
|
end
|
34
31
|
|
35
|
-
TIMEZONES = ["Europe/Paris", "UTC", "America/Chicago"]
|
32
|
+
TIMEZONES = ["Pacific/Midway", "Europe/Paris", "UTC", "America/Chicago"]
|
36
33
|
|
37
34
|
def each_timezone
|
38
35
|
old_tz = ENV["TZ"]
|
@@ -55,4 +52,8 @@ class Minitest::Unit::TestCase
|
|
55
52
|
assert_in_delta dt1.to_time.to_f, dt2.to_time.to_f, 0.01, "Failed for timezone: #{ENV['TZ']}: #{dt1.to_s} not equal to #{dt2.to_s}"
|
56
53
|
end
|
57
54
|
|
55
|
+
def jruby?
|
56
|
+
RUBY_PLATFORM == "java"
|
57
|
+
end
|
58
|
+
|
58
59
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'date'
|
2
|
-
|
3
|
-
require
|
2
|
+
require_relative "test_helper"
|
3
|
+
require 'timecop'
|
4
4
|
|
5
5
|
require 'active_support/all'
|
6
6
|
|
7
|
-
class TestTimeStackItem < Minitest::
|
7
|
+
class TestTimeStackItem < Minitest::Test
|
8
8
|
def teardown
|
9
9
|
Timecop.return
|
10
10
|
Time.zone = nil
|
@@ -87,6 +87,19 @@ class TestTimeStackItem < Minitest::Unit::TestCase
|
|
87
87
|
assert_equal s, stack_item.sec
|
88
88
|
end
|
89
89
|
|
90
|
+
def test_new_with_float
|
91
|
+
t = Time.now
|
92
|
+
y, m, d, h, min, s = t.year, t.month, t.day, t.hour, t.min, t.sec
|
93
|
+
stack_item = Timecop::TimeStackItem.new(:freeze, 0.0)
|
94
|
+
|
95
|
+
assert_equal y, stack_item.year
|
96
|
+
assert_equal m, stack_item.month
|
97
|
+
assert_equal d, stack_item.day
|
98
|
+
assert_equal h, stack_item.hour
|
99
|
+
assert_equal min, stack_item.min
|
100
|
+
assert_equal s, stack_item.sec
|
101
|
+
end
|
102
|
+
|
90
103
|
def test_new_with_individual_arguments
|
91
104
|
y, m, d, h, min, s = 2008, 10, 10, 10, 10, 10
|
92
105
|
stack_item = Timecop::TimeStackItem.new(:freeze, y, m, d, h, min, s)
|
@@ -168,7 +181,7 @@ class TestTimeStackItem < Minitest::Unit::TestCase
|
|
168
181
|
t = Time.local(2009, 10, 1, 0, 0, 30)
|
169
182
|
tsi = Timecop::TimeStackItem.new(:freeze, t)
|
170
183
|
|
171
|
-
|
184
|
+
assert_nil tsi.send(:travel_offset)
|
172
185
|
end
|
173
186
|
|
174
187
|
def test_timezones
|
@@ -179,12 +192,21 @@ class TestTimeStackItem < Minitest::Unit::TestCase
|
|
179
192
|
end
|
180
193
|
end
|
181
194
|
|
195
|
+
def test_timezones_with_parsed_string
|
196
|
+
Time.zone = "Europe/Zurich"
|
197
|
+
time_string = "2012-12-27 12:12"
|
198
|
+
expected_time = Time.zone.parse(time_string)
|
199
|
+
Timecop.freeze(time_string) do |frozen_time|
|
200
|
+
assert_equal expected_time, frozen_time
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
182
204
|
def test_timezones_apply_dates
|
183
205
|
Time.zone = "Central Time (US & Canada)"
|
184
206
|
time = Time.zone.local(2013,1,3)
|
185
207
|
|
186
208
|
Timecop.freeze(time) do
|
187
|
-
assert_equal time.to_date, Time.now.to_date
|
209
|
+
assert_equal time.to_date, Time.zone.now.to_date
|
188
210
|
end
|
189
211
|
end
|
190
212
|
|
data/test/timecop_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
require
|
1
|
+
require_relative "test_helper"
|
2
|
+
require 'timecop'
|
3
3
|
|
4
|
-
class TestTimecop < Minitest::
|
4
|
+
class TestTimecop < Minitest::Test
|
5
5
|
def teardown
|
6
6
|
Timecop.return
|
7
7
|
end
|
@@ -37,6 +37,12 @@ class TestTimecop < Minitest::Unit::TestCase
|
|
37
37
|
assert_nil Time.send(:mock_time)
|
38
38
|
end
|
39
39
|
|
40
|
+
def test_freeze_then_unfreeze_unsets_mock_time
|
41
|
+
Timecop.freeze(1)
|
42
|
+
Timecop.unfreeze
|
43
|
+
assert_nil Time.send(:mock_time)
|
44
|
+
end
|
45
|
+
|
40
46
|
def test_travel_then_return_unsets_mock_time
|
41
47
|
Timecop.travel(1)
|
42
48
|
Timecop.return
|
@@ -251,7 +257,7 @@ class TestTimecop < Minitest::Unit::TestCase
|
|
251
257
|
new_now = Time.now
|
252
258
|
assert_times_effectively_equal(new_now, t, 1, "Looks like we failed to actually travel time")
|
253
259
|
sleep(0.25)
|
254
|
-
assert_times_effectively_not_equal new_now, Time.now, 0.
|
260
|
+
assert_times_effectively_not_equal new_now, Time.now, 0.24, "Looks like time is not moving"
|
255
261
|
end
|
256
262
|
end
|
257
263
|
|
@@ -495,6 +501,18 @@ class TestTimecop < Minitest::Unit::TestCase
|
|
495
501
|
end
|
496
502
|
end
|
497
503
|
|
504
|
+
def test_raises_when_safe_mode_and_no_block_though_previously_block_given
|
505
|
+
Timecop.freeze do
|
506
|
+
Timecop.freeze
|
507
|
+
end
|
508
|
+
|
509
|
+
with_safe_mode do
|
510
|
+
assert_raises Timecop::SafeModeException do
|
511
|
+
Timecop.freeze
|
512
|
+
end
|
513
|
+
end
|
514
|
+
end
|
515
|
+
|
498
516
|
def test_no_raise_when_safe_mode_and_block_used
|
499
517
|
with_safe_mode do
|
500
518
|
Timecop.freeze {}
|
@@ -507,15 +525,11 @@ class TestTimecop < Minitest::Unit::TestCase
|
|
507
525
|
end
|
508
526
|
end
|
509
527
|
|
510
|
-
def
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
def test_date_strptime_without_specifying_format
|
517
|
-
Timecop.freeze(Time.new(1984,2,28)) do
|
518
|
-
assert_equal Date.strptime('1999-04-14'), Date.new(1999, 4, 14)
|
528
|
+
def test_no_raise_when_safe_mode_and_no_block_and_in_block_context
|
529
|
+
with_safe_mode do
|
530
|
+
Timecop.freeze do
|
531
|
+
Timecop.freeze
|
532
|
+
end
|
519
533
|
end
|
520
534
|
end
|
521
535
|
|
@@ -536,6 +550,33 @@ class TestTimecop < Minitest::Unit::TestCase
|
|
536
550
|
assert !Timecop.frozen?
|
537
551
|
end
|
538
552
|
|
553
|
+
def test_thread_safe_timecop_in_parallel
|
554
|
+
Timecop.thread_safe = true
|
555
|
+
date = Time.local(2011, 01, 02)
|
556
|
+
thread = Thread.new do
|
557
|
+
Timecop.freeze(date) do
|
558
|
+
sleep 1 #give main thread time to run
|
559
|
+
assert_equal date, Time.now
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
sleep 0.25
|
564
|
+
assert Time.now != date
|
565
|
+
thread.join
|
566
|
+
ensure
|
567
|
+
Timecop.thread_safe = false
|
568
|
+
end
|
569
|
+
|
570
|
+
def test_thread_safe_timecop_returns_after_block
|
571
|
+
Timecop.thread_safe = true
|
572
|
+
date = Time.local(2017, 10, 8)
|
573
|
+
|
574
|
+
Timecop.freeze(date) { }
|
575
|
+
assert Time.now != date
|
576
|
+
ensure
|
577
|
+
Timecop.thread_safe = false
|
578
|
+
end
|
579
|
+
|
539
580
|
private
|
540
581
|
|
541
582
|
def with_safe_mode(enabled=true)
|
@@ -1,10 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
class TestTimecopWithoutDateButWithTime < Minitest::Unit::TestCase
|
4
|
-
TIMECOP_LIB = File.join(File.dirname(__FILE__), '..', 'lib', 'timecop')
|
1
|
+
require_relative "test_helper"
|
2
|
+
require "time"
|
5
3
|
|
4
|
+
class TestTimecopWithoutDateButWithTime < Minitest::Test
|
6
5
|
def test_loads_properly_when_time_is_required_instead_of_date
|
7
|
-
require
|
8
|
-
require TIMECOP_LIB
|
6
|
+
require 'timecop'
|
9
7
|
end
|
10
8
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
require
|
1
|
+
require_relative "test_helper"
|
2
|
+
require 'timecop'
|
3
3
|
|
4
|
-
class TestTimecopWithoutDate < Minitest::
|
4
|
+
class TestTimecopWithoutDate < Minitest::Test
|
5
5
|
|
6
6
|
def setup
|
7
7
|
Object.send(:remove_const, :Date) if Object.const_defined?(:Date)
|
@@ -70,7 +70,7 @@ class TestTimecopWithoutDate < Minitest::Unit::TestCase
|
|
70
70
|
new_now = Time.now
|
71
71
|
assert_times_effectively_equal new_now, t, 1, "Looks like we failed to actually travel time" # 0.1 seconds
|
72
72
|
sleep(0.25)
|
73
|
-
assert_times_effectively_not_equal new_now, Time.now, 0.
|
73
|
+
assert_times_effectively_not_equal new_now, Time.now, 0.24, "Looks like time is not moving"
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: timecop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Travis Jeffery
|
8
8
|
- John Trupiano
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-02-07 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A gem providing "time travel" and "time freezing" capabilities, making
|
15
15
|
it dead simple to test time-dependent code. It provides a unified method to mock
|
@@ -27,37 +27,35 @@ files:
|
|
27
27
|
- lib/timecop.rb
|
28
28
|
- lib/timecop/time_extensions.rb
|
29
29
|
- lib/timecop/time_stack_item.rb
|
30
|
-
- lib/timecop/version.rb
|
31
30
|
- lib/timecop/timecop.rb
|
32
|
-
-
|
31
|
+
- lib/timecop/version.rb
|
33
32
|
- test/test_helper.rb
|
34
33
|
- test/time_stack_item_test.rb
|
35
34
|
- test/timecop_test.rb
|
36
|
-
- test/timecop_without_date_test.rb
|
37
35
|
- test/timecop_without_date_but_with_time_test.rb
|
36
|
+
- test/timecop_without_date_test.rb
|
38
37
|
homepage: https://github.com/travisjeffery/timecop
|
39
38
|
licenses:
|
40
39
|
- MIT
|
41
40
|
metadata: {}
|
42
|
-
post_install_message:
|
41
|
+
post_install_message:
|
43
42
|
rdoc_options:
|
44
|
-
- --charset=UTF-8
|
43
|
+
- "--charset=UTF-8"
|
45
44
|
require_paths:
|
46
45
|
- lib
|
47
46
|
required_ruby_version: !ruby/object:Gem::Requirement
|
48
47
|
requirements:
|
49
|
-
- -
|
48
|
+
- - ">="
|
50
49
|
- !ruby/object:Gem::Version
|
51
50
|
version: 1.9.2
|
52
51
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
52
|
requirements:
|
54
|
-
- -
|
53
|
+
- - ">="
|
55
54
|
- !ruby/object:Gem::Version
|
56
55
|
version: '0'
|
57
56
|
requirements: []
|
58
|
-
|
59
|
-
|
60
|
-
signing_key:
|
57
|
+
rubygems_version: 3.0.8
|
58
|
+
signing_key:
|
61
59
|
specification_version: 3
|
62
60
|
summary: A gem providing "time travel" and "time freezing" capabilities, making it
|
63
61
|
dead simple to test time-dependent code. It provides a unified method to mock Time.now,
|