workpattern 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/script/console CHANGED
File without changes
data/script/destroy CHANGED
File without changes
data/script/generate CHANGED
File without changes
data/script/txt2html CHANGED
File without changes
data/workpattern.gemspec CHANGED
@@ -1,27 +1,39 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
- require "workpattern/version"
4
3
 
5
- Gem::Specification.new do |s|
6
- s.name = "workpattern"
7
- s.version = Workpattern::VERSION
8
- s.authors = ["Barrie Callender"]
9
- s.email = ["barrie@callenb.org"]
10
- s.homepage = "http://github.com/callenb/workpattern"
11
- s.summary = %q{Calculates dates and durations whilst taking into account working and non-working periods down to a minute}
12
- s.description = %q{Calculates dates and durations whilst taking into account working and non-working times down to a minute. Business working time with holidays are a breeze.}
13
- s.license = 'MIT'
4
+ require_relative "lib/workpattern/version"
14
5
 
15
- s.required_ruby_version = ">= 1.9.3"
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "workpattern"
8
+ spec.version = Workpattern::VERSION
9
+ spec.authors = ["Barrie Callender"]
10
+ spec.email = ["barrie@callenb.org"]
16
11
 
17
- s.files = `git ls-files`.split("\n")
18
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
- s.require_paths = ["lib"]
12
+ spec.summary = "Calculates dates and durations whilst taking into account working and non-working periods down to a minute"
13
+ spec.description = "Calculates dates and durations whilst taking into account working and non-working times down to a minute. Business working time with holidays are a breeze."
14
+ spec.homepage = "http://workpattern.org"
15
+ spec.license = "MIT"
16
+ spec.required_ruby_version = Gem::Requirement.new(">= 1.9.3")
21
17
 
22
- # specify any dependencies here; for example:
23
- s.add_runtime_dependency 'tzinfo'
24
- s.add_development_dependency('rake', ['~> 0.9.2'])
25
- s.add_development_dependency('minitest', ['~> 5.4.3'])
26
- end
18
+ spec.metadata["homepage_url"] = spec.homepage
19
+ spec.metadata["source_code_uri"] = "https://github.com/callenb/workpattern"
20
+ spec.metadata["changelog_uri"] = "https://workpattern.org/2021/02/25/changelog.html"
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
25
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
26
+ end
27
+ spec.require_paths = ["lib"]
27
28
 
29
+ # Uncomment to register a new dependency of your gem
30
+ # spec.add_dependency "example-gem", "~> 1.0"
31
+
32
+ # For more information and examples about making a new gem, checkout our
33
+ # guide at: https://bundler.io/guides/creating_gem.html
34
+ spec.add_runtime_dependency 'tzinfo'
35
+ spec.add_runtime_dependency 'sorted_set' if RUBY_VERSION >= "2.4"
36
+ spec.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
37
+ spec.require_paths = ["lib"]
38
+
39
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workpattern
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Barrie Callender
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-19 00:00:00.000000000 Z
11
+ date: 2021-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tzinfo
@@ -25,33 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: sorted_set
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: 0.9.2
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: 0.9.2
41
- - !ruby/object:Gem::Dependency
42
- name: minitest
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
31
+ - - ">="
46
32
  - !ruby/object:Gem::Version
47
- version: 5.4.3
48
- type: :development
33
+ version: '0'
34
+ type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
- - - "~>"
38
+ - - ">="
53
39
  - !ruby/object:Gem::Version
54
- version: 5.4.3
40
+ version: '0'
55
41
  description: Calculates dates and durations whilst taking into account working and
56
42
  non-working times down to a minute. Business working time with holidays are a breeze.
57
43
  email:
@@ -62,30 +48,33 @@ extra_rdoc_files: []
62
48
  files:
63
49
  - ".gitignore"
64
50
  - ".travis.yml"
65
- - CHANGELOG
51
+ - CHANGELOG.md
52
+ - CODE_OF_CONDUCT.md
66
53
  - Gemfile
54
+ - Gemfile.lock
55
+ - LICENSE.txt
67
56
  - README.md
68
57
  - Rakefile
69
58
  - lib/workpattern.rb
