DateSetter 1.1.1 → 1.2.0

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.
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