DateSetter 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/DateSetter.gemspec CHANGED
@@ -15,4 +15,5 @@ Gem::Specification.new do |gem|
15
15
  gem.version = DateSetter::VERSION
16
16
 
17
17
  gem.add_development_dependency("activesupport")
18
+ gem.add_development_dependency("mocha")
18
19
  end
data/lib/DateSetter.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  class DateSetter
2
2
  Infinity = 1.0 / 0.0
3
- attr_accessor :reference_date, :min_date, :max_date, :result, :range, :min_hour, :max_hour
3
+ attr_accessor :reference_date, :min_date, :max_date, :result, :range, :start_of_day, :end_of_day
4
4
 
5
5
  def initialize(options = {})
6
6
  options.each do |key, value|
@@ -14,7 +14,7 @@ class DateSetter
14
14
  end
15
15
 
16
16
  def valid?
17
- return if !reference_date || !range || !valid_ranges?
17
+ return false if !reference_date || !range || !valid_ranges?
18
18
  (min_date.to_f..max_date.to_f).cover?(reference_date.to_f)
19
19
  end
20
20
 
@@ -27,43 +27,96 @@ class DateSetter
27
27
  end
28
28
 
29
29
  def min_date
30
- @min_date.try(:to_datetime) || -Infinity
30
+ @min_date.try(:to_datetime) || min_date_range - 1.second
31
31
  end
32
32
 
33
33
  def max_date
34
- @max_date.try(:to_datetime) || Infinity
34
+ @max_date.try(:to_datetime) || max_date_range + 1.second
35
35
  end
36
36
 
37
37
  def result
38
- rand(min_date_in_range..max_date_in_range) + rand(min_hour..max_hour) if valid?
38
+ if valid?
39
+ if the_same_day?
40
+ min_date_in_range + rand(intersection_of_range_and_hours_range)
41
+ elsif result_day == min_date_in_range
42
+ result_day + rand(hours_range_when_min_date)
43
+ elsif result_day == max_date_in_range
44
+ result_day + rand(hours_range_when_max_date)
45
+ else
46
+ result_day + rand(start_of_day..end_of_day)
47
+ end
48
+ else
49
+ raise ArgumentError, "Some argument is invalid"
50
+ end
51
+ end
52
+
53
+ def result_day
54
+ rand(min_date_in_range..max_date_in_range)
55
+ end
56
+
57
+ def start_of_day
58
+ @start_of_day ||= 0.hours
59
+ end
60
+
61
+ def end_of_day
62
+ @end_of_day ||= 24.hours - 1.second
63
+ end
64
+
65
+ def intersection(first_range, second_range)
66
+ return nil if (first_range.max < second_range.begin or second_range.max < first_range.begin)
67
+ [first_range.begin, second_range.begin].max..[first_range.max, second_range.max].min
68
+ end
69
+
70
+ def intersection_of_range_and_hours_range
71
+ intersection((min_date_time_in_range.hour.hours..max_date_time_in_range.hour.hours), (start_of_day..end_of_day))
72
+ end
73
+
74
+ def hours_range_when_min_date
75
+ (min_date_time_in_range.hour.hours..end_of_day)
39
76
  end
40
77
 
41
- def min_hour
42
- @min_hour ||= 0.hours
78
+ def hours_range_when_max_date
79
+ (start_of_day..max_date_time_in_range.hour.hours)
43
80
  end
44
81
 
45
- def max_hour
46
- @max_hour ||= 24.hours - 1.second
82
+ def the_same_day?
83
+ min_date_in_range == max_date_in_range
47
84
  end
48
85
 
49
86
  private
50
87
  def valid_ranges?
51
- min_date.to_f <= max_date.to_f || min_hour.to_f <= max_hour.to_f
88
+ min_date.to_f <= max_date.to_f && start_of_day.to_f <= end_of_day.to_f && intersection_of_range_and_hours_range != nil
52
89
  end
53
90
 
54
- def min_date_in_range
55
- if (reference_date - range).to_f < min_date.to_f
56
- min_date.to_date
91
+ def min_date_time_in_range
92
+ if (min_date_range).to_f < min_date.to_f
93
+ min_date
57
94
  else
58
- (reference_date - range).to_date
95
+ min_date_range
59
96
  end
60
97
  end
61
98
 
62
- def max_date_in_range
63
- if (reference_date + range).to_f > max_date.to_f
64
- max_date.to_date
99
+ def min_date_in_range
100
+ min_date_time_in_range.to_date
101
+ end
102
+
103
+ def max_date_time_in_range
104
+ if (max_date_range).to_f > max_date.to_f
105
+ max_date
65
106
  else
66
- (reference_date + range).to_date
107
+ max_date_range
67
108
  end
68
109
  end