70
59
  - lib/workpattern/clock.rb
71
- - lib/workpattern/utility/base.rb
60
+ - lib/workpattern/constants.rb
61
+ - lib/workpattern/day.rb
72
62
  - lib/workpattern/version.rb
73
63
  - lib/workpattern/week.rb
64
+ - lib/workpattern/week_pattern.rb
74
65
  - lib/workpattern/workpattern.rb
75
66
  - script/console
76
67
  - script/destroy
77
68
  - script/generate
78
69
  - script/txt2html
79
- - test/test_clock.rb
80
- - test/test_helper.rb
81
- - test/test_week.rb
82
- - test/test_workpattern.rb
83
- - test/test_workpattern_module.rb
84
70
  - workpattern.gemspec
85
- homepage: http://github.com/callenb/workpattern
71
+ homepage: http://workpattern.org
86
72
  licenses:
87
73
  - MIT
88
- metadata: {}
74
+ metadata:
75
+ homepage_url: http://workpattern.org
76
+ source_code_uri: https://github.com/callenb/workpattern
77
+ changelog_uri: https://workpattern.org/2021/02/25/changelog.html
89
78
  post_install_message:
90
79
  rdoc_options: []
91
80
  require_paths:
@@ -101,8 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
90
  - !ruby/object:Gem::Version
102
91
  version: '0'
103
92
  requirements: []
104
- rubyforge_project:
105
- rubygems_version: 2.6.7
93
+ rubygems_version: 3.0.9
106
94
  signing_key:
107
95
  specification_version: 4
108
96
  summary: Calculates dates and durations whilst taking into account working and non-working
@@ -1,27 +0,0 @@
1
- module Workpattern
2
- # Mixins expected to be used in more than one class
3
- #
4
- # @since 0.2.0
5
- #
6
- # @private
7
- module Base
8
- # Holds local timezone info
9
- @@tz = nil
10
-
11
- # Converts a date like object into utc
12
- #
13
- def to_utc(date)
14
- date.to_time.utc
15
- end
16
- # Converts a date like object into local time
17
- #
18
- def to_local(date)
19
- date.to_time.getgm
20
- end
21
-
22
- # Retrieves the local timezone
23
- def timezone
24
- @@tz || @@tz = TZInfo::Timezone.get(Time.now.zone)
25
- end
26
- end
27
- end
data/test/test_clock.rb DELETED
@@ -1,29 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- class TestClock < MiniTest::Test #:nodoc:
4
- def setup
5
- end
6
-
7
- def test_must_create_midnight_default
8
- clock = Workpattern::Clock.new
9
-
10
- assert_equal 0, clock.minutes, 'total default minutes'
11
- assert_equal 0, clock.hour, 'default hour is zero'
12
- assert_equal 0, clock.min, 'default minute is zero'
13
- time = clock.time
14
- assert time.is_a?(DateTime), 'must return a DateTime object'
15
- assert_equal 0, time.hour, 'hour in the day must be zero'
16
- assert_equal 0, time.min, 'minute in the day must be zero'
17
- end
18
-
19
- def test_must_account_for_out_of_range_values
20
- clock = Workpattern::Clock.new(27, 80)
21
-
22
- assert_equal 1700, clock.minutes, 'total minutes'
23
- assert_equal 4, clock.hour, 'hour is 4'
24
- assert_equal 20, clock.min, 'minute is 20'
25
- time = clock.time
26
- assert time.is_a?(DateTime), 'must return a DateTime object'
27
- assert_equal DateTime.new(1963, 6, 10, 4, 20), time
28
- end
29
- end
data/test/test_helper.rb DELETED
@@ -1,2 +0,0 @@
1
- require 'minitest/autorun'
2
- require File.dirname(__FILE__) + '/../lib/workpattern.rb'
data/test/test_week.rb DELETED
@@ -1,532 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- class TestWeek < MiniTest::Test #:nodoc:
4
- include Workpattern::Base
5
- def setup
6
- start = Time.gm(2000, 1, 3)
7
- finish = Time.gm(2000, 1, 9)
8
-
9
- @w_week = Workpattern::Week.new(start, finish, 1)
10
-
11
- @r_week = Workpattern::Week.new(start, finish, 0)
12
-
13
- @p_week = Workpattern::Week.new(start, finish, 1)
14
- @p_week.workpattern(:weekend, Workpattern.clock(0, 0),
15
- Workpattern.clock(23, 59), 0)
16
- @p_week.workpattern(:weekday, Workpattern.clock(0, 0),
17
- Workpattern.clock(8, 59), 0)
18
- @p_week.workpattern(:weekday, Workpattern.clock(12, 30),
19
- Workpattern.clock(13, 0), 0)
20
- @p_week.workpattern(:weekday, Workpattern.clock(17, 0),
21
- Workpattern.clock(23, 59), 0)
22
- end
23
-
24
- def test_must_create_a_w_week
25
- start = Time.gm(2000, 1, 1, 11, 3)
26
- finish = Time.gm(2005, 12, 31, 16, 41)
27
- w_week = week(start, finish, 1)
28
- assert_equal Time.gm(start.year, start.month, start.day),
29
- w_week.start
30
- assert_equal Time.gm(finish.year, finish.month, finish.day),
31
- w_week.finish
32
- assert_equal 3_156_480, w_week.total # 2192 days
33
- end
34
-
35
- def test_create_w_week_of_3_concecutive_days
36
- start = Time.gm(2000, 1, 2, 11, 3) # Sunday
37
- finish = Time.gm(2000, 1, 4, 16, 41) # Tuesday
38
- w_week = week(start, finish, 1)
39
- assert_equal Time.gm(start.year, start.month,
40
- start.day), w_week.start
41
- assert_equal Time.gm(finish.year, finish.month, finish.day),
42
- w_week.finish
43
- assert_equal 1_440 * 3, w_week.total # 3 days
44
- end
45
-
46
- def test_create_working_week_friday_to_sunday
47
- start = Time.gm(2000, 1, 7, 11, 3) # Friday
48
- finish = Time.gm(2000, 1, 9, 16, 41) # Sunday
49
- w_week = week(start, finish, 1)
50
- assert_equal Time.gm(start.year, start.month, start.day),
51
- w_week.start
52
- assert_equal Time.gm(finish.year, finish.month, finish.day),
53
- w_week.finish
54
- assert_equal 1_440 * 3, w_week.total # 3 days
55
- end
56
-
57
- def test_create_working_week_thursday_to_sunday
58
- start = Time.gm(2000, 1, 6, 11, 3) # Thursday
59
- finish = Time.gm(2000, 1, 8, 16, 41) # Sunday
60
- w_week = week(start, finish, 1)
61
- assert_equal Time.gm(start.year, start.month, start.day),
62
- w_week.start
63
- assert_equal Time.gm(finish.year, finish.month, finish.day),
64
- w_week.finish
65
- assert_equal 1_440 * 3, w_week.total # 3 days
66
- end
67
-
68
- def test_must_create_a_resting_week
69
- start = Time.gm(2000, 1, 1, 11, 3)
70
- finish = Time.gm(2005, 12, 31, 16, 41)
71
- resting_week = week(start, finish, 0)
72
- assert_equal Time.gm(start.year, start.month, start.day),
73
- resting_week.start
74
- assert_equal Time.gm(finish.year, finish.month, finish.day),
75
- resting_week.finish
76
- assert_equal 0, resting_week.total # 2192
77
- assert_equal 0, resting_week.week_total
78
- end
79
-
80
- def test_must_duplicate_all_of_a_week
81
- start = Time.gm(2000, 1, 1, 11, 3)
82
- finish = Time.gm(2005, 12, 31, 16, 41)
83
- week = week(start, finish, 1)
84
- new_week = week.duplicate
85
- assert_equal Time.gm(start.year, start.month, start.day),
86
- new_week.start
87
- assert_equal Time.gm(finish.year, finish.month, finish.day),
88
- new_week.finish
89
- assert_equal 3_156_480, new_week.total # 2192
90
- week.workpattern(:weekend, Workpattern.clock(0, 0),
91
- Workpattern.clock(23, 59), 0)
92
- assert_equal 3_156_480, new_week.total # 2192
93
- end
94
-
95
- def test_must_set_week_pattern_correctly
96
- start = Time.gm(2000, 1, 3)
97
- finish = Time.gm(2000, 1, 9)
98
-
99
- pattern_week = Workpattern::Week.new(start, finish, 1)
100
- assert_equal start, pattern_week.start
101
- assert_equal finish, pattern_week.finish
102
- assert_equal 10_080, pattern_week.week_total
103
- pattern_week.workpattern(:weekend, Workpattern.clock(0, 0),
104
- Workpattern.clock(23, 59), 0)
105
- assert_equal 7_200, pattern_week.week_total
106
- pattern_week.workpattern(:weekday, Workpattern.clock(0, 0),
107
- Workpattern.clock(8, 59), 0)
108
- assert_equal 4_500, pattern_week.week_total
109
- pattern_week.workpattern(:weekday, Workpattern.clock(12, 30),
110
- Workpattern.clock(13, 0), 0)
111
- assert_equal 4_345, pattern_week.week_total
112
- pattern_week.workpattern(:weekday, Workpattern.clock(17, 0),
113
- Workpattern.clock(23, 59), 0)
114
- assert_equal 2_245, pattern_week.week_total
115
- end
116
-
117
- def test_must_set_patterns_correctly
118
- start = Time.gm(2000, 1, 1, 0, 0)
119
- finish = Time.gm(2005, 12, 31, 8, 59)
120
- w_week = week(start, finish, 1)
121
- assert_equal 10_080, w_week.week_total
122
- w_week.workpattern(:all, start, finish, 0)
123
- assert_equal 6_300, w_week.week_total
124
- w_week.workpattern(:sun, start, finish, 1)
125
- assert_equal 6_840, w_week.week_total
126
- w_week.workpattern(:mon, start, finish, 1)
127
- assert_equal 7_380, w_week.week_total
128
- w_week.workpattern(:all, clock(18, 0), clock(18, 19), 0)
129
- assert_equal 7_240, w_week.week_total
130
- w_week.workpattern(:all, clock(0, 0), clock(23, 59), 0)
131
- assert_equal 0, w_week.week_total
132
- w_week.workpattern(:all, clock(0, 0), clock(0, 0), 1)
133
- assert_equal 7, w_week.week_total
134
- w_week.workpattern(:all, clock(23, 59), clock(23, 59), 1)
135
- assert_equal 14, w_week.week_total
136
- w_week.workpattern(:all, clock(0, 0), clock(23, 59), 1)
137
- assert_equal 10_080, w_week.week_total
138
- w_week.workpattern(:weekend, clock(0, 0), clock(23, 59), 0)
139
- assert_equal 7_200, w_week.week_total
140
- end
141
-
142
- def test_must_add_minutes_in_a_w_week_result_in_same_day
143
- r_date, r_duration, m_flag = @w_week.calc(Time.gm(2000, 1, 3, 7, 31),
144
- 29)
145
- assert_equal Time.gm(2000, 1, 3, 8, 0), r_date
146
- refute m_flag
147
- assert_equal 0, r_duration
148
- end
149
-
150
- def test_must_add_minutes_in_a_w_week_result_in_next_day
151
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 3, 7, 31), 990)
152
- assert_equal Time.gm(2000, 1, 4, 0, 1), r_date
153
- refute m_flag
154
- assert_equal 0, r_dur
155
- end
156
-
157
- def test_must_add_minutes_in_a_w_week_result_in_later_day
158
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 3, 7, 31), 2430)
159
- assert_equal Time.gm(2000, 1, 5, 0, 1), r_date
160
- refute m_flag
161
- assert_equal 0, r_dur
162
- end
163
-
164
- def test_must_add_minutes_in_a_w_week_result_in_start_next_day
165
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 3, 7, 31), 989)
166
- assert_equal Time.gm(2000, 1, 4, 0, 0), r_date
167
- refute m_flag
168
- assert_equal 0, r_dur
169
- end
170
-
171
- def test_must_add_0_minutes_in_a_w_week
172
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 3, 7, 31), 0)
173
- assert_equal Time.gm(2000, 1, 3, 7, 31), r_date
174
- refute m_flag
175
- assert_equal 0, r_dur
176
- end
177
-
178
- def test_must_add_too_many_minutes_in_a_w_week
179
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 3, 7, 31), 9630)
180
- assert_equal Time.gm(2000, 1, 10, 0, 0), r_date
181
- refute m_flag
182
- assert_equal 1, r_dur
183
- end
184
-
185
- def test_must_add_minutes_in_a_resting_week
186
- r_date, r_dur, m_flag = @r_week.calc(Time.gm(2000, 1, 3, 7, 31), 29)
187
- assert_equal Time.gm(2000, 1, 10, 0, 0), r_date
188
- refute m_flag
189
- assert_equal 29, r_dur
190
- end
191
-
192
- def test_must_add_minutes_from_start_of_resting_week
193
- r_date, r_dur, m_flag = @r_week.calc(Time.gm(2000, 1, 3, 0, 0), 990)
194
- assert_equal Time.gm(2000, 1, 10, 0, 0), r_date
195
- refute m_flag
196
- assert_equal 990, r_dur
197
- end
198
-
199
- def test_must_add_minutes_to_last_minute_of_a_resting_week
200
- r_date, r_dur, m_flag = @r_week.calc(Time.gm(2000, 1, 9, 23, 59), 2430)
201
- assert_equal Time.gm(2000, 1, 10, 0, 0), r_date
202
- refute m_flag
203
- assert_equal 2_430, r_dur
204
- end
205
-
206
- def test_must_add_zero_minutes_in_a_resting_week
207
- r_date, r_dur, m_flag = @r_week.calc(Time.gm(2000, 1, 3, 7, 31), 0)
208
- assert_equal Time.gm(2000, 1, 3, 7, 31), r_date
209
- refute m_flag
210
- assert_equal 0, r_dur
211
- end
212
-
213
- def test_must_add_minutes_from_working_in_a_pattern_week_result_in_same_day
214
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 3, 10, 11), 110)
215
- assert_equal Time.gm(2000, 1, 3, 12, 1), r_date
216
- refute m_flag
217
- assert_equal 0, r_dur
218
- end
219
-
220
- def test_must_add_minutes_from_resting_in_a_pattern_week_result_in_same_day
221
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 3, 12, 45), 126)
222
- assert_equal Time.gm(2000, 1, 3, 15, 7), r_date
223
- refute m_flag
224
- assert_equal 0, r_dur
225
- end
226
-
227
- def test_must_add_minutes_from_working_in_a_pattern_week_result_in_next_day
228
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 3, 10, 11), 379)
229
- assert_equal Time.gm(2000, 1, 4, 9, 1), r_date
230
- refute m_flag
231
- assert_equal 0, r_dur
232
- end
233
-
234
- def test_must_add_minutes_from_resting_in_a_pattern_week_result_in_next_day
235
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 3, 12, 45), 240)
236
- assert_equal Time.gm(2000, 1, 4, 9, 1), r_date
237
- refute m_flag
238
- assert_equal 0, r_dur
239
- end
240
-
241
- def test_must_add_minutes_from_working_in_a_pattern_week_result_in_later_day
242
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 3, 10, 11), 828)
243
- assert_equal Time.gm(2000, 1, 5, 9, 1), r_date
244
- refute m_flag
245
- assert_equal 0, r_dur
246
- end
247
-
248
- def test_must_add_minutes_from_resting_in_a_w_week_result_in_later_day
249
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 3, 12, 45), 689)
250
- assert_equal Time.gm(2000, 1, 5, 9, 1), r_date
251
- refute m_flag
252
- assert_equal 0, r_dur
253
- end
254
-
255
- def test_must_add_0_minutes_from_working_in_a_resting_week
256
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 3, 10, 11), 0)
257
- assert_equal Time.gm(2000, 1, 3, 10, 11), r_date
258
- refute m_flag
259
- assert_equal 0, r_dur
260
- end
261
-
262
- def test_must_add_0_minutes_from_resting_in_a_resting_week
263
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 3, 12, 45), 0)
264
- assert_equal Time.gm(2000, 1, 3, 12, 45), r_date
265
- refute m_flag
266
- assert_equal 0, r_dur
267
- end
268
-
269
- def test_must_add_too_many_minutes_in_a_pattern__week
270
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 3, 10, 11), 2175)
271
- assert_equal Time.gm(2000, 1, 10, 0, 0), r_date
272
- refute m_flag
273
- assert_equal 1, r_dur
274
- end
275
-
276
- def test_must_subtract_minutes_in_a_w_week_result_in_same_day
277
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 8, 7, 31), -29)
278
- assert_equal Time.gm(2000, 1, 8, 7, 2), r_date
279
- refute m_flag
280
- assert_equal 0, r_dur
281
- end
282
-
283
- def test_must_subtract_minutes_in_a_w_week_result_in_previous_day
284
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 8, 7, 31), -452)
285
- assert_equal Time.gm(2000, 1, 7, 23, 59), r_date
286
- refute m_flag
287
- assert_equal 0, r_dur
288
- end
289
-
290
- def test_must_subtract_minutes_in_a_w_week_result_in_earlier_day
291
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 8, 7, 31), -1892)
292
- assert_equal Time.gm(2000, 1, 6, 23, 59), r_date
293
- refute m_flag
294
- assert_equal 0, r_dur
295
- end
296
-
297
- def test_must_subtract_minutes_in_a_w_week_result_at_start_of_day
298
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 8, 7, 31), -451)
299
- assert_equal Time.gm(2000, 1, 8, 0, 0), r_date
300
- refute m_flag
301
- assert_equal 0, r_dur
302
- end
303
-
304
- def test_must_subtract_minutes_in_a_w_week_result_at_start_of_previous_day
305
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 8, 7, 31), -1891)
306
- assert_equal Time.gm(2000, 1, 7, 0, 0), r_date
307
- refute m_flag
308
- assert_equal 0, r_dur
309
- end
310
-
311
- def test_must_subtract_too_many_minutes_from_a_w_week
312
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 8, 7, 31), -7652)
313
- assert_equal Time.gm(2000, 1, 2, 0, 0), r_date
314
- assert m_flag
315
- assert_equal -1, r_dur
316
- end
317
-
318
- def test_must_subtract_1_minute_from_start_of_next_day_after_w_week
319
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 9, 0, 0), -1, true)
320
- assert_equal Time.gm(2000, 1, 9, 23, 59), r_date
321
- refute m_flag
322
- assert_equal 0, r_dur
323
- end
324
-
325
- def test_must_subtract_2_minutes_from_start_of_next_day_after_w_week
326
- r_date, r_dur, m_flag = @w_week.calc(Time.gm(2000, 1, 9, 0, 0), -2, true)
327
- assert_equal Time.gm(2000, 1, 9, 23, 58), r_date
328
- refute m_flag
329
- assert_equal 0, r_dur
330
- end
331
-
332
- def test_must_subtract_minutes_from_last_day_in_a_resting_week
333
- r_date, r_dur, m_flag = @r_week.calc(Time.gm(2000, 1, 10, 7, 31), -29)
334
- assert_equal Time.gm(2000, 1, 2, 0, 0), r_date
335
- assert m_flag
336
- assert_equal -29, r_dur
337
- end
338
-
339
- def test_must_subtract_minutes_from_middle_day_in_a_resting_week
340
- r_date, r_dur, m_flag = @r_week.calc(Time.gm(2000, 1, 8, 7, 31), -452)
341
- assert_equal Time.gm(2000, 1, 2, 0, 0), r_date
342
- assert m_flag
343
- assert_equal -452, r_dur
344
- end
345
-
346
- def test_must_subtract_minutes_from_start_of_resting_week
347
- r_date, r_dur, m_flag = @r_week.calc(Time.gm(2000, 1, 3, 0, 0), -1892)
348
- assert_equal Time.gm(2000, 1, 2, 0, 0), r_date
349
- assert m_flag
350
- assert_equal -1_892, r_dur
351
- end
352
-
353
- def test_must_subtract_minutes_from_start_of_next_day_after_resting_week
354
- r_date, r_dur, m_flag = @r_week.calc(Time.gm(2000, 1, 9, 0, 0), -1, true)
355
- assert_equal Time.gm(2000, 1, 2, 0, 0), r_date
356
- assert m_flag
357
- assert_equal -1, r_dur
358
- end
359
-
360
- def test_must_subtract_minutes_from_resting_day_in_a_pattern_week
361
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 8, 13, 29), -29)
362
- assert_equal Time.gm(2000, 1, 7, 16, 31), r_date
363
- refute m_flag
364
- assert_equal 0, r_dur
365
- end
366
-
367
- def test_must_subtract_minutes_from_working_day_in_a_pattern_week
368
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 7, 13, 29), -29)
369
- assert_equal Time.gm(2000, 1, 7, 12, 29), r_date
370
- refute m_flag
371
- assert_equal 0, r_dur
372
- end
373
-
374
- def test_must_subtract_minutes_in_a_pattern_week_result_in_previous_day
375
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 7, 9, 1), -2)
376
- assert_equal Time.gm(2000, 1, 6, 16, 59), r_date
377
- refute m_flag
378
- assert_equal 0, r_dur
379
- end
380
-
381
- def test_must_subtract_minutes_in_a_pattern_week_result_in_earlier_day
382
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 7, 13, 29), -240)
383
- assert_equal Time.gm(2000, 1, 6, 16, 58), r_date
384
- refute m_flag
385
- assert_equal 0, r_dur
386
- end
387
-
388
- def test_must_subtract_minutes_in_a_pattern_week_result_at_start_of_day
389
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 7, 13, 29), -238)
390
- assert_equal Time.gm(2000, 1, 7, 9, 0), r_date
391
- refute m_flag
392
- assert_equal 0, r_dur
393
- end
394
-
395
- def test_must_subtract_minutes_in_a_pattern_week_result_at_start_of_prev_day
396
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 7, 13, 29), -687)
397
- assert_equal Time.gm(2000, 1, 6, 9, 0), r_date
398
- refute m_flag
399
- assert_equal 0, r_dur
400
- end
401
-
402
- def test_must_subtract_too_many_minutes_from_a_pattern_week
403
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 7, 9, 0), -1797)
404
- assert_equal Time.gm(2000, 1, 2, 0, 0), r_date
405
- assert m_flag
406
- assert_equal -1, r_dur
407
- end
408
-
409
- def test_must_subtract_1_minute_from_start_of_next_day_after_pattern_week
410
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 9, 0, 0), -1, true)
411
- assert_equal Time.gm(2000, 1, 7, 16, 59), r_date
412
- refute m_flag
413
- assert_equal 0, r_dur
414
- end
415
-
416
- def test_must_subtract_2_minutes_from_start_of_next_day_after_pattern_week
417
- r_date, r_dur, m_flag = @p_week.calc(Time.gm(2000, 1, 9, 0, 0), -2, true)
418
- assert_equal Time.gm(2000, 1, 7, 16, 58), r_date
419
- refute m_flag
420
- assert_equal 0, r_dur
421
- end
422
-
423
- def must_diff_day_week_day_in_patterned_week
424
- start = Time.gm(2013, 9, 23, 0, 0)
425
- finish = Time.gm(2013, 10, 20, 23, 59)
426
- w_week = week(start, finish, 1)
427
- w_week.workpattern :all, Workpattern.clock(0, 0),
428
- Workpattern.clock(8, 59), 0
429
- w_week.workpattern :all, Workpattern.clock(12, 0),
430
- Workpattern.clock(12, 59), 0
431
- w_week.workpattern :all, Workpattern.clock(18, 0),
432
- Workpattern.clock(23, 59), 0
433
- s_date = Time.gm(2013, 10, 3, 16, 0)
434
- f_date = Time.gm(2013, 10, 15, 12, 30)
435
- duration, start = w_week.diff(s_date, f_date)
436
-
437
- assert_equal 5_640, duration
438
- assert_equal Time.gm(2013, 10, 15, 12, 30), start
439
- end
440
-
441
- def test_must_calculate_difference_between_dates_in_w_week
442
- late_date = Time.gm(2000, 1, 6, 9, 32)
443
- early_date = Time.gm(2000, 1, 6, 8, 20)
444
- result_dur, r_date = @w_week.diff(early_date, late_date)
445
- assert_equal 72, result_dur
446
- assert_equal late_date, r_date
447
- end
448
-
449
- def test_must_calculate_difference_between_dates_in_resting_week
450
- late_date = Time.gm(2000, 1, 6, 9, 32)
451
- early_date = Time.gm(2000, 1, 6, 8, 20)
452
- result_dur, r_date = @r_week.diff(early_date, late_date)
453
- assert_equal 0, result_dur
454
- assert_equal late_date, r_date
455
- end
456
-
457
- def test_must_calculate_difference_between_dates_in_pattern_week
458
- late_date = Time.gm(2000, 1, 6, 13, 1)
459
- early_date = Time.gm(2000, 1, 6, 12, 29)
460
- result_dur, r_date = @p_week.diff(early_date, late_date)
461
- assert_equal 1, result_dur
462
- assert_equal late_date, r_date
463
- end
464
-
465
- def test_must_diff_from_last_day_of_patterned_week
466
- # #issue 15
467
- start = Time.gm(2013, 9, 23, 0, 0)
468
- finish = Time.gm(2013, 9, 26, 23, 59)
469
- w_week = week(start, finish, 1)
470
- w_week.workpattern :all, Workpattern.clock(0, 0),
471
- Workpattern.clock(8, 59), 0
472
- w_week.workpattern :all, Workpattern.clock(12, 0),
473
- Workpattern.clock(12, 59), 0
474
- w_week.workpattern :all, Workpattern.clock(18, 0),
475
- Workpattern.clock(23, 59), 0
476
-
477
- s_date = Time.gm(2013, 9, 26, 17, 0)
478
- f_date = Time.gm(2013, 9, 27, 10, 0)
479
- duration, start = w_week.diff(s_date, f_date)
480
-
481
- assert_equal 60, duration
482
- assert_equal Time.gm(2013, 9, 27, 0, 0), start
483
- end
484
-
485
- def test_must_diff_long_distances_beyond_end_of_patterned_week
486
- start = Time.gm(2013, 9, 23, 0, 0)
487
- finish = Time.gm(2013, 10, 20, 23, 59)
488
- w_week = week(start, finish, 1)
489
- w_week.workpattern :all, Workpattern.clock(0, 0),
490
- Workpattern.clock(8, 59), 0
491
- w_week.workpattern :all, Workpattern.clock(12, 0),
492
- Workpattern.clock(12, 59), 0
493
- w_week.workpattern :all, Workpattern.clock(18, 0),
494
- Workpattern.clock(23, 59), 0
495
-
496
- s_date = Time.gm(2013, 9, 26, 17, 0)
497
- f_date = Time.gm(2018, 9, 27, 10, 0)
498
- duration, start = w_week.diff(s_date, f_date)
499
-
500
- assert_equal 11_580, duration
501
- assert_equal Time.gm(2013, 10, 21, 0, 0), start
502
- end
503
-
504
- def test_must_diff_long_distances_within_patterned_week
505
- start = Time.gm(2013, 9, 23, 0, 0)
506
- finish = Time.gm(2013, 10, 20, 23, 59)
507
- w_week = week(start, finish, 1)
508
- w_week.workpattern :all, Workpattern.clock(0, 0),
509
- Workpattern.clock(8, 59), 0
510
- w_week.workpattern :all, Workpattern.clock(12, 0),
511
- Workpattern.clock(12, 59), 0
512
- w_week.workpattern :all, Workpattern.clock(18, 0),
513
- Workpattern.clock(23, 59), 0
514
-
515
- s_date = Time.gm(2013, 9, 26, 17, 0)
516
- f_date = Time.gm(2013, 10, 15, 10, 0)
517
- duration, start = w_week.diff(s_date, f_date)
518
-
519
- assert_equal 8_760, duration
520
- assert_equal Time.gm(2013, 10, 15, 10, 0), start
521
- end
522
-
523
- private
524
-
525
- def week(start, finish, type)
526
- Workpattern::Week.new(start, finish, type)
527
- end
528
-
529
- def clock(hour, min)
530
- Workpattern.clock(hour, min)
531
- end
532
- end