110
+
111
+ def max_date_in_range
112
+ max_date_time_in_range.to_date
113
+ end
114
+
115
+ def min_date_range
116
+ reference_date - range
117
+ end
118
+
119
+ def max_date_range
120
+ reference_date + range
121
+ end
69
122
  end
@@ -104,11 +104,23 @@ class DateSetterTest < MiniTest::Unit::TestCase
104
104
  assert (0.days.ago.at_midnight..1.days.from_now.at_midnight).cover?(@date_setter.result)
105
105
  end
106
106
 
107
- def test_should_always_return_result_which_is_between_min_hour_and_max_hour
108
- @date_setter.min_hour = 8.hours
109
- @date_setter.max_hour = 9.hours
107
+ def test_should_return_exception_when_result_can_t_be_between_min_date_and_max_date
108
+ @date_setter.min_date = 2.days.ago
109
+ @date_setter.max_date = 1.day.ago
110
+
111
+ assert_raises ArgumentError do
112
+ @date_setter.result
113
+ end
114
+ end
110
115
 
111
- assert (8..9).cover?(@date_setter.result.hour)
116
+ def test_should_return_exception_when_hours_range_is_incorrect
117
+ @date_setter.reference_date = Date.today + 10.hours
118
+ @date_setter.start_of_day = 8.hours
119
+ @date_setter.end_of_day = 9.hours
120
+
121
+ assert_raises ArgumentError do
122
+ @date_setter.result
123
+ end
112
124
  end
113
125
 
114
126
  def test_set_function_should_generate_correct_date
@@ -125,4 +137,55 @@ class DateSetterTest < MiniTest::Unit::TestCase
125
137
 
126
138
  assert @date_setter.valid?
127
139
  end
140
+
141
+ def test_intersection_method_should_return_common_part_of_two_ranges
142
+ assert_equal (11..11), @date_setter.intersection((10..11), (11..20))
143
+ end
144
+
145
+ def test_result_should_be_between_min_date_and_max_date_hours_when_this_is_the_same_day
146
+ @date_setter.reference_date = Date.today + 10.hours
147
+ @date_setter.range = 1.day
148
+ @date_setter.min_date = Date.today + 9.hours
149
+ @date_setter.max_date = Date.today + 11.hours
150
+ @date_setter.start_of_day = 11.hours
151
+ @date_setter.end_of_day = 14.hours
152
+
153
+ assert (9..11).cover?(@date_setter.result.hour)
154
+ end
155
+
156
+ def test_result_should_be_between_min_date_and_end_of_day_hours_when_result_day_is_min_date
157
+ @date_setter.reference_date = Date.today + 10.hours
158
+ @date_setter.range = 5.days
159
+ @date_setter.min_date = Date.yesterday + 9.hours
160
+ @date_setter.max_date = Date.tomorrow + 11.hours
161
+ @date_setter.start_of_day = 7.hours
162
+ @date_setter.end_of_day = 14.hours
163
+ @date_setter.stubs(:result_day).returns(@date_setter.min_date.to_date)
164
+
165
+ assert (9..14).cover?(@date_setter.result.hour)
166
+ end
167
+
168
+ def test_result_should_be_between_start_of_day_and_max_date_hours_when_result_day_is_max_date
169
+ @date_setter.reference_date = Date.today + 10.hours
170
+ @date_setter.range = 5.days
171
+ @date_setter.min_date = Date.yesterday + 9.hours
172
+ @date_setter.max_date = Date.tomorrow + 11.hours
173
+ @date_setter.start_of_day = 7.hours
174
+ @date_setter.end_of_day = 14.hours
175
+ @date_setter.stubs(:result_day).returns(@date_setter.max_date.to_date)
176
+
177
+ assert (7..11).cover?(@date_setter.result.hour)
178
+ end
179
+
180
+ def test_result_should_be_between_start_of_day_and_end_of_day_hours_when_result_day_is_other_than_min_or_max_date
181
+ @date_setter.reference_date = Date.today + 10.hours
182
+ @date_setter.range = 5.days
183
+ @date_setter.min_date = Date.yesterday + 9.hours
184
+ @date_setter.max_date = Date.tomorrow + 11.hours
185
+ @date_setter.start_of_day = 7.hours
186
+ @date_setter.end_of_day = 14.hours
187
+ @date_setter.stubs(:result_day).returns(@date_setter.reference_date.to_date)
188
+
189
+ assert (7..14).cover?(@date_setter.result.hour)
190
+ end
128
191
  end
data/test/test_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "minitest/unit"
2
2
  require "minitest/autorun"
3
3
  require "DateSetter"
4
- require "active_support/all"
4
+ require "active_support/all"
5
+ require "mocha/setup"
data/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class DateSetter
2
- VERSION = "1.1.1"
2
+ VERSION = "1.2.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: DateSetter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-09 00:00:00.000000000 Z
12
+ date: 2012-11-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: mocha
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
30
46
  description:
31
47
  email:
32
48
  - rut.szymon@gmail.com