workpattern 0.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/.gitignore +2 -0
- data/CHANGELOG +4 -0
- data/Gemfile +4 -0
- data/README.md +71 -0
- data/Rakefile +11 -0
- data/config/website.yml +2 -0
- data/lib/workpattern/clock.rb +63 -0
- data/lib/workpattern/day.rb +259 -0
- data/lib/workpattern/hour.rb +166 -0
- data/lib/workpattern/utility/base.rb +14 -0
- data/lib/workpattern/version.rb +3 -0
- data/lib/workpattern/week.rb +261 -0
- data/lib/workpattern/workpattern.rb +236 -0
- data/lib/workpattern.rb +226 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +71 -0
- data/test/test_clock.rb +31 -0
- data/test/test_day.rb +402 -0
- data/test/test_helper.rb +25 -0
- data/test/test_hour.rb +252 -0
- data/test/test_week.rb +236 -0
- data/test/test_workpattern.rb +260 -0
- data/test/test_workpattern_module.rb +93 -0
- data/workpattern.gemspec +24 -0
- metadata +72 -0
data/test/test_week.rb
ADDED
@@ -0,0 +1,236 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestWeek < Test::Unit::TestCase #:nodoc:
|
4
|
+
|
5
|
+
def setup
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
must "create a working week" do
|
10
|
+
start=DateTime.new(2000,1,1,11,3)
|
11
|
+
finish=DateTime.new(2005,12,31,16,41)
|
12
|
+
working_week=week(start,finish,1)
|
13
|
+
assert_equal DateTime.new(start.year,start.month,start.day), working_week.start
|
14
|
+
assert_equal DateTime.new(finish.year,finish.month,finish.day), working_week.finish
|
15
|
+
assert_equal 3156480, working_week.total#2192
|
16
|
+
end
|
17
|
+
|
18
|
+
must "create a resting week" do
|
19
|
+
start=DateTime.new(2000,1,1,11,3)
|
20
|
+
finish=DateTime.new(2005,12,31,16,41)
|
21
|
+
resting_week=week(start,finish,0)
|
22
|
+
assert_equal DateTime.new(start.year,start.month,start.day), resting_week.start
|
23
|
+
assert_equal DateTime.new(finish.year,finish.month,finish.day), resting_week.finish
|
24
|
+
assert_equal 0, resting_week.total#2192
|
25
|
+
assert_equal 0,resting_week.week_total
|
26
|
+
end
|
27
|
+
|
28
|
+
must 'duplicate all of a week' do
|
29
|
+
start=DateTime.new(2000,1,1,11,3)
|
30
|
+
finish=DateTime.new(2005,12,31,16,41)
|
31
|
+
week=week(start,finish,1)
|
32
|
+
new_week=week.duplicate
|
33
|
+
assert_equal DateTime.new(start.year,start.month,start.day), new_week.start
|
34
|
+
assert_equal DateTime.new(finish.year,finish.month,finish.day), new_week.finish
|
35
|
+
assert_equal 3156480, new_week.total#2192
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
must "set patterns correctly" do
|
40
|
+
start=DateTime.new(2000,1,1,0,0)
|
41
|
+
finish=DateTime.new(2005,12,31,8,59)
|
42
|
+
working_week=week(start,finish,1)
|
43
|
+
assert_equal 10080, working_week.week_total
|
44
|
+
working_week.workpattern(:all,start,finish,0)
|
45
|
+
assert_equal 6300, working_week.week_total
|
46
|
+
working_week.workpattern(:sun,start,finish,1)
|
47
|
+
assert_equal 6840, working_week.week_total
|
48
|
+
working_week.workpattern(:mon,start,finish,1)
|
49
|
+
assert_equal 7380, working_week.week_total
|
50
|
+
working_week.workpattern(:all,clock(18,0),clock(18,19),0)
|
51
|
+
assert_equal 7240, working_week.week_total
|
52
|
+
working_week.workpattern(:all,clock(0,0),clock(23,59),0)
|
53
|
+
assert_equal 0, working_week.week_total
|
54
|
+
working_week.workpattern(:all,clock(0,0),clock(0,0),1)
|
55
|
+
assert_equal 7, working_week.week_total
|
56
|
+
working_week.workpattern(:all,clock(23,59),clock(23,59),1)
|
57
|
+
assert_equal 14, working_week.week_total
|
58
|
+
working_week.workpattern(:all,clock(0,0),clock(23,59),1)
|
59
|
+
assert_equal 10080, working_week.week_total
|
60
|
+
working_week.workpattern(:weekend,clock(0,0),clock(23,59),0)
|
61
|
+
assert_equal 7200, working_week.week_total
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
must 'add minutes in a working week' do
|
66
|
+
start=DateTime.new(2000,1,1,0,0)
|
67
|
+
finish=DateTime.new(2005,12,31,8,59)
|
68
|
+
working_week=week(start,finish,1)
|
69
|
+
result_date, result_duration= working_week.calc(start,0)
|
70
|
+
assert_equal start,result_date, "#{start} + #{0}"
|
71
|
+
result_date,result_duration=working_week.calc(finish,0)
|
72
|
+
assert_equal finish,result_date, "#{finish} + #{0}"
|
73
|
+
result_date,result_duration=working_week.calc(finish,10)
|
74
|
+
assert_equal DateTime.new(2005,12,31,9,9),result_date, "#{finish} + #{10}"
|
75
|
+
end
|
76
|
+
|
77
|
+
must 'add minutes in a resting week' do
|
78
|
+
assert true
|
79
|
+
end
|
80
|
+
|
81
|
+
must 'add minutes in a patterned week' do
|
82
|
+
assert true
|
83
|
+
end
|
84
|
+
|
85
|
+
must 'subtract minutes in a working week' do
|
86
|
+
start=DateTime.new(2000,1,1,0,0)
|
87
|
+
finish=DateTime.new(2005,12,31,8,59)
|
88
|
+
working_week=week(start,finish,1)
|
89
|
+
result_date, result_duration= working_week.calc(start,0)
|
90
|
+
assert_equal start,result_date, "#{start} + #{0}"
|
91
|
+
result_date,result_duration=working_week.calc(finish,0)
|
92
|
+
assert_equal finish,result_date, "#{finish} + #{0}"
|
93
|
+
result_date,result_duration=working_week.calc(finish,-10)
|
94
|
+
assert_equal DateTime.new(2005,12,31,8,49),result_date, "#{finish} - #{10}"
|
95
|
+
result_date,result_duration=working_week.calc(DateTime.new(2005,12,31,0,0),-10)
|
96
|
+
assert_equal DateTime.new(2005,12,30,23,50),result_date, "#{DateTime.new(2005,12,31,0,0)} - #{10}"
|
97
|
+
end
|
98
|
+
|
99
|
+
must 'subtract minutes in a resting week' do
|
100
|
+
assert true
|
101
|
+
end
|
102
|
+
|
103
|
+
must 'subtract minutes in a patterned week' do
|
104
|
+
assert true
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
must 'create complex patterns' do
|
109
|
+
assert true
|
110
|
+
end
|
111
|
+
|
112
|
+
must "calculate difference between dates in working week" do
|
113
|
+
start=DateTime.new(2012,10,1)
|
114
|
+
finish=DateTime.new(2012,10,7)
|
115
|
+
week=week(start,finish,1)
|
116
|
+
|
117
|
+
[
|
118
|
+
[ 2012,10, 1, 0, 0, 2012,10, 1, 0, 0, 0,2012,10, 1, 0, 0],
|
119
|
+
[ 2012,10, 1, 0, 0, 2012,10, 1, 0, 1, 1,2012,10, 1, 0, 1],
|
120
|
+
[ 2012,10, 1, 0,50, 2012,10, 1, 0,59, 9,2012,10, 1, 0,59],
|
121
|
+
[ 2012,10, 1, 8,50, 2012,10, 1, 9, 0, 10,2012,10, 1, 9, 0],
|
122
|
+
[ 2012,10, 1, 0, 0, 2012,10, 1,23,59, 1439,2012,10, 1,23,59],
|
123
|
+
[ 2012,10, 1, 0, 0, 2012,10, 2, 0, 0, 1440,2012,10, 2, 0, 0],
|
124
|
+
[ 2012,10, 1, 0, 0, 2012,10, 2, 0, 1, 1441,2012,10, 2, 0, 1],
|
125
|
+
[ 2012,10, 1, 0, 0, 2013, 3,22, 6,11,10080,2012,10, 8, 0, 0],
|
126
|
+
[ 2012,10, 1, 0, 1, 2012,10, 1, 0, 0, 1,2012,10, 1, 0, 1],
|
127
|
+
[ 2012,10, 1, 0,59, 2012,10, 1, 0,50, 9,2012,10, 1, 0,59],
|
128
|
+
[ 2012,10, 1, 9, 0, 2012,10, 1, 8,50, 10,2012,10, 1, 9, 0],
|
129
|
+
[ 2012,10, 1,23,59, 2012,10, 1, 0, 0, 1439,2012,10, 1,23,59],
|
130
|
+
[ 2012,10, 2, 0, 0, 2012,10, 1, 0, 0, 1440,2012,10, 2, 0, 0],
|
131
|
+
[ 2012,10, 2, 0, 1, 2012,10, 1, 0, 0, 1441,2012,10, 2, 0, 1],
|
132
|
+
[ 2013, 3,22, 6,11, 2012,10, 1, 0, 0,10080,2012,10, 8, 0, 0],
|
133
|
+
[ 2012,10, 2, 6,11, 2012,10, 4, 8, 9, 2998,2012,10, 4, 8, 9]
|
134
|
+
].each {|start_year, start_month, start_day, start_hour,start_min,
|
135
|
+
finish_year, finish_month, finish_day, finish_hour,finish_min,result,
|
136
|
+
y,m,d,h,n|
|
137
|
+
start=DateTime.new(start_year, start_month, start_day, start_hour,start_min)
|
138
|
+
finish=DateTime.new(finish_year, finish_month, finish_day, finish_hour,finish_min)
|
139
|
+
expected_date=DateTime.new(y,m,d,h,n)
|
140
|
+
duration, result_date=week.diff(start,finish)
|
141
|
+
assert_equal result, duration,"duration diff(#{start}, #{finish})"
|
142
|
+
assert_equal expected_date, result_date,"date diff(#{start}, #{finish})"
|
143
|
+
}
|
144
|
+
end
|
145
|
+
|
146
|
+
must "calculate difference between dates in resting week" do
|
147
|
+
|
148
|
+
start=DateTime.new(2012,10,1)
|
149
|
+
finish=DateTime.new(2012,10,7)
|
150
|
+
week=week(start,finish,0)
|
151
|
+
|
152
|
+
[
|
153
|
+
[ 2012,10, 1, 0, 0, 2012,10, 1, 0, 0, 0,2012,10, 1, 0, 0],
|
154
|
+
[ 2012,10, 1, 0, 0, 2012,10, 1, 0, 1, 0,2012,10, 1, 0, 1],
|
155
|
+
[ 2012,10, 1, 0,50, 2012,10, 1, 0,59, 0,2012,10, 1, 0,59],
|
156
|
+
[ 2012,10, 1, 8,50, 2012,10, 1, 9, 0, 0,2012,10, 1, 9, 0],
|
157
|
+
[ 2012,10, 1, 0, 0, 2012,10, 1,23,59, 0,2012,10, 1,23,59],
|
158
|
+
[ 2012,10, 1, 0, 0, 2012,10, 2, 0, 0, 0,2012,10, 2, 0, 0],
|
159
|
+
[ 2012,10, 1, 0, 0, 2012,10, 2, 0, 1, 0,2012,10, 2, 0, 1],
|
160
|
+
[ 2012,10, 1, 0, 0, 2013, 3,22, 6,11, 0,2012,10, 8, 0, 0],
|
161
|
+
[ 2012,10, 1, 0, 1, 2012,10, 1, 0, 0, 0,2012,10, 1, 0, 1],
|
162
|
+
[ 2012,10, 1, 0,59, 2012,10, 1, 0,50, 0,2012,10, 1, 0,59],
|
163
|
+
[ 2012,10, 1, 9, 0, 2012,10, 1, 8,50, 0,2012,10, 1, 9, 0],
|
164
|
+
[ 2012,10, 1,23,59, 2012,10, 1, 0, 0, 0,2012,10, 1,23,59],
|
165
|
+
[ 2012,10, 2, 0, 0, 2012,10, 1, 0, 0, 0,2012,10, 2, 0, 0],
|
166
|
+
[ 2012,10, 2, 0, 1, 2012,10, 1, 0, 0, 0,2012,10, 2, 0, 1],
|
167
|
+
[ 2013, 3,22, 6,11, 2012,10, 1, 0, 0, 0,2012,10, 8, 0, 0]
|
168
|
+
].each {|start_year, start_month, start_day, start_hour,start_min,
|
169
|
+
finish_year, finish_month, finish_day, finish_hour,finish_min,result,
|
170
|
+
y,m,d,h,n|
|
171
|
+
start=DateTime.new(start_year, start_month, start_day, start_hour,start_min)
|
172
|
+
finish=DateTime.new(finish_year, finish_month, finish_day, finish_hour,finish_min)
|
173
|
+
expected_date=DateTime.new(y,m,d,h,n)
|
174
|
+
duration, result_date=week.diff(start,finish)
|
175
|
+
assert_equal result, duration,"duration diff(#{start}, #{finish})"
|
176
|
+
assert_equal expected_date, result_date,"date diff(#{start}, #{finish})"
|
177
|
+
}
|
178
|
+
end
|
179
|
+
|
180
|
+
must "calculate difference between dates in pattern week" do
|
181
|
+
|
182
|
+
day = Workpattern::Day.new(1)
|
183
|
+
[[0,0,8,59],
|
184
|
+
[12,0,12,59],
|
185
|
+
[17,0,22,59]
|
186
|
+
].each {|start_hour,start_min,finish_hour,finish_min|
|
187
|
+
day.workpattern(clock(start_hour, start_min),
|
188
|
+
clock(finish_hour, finish_min),
|
189
|
+
0)
|
190
|
+
}
|
191
|
+
assert_equal 480, day.total, "minutes in patterned day should be 480"
|
192
|
+
assert_equal 1, day.minutes(16,59,16,59),"16:59 should be 1"
|
193
|
+
assert_equal 0, day.minutes(17,0,17,0),"17:00 should be 0"
|
194
|
+
assert_equal 0, day.minutes(22,59,22,59),"22:59 should be 0"
|
195
|
+
assert_equal 1, day.minutes(23,0,23,0),"23:00 should be 1"
|
196
|
+
|
197
|
+
[
|
198
|
+
[ 2012,10, 1, 0, 0, 2012,10, 1, 0, 0, 0,2012,10, 1, 0, 0],
|
199
|
+
[ 2012,10, 1, 0, 0, 2012,10, 1, 0, 1, 0,2012,10, 1, 0, 1],
|
200
|
+
[ 2012,10, 1, 0,50, 2012,10, 1, 9,59, 59,2012,10, 1, 9,59],
|
201
|
+
[ 2012,10, 1, 8,50, 2012,10, 1, 9,10, 10,2012,10, 1, 9,10],
|
202
|
+
[ 2012,10, 1, 0, 0, 2012,10, 1,23,59, 479,2012,10, 1,23,59],
|
203
|
+
[ 2012,10, 1, 0, 0, 2012,10, 2, 0, 0, 480,2012,10, 2, 0, 0],
|
204
|
+
[ 2012,10, 1, 0, 0, 2012,10, 2, 0, 1, 480,2012,10, 2, 0, 0],
|
205
|
+
[ 2012,10, 1, 0, 0, 2013, 3,22, 6,11, 480,2012,10, 2, 0, 0],
|
206
|
+
[ 2012,10, 1, 0, 1, 2012,10, 1, 0, 0, 0,2012,10, 1, 0, 1],
|
207
|
+
[ 2012,10, 1, 9,59, 2012,10, 1, 0,50, 59,2012,10, 1, 9,59],
|
208
|
+
[ 2012,10, 1, 9, 0, 2012,10, 1, 8,50, 0,2012,10, 1, 9, 0],
|
209
|
+
[ 2012,10, 1,23,59, 2012,10, 1, 0, 0, 479,2012,10, 1,23,59],
|
210
|
+
[ 2012,10, 2, 0, 0, 2012,10, 1, 0, 0, 480,2012,10, 2, 0, 0],
|
211
|
+
[ 2012,10, 2, 0, 1, 2012,10, 1, 0, 0, 480,2012,10, 2, 0, 0],
|
212
|
+
[ 2013, 3,22, 6,11, 2012,10, 1, 0, 0, 480,2012,10, 2, 0, 0]
|
213
|
+
].each {|start_year, start_month, start_day, start_hour,start_min,
|
214
|
+
finish_year, finish_month, finish_day, finish_hour,finish_min,result,
|
215
|
+
y,m,d,h,n|
|
216
|
+
start=DateTime.new(start_year, start_month, start_day, start_hour,start_min)
|
217
|
+
finish=DateTime.new(finish_year, finish_month, finish_day, finish_hour,finish_min)
|
218
|
+
expected_date=DateTime.new(y,m,d,h,n)
|
219
|
+
duration, result_date=day.diff(start,finish)
|
220
|
+
assert_equal result, duration,"duration diff(#{start}, #{finish})"
|
221
|
+
assert_equal expected_date, result_date,"date diff(#{start}, #{finish})"
|
222
|
+
}
|
223
|
+
|
224
|
+
end
|
225
|
+
|
226
|
+
private
|
227
|
+
|
228
|
+
def week(start,finish,type)
|
229
|
+
return Workpattern::Week.new(start,finish,type)
|
230
|
+
end
|
231
|
+
|
232
|
+
def clock(hour,min)
|
233
|
+
return Workpattern.clock(hour,min)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
@@ -0,0 +1,260 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestWorkpattern < Test::Unit::TestCase #:nodoc:
|
4
|
+
|
5
|
+
def setup
|
6
|
+
Workpattern.clear()
|
7
|
+
end
|
8
|
+
|
9
|
+
must "create a working workpattern" do
|
10
|
+
name='mywp'
|
11
|
+
base=2001
|
12
|
+
span=11
|
13
|
+
wp=Workpattern.new(name,base,span)
|
14
|
+
assert_equal name, wp.name
|
15
|
+
assert_equal base, wp.base
|
16
|
+
assert_equal span, wp.span
|
17
|
+
assert_equal DateTime.new(base), wp.from
|
18
|
+
assert_equal DateTime.new(base+span-1,12,31,23,59), wp.to
|
19
|
+
end
|
20
|
+
|
21
|
+
must "set patterns correctly" do
|
22
|
+
name='mypattern'
|
23
|
+
base=2000
|
24
|
+
span=11
|
25
|
+
wp=Workpattern.new(name,base,span)
|
26
|
+
|
27
|
+
start=clock(0,0)
|
28
|
+
finish=clock(8,59)
|
29
|
+
assert_equal 10080, get_week(wp.weeks).week_total
|
30
|
+
wp.workpattern(:days=>:all,:from_time=>start,:to_time=>finish,:work_type=>0)
|
31
|
+
assert_equal 6300, get_week(wp.weeks).week_total
|
32
|
+
wp.workpattern(:days=>:sun,:from_time=>start,:to_time=>finish,:work_type=>1)
|
33
|
+
assert_equal 6840, get_week(wp.weeks).week_total
|
34
|
+
wp.workpattern(:days=>:mon,:from_time=>start,:to_time=>finish,:work_type=>1)
|
35
|
+
assert_equal 7380, get_week(wp.weeks).week_total
|
36
|
+
wp.workpattern(:days=>:all,:from_time=>clock(18,0),:to_time=>clock(18,19),:work_type=>0)
|
37
|
+
assert_equal 7240, get_week(wp.weeks).week_total
|
38
|
+
wp.workpattern(:days=>:all,:from_time=>clock(0,0),:to_time=>clock(23,59),:work_type=>0)
|
39
|
+
assert_equal 0, get_week(wp.weeks).week_total
|
40
|
+
wp.workpattern(:days=>:all,:from_time=>clock(0,0),:to_time=>clock(0,0),:work_type=>1)
|
41
|
+
assert_equal 7, get_week(wp.weeks).week_total
|
42
|
+
wp.workpattern(:days=>:all,:from_time=>clock(23,59),:to_time=>clock(23,59),:work_type=>1)
|
43
|
+
assert_equal 14, get_week(wp.weeks).week_total
|
44
|
+
wp.workpattern(:days=>:all,:from_time=>clock(0,0),:to_time=>clock(23,59),:work_type=>1)
|
45
|
+
assert_equal 10080, get_week(wp.weeks).week_total
|
46
|
+
wp.workpattern(:days=>:weekend,:from_time=>clock(0,0),:to_time=>clock(23,59),:work_type=>0)
|
47
|
+
assert_equal 7200, get_week(wp.weeks).week_total
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
must 'add minutes in a working workpattern' do
|
52
|
+
name='mypattern'
|
53
|
+
base=1999
|
54
|
+
span=11
|
55
|
+
wp=Workpattern.new(name,base,span)
|
56
|
+
tests=[[2000,1,1,0,0,3,2000,1,1,0,3],
|
57
|
+
[2000,1,1,23,59,0,2000,1,1,23,59],
|
58
|
+
[2000,1,1,23,59,1,2000,1,2,0,0],
|
59
|
+
[2000,1,1,23,59,2,2000,1,2,0,1],
|
60
|
+
[2000,1,1,9,10,33,2000,1,1,9,43],
|
61
|
+
[2000,1,1,9,10,60,2000,1,1,10,10],
|
62
|
+
[2000,1,1,9,0,931,2000,1,2,0,31],
|
63
|
+
[2000,1,1,0,0,3,2000,1,1,0,3]
|
64
|
+
]
|
65
|
+
clue="add minutes in a working workpattern"
|
66
|
+
calc_test(wp,tests,clue)
|
67
|
+
end
|
68
|
+
|
69
|
+
must 'add minutes in a resting workpattern' do
|
70
|
+
name='mypattern'
|
71
|
+
base=1999
|
72
|
+
span=11
|
73
|
+
wp=Workpattern.new(name,base,span)
|
74
|
+
start=DateTime.new(1999,6,11,0,0)
|
75
|
+
finish=DateTime.new(2003,6,8,0,0)
|
76
|
+
wp.workpattern(:days=>:all,:start=> start, :finish=>finish, :work_type=>0 )
|
77
|
+
tests=[[2000,1,1,0,0,3,2003,6,9,0,3],
|
78
|
+
[2000,1,1,23,59,0,2000,1,1,23,59],
|
79
|
+
[2000,1,1,23,59,1,2003,6,9,0,1],
|
80
|
+
[2000,1,1,23,59,2,2003,6,9,0,2],
|
81
|
+
[2000,1,1,9,10,33,2003,6,9,0,33],
|
82
|
+
[2000,1,1,9,10,60,2003,6,9,1,0],
|
83
|
+
[2000,1,1,9,0,931,2003,6,9,15,31],
|
84
|
+
[2000,1,1,0,0,3,2003,6,9,0,3]
|
85
|
+
]
|
86
|
+
clue="add minutes in a resting workpattern"
|
87
|
+
calc_test(wp,tests,clue)
|
88
|
+
end
|
89
|
+
|
90
|
+
must 'add minutes in a patterned workpattern' do
|
91
|
+
assert true
|
92
|
+
end
|
93
|
+
|
94
|
+
must 'subtract minutes in a working workpattern' do
|
95
|
+
name='mypattern'
|
96
|
+
base=1999
|
97
|
+
span=11
|
98
|
+
wp=Workpattern.new(name,base,span)
|
99
|
+
tests=[[2000,1,1,0,0,-3,1999,12,31,23,57],
|
100
|
+
[2000,1,1,23,59,0,2000,1,1,23,59],
|
101
|
+
[2000,1,1,23,59,-1,2000,1,1,23,58],
|
102
|
+
[2000,1,1,23,59,-2,2000,1,1,23,57],
|
103
|
+
[2000,1,1,9,10,-33,2000,1,1,8,37],
|
104
|
+
[2000,1,1,9,10,-60,2000,1,1,8,10],
|
105
|
+
[2000,1,1,9,0,-931,1999,12,31,17,29],
|
106
|
+
[2000,1,1,0,0,-3,1999,12,31,23,57]
|
107
|
+
]
|
108
|
+
clue="subtract minutes in a working workpattern"
|
109
|
+
calc_test(wp,tests,clue)
|
110
|
+
end
|
111
|
+
|
112
|
+
must 'subtract minutes in a resting workpattern' do
|
113
|
+
name='mypattern'
|
114
|
+
base=1999
|
115
|
+
span=11
|
116
|
+
wp=Workpattern.new(name,base,span)
|
117
|
+
start=DateTime.new(1999,6,11,0,0)
|
118
|
+
finish=DateTime.new(2003,6,8,0,0)
|
119
|
+
wp.workpattern(:days=>:all,:start=> start, :finish=>finish, :work_type=>0 )
|
120
|
+
tests=[[2000,1,1,0,0,-3,1999,6,10,23,57],
|
121
|
+
[2000,1,1,23,59,0,2000,1,1,23,59],
|
122
|
+
[2000,1,1,23,59,-1,1999,6,10,23,59],
|
123
|
+
[2000,1,1,23,59,-2,1999,6,10,23,58],
|
124
|
+
[2000,1,1,9,10,-33,1999,6,10,23,27],
|
125
|
+
[2000,1,1,9,10,-60,1999,6,10,23,0],
|
126
|
+
[2000,1,1,9,0,-931,1999,6,10,8,29],
|
127
|
+
[2000,1,1,0,0,-3,1999,6,10,23,57]
|
128
|
+
]
|
129
|
+
clue="subtract minutes in a resting workpattern"
|
130
|
+
calc_test(wp,tests,clue)
|
131
|
+
end
|
132
|
+
|
133
|
+
must 'subtract minutes in a patterned workpattern' do
|
134
|
+
assert true
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
must "calculate difference between dates in working calender" do
|
139
|
+
name='mypattern'
|
140
|
+
base=1999
|
141
|
+
span=40
|
142
|
+
wp=Workpattern.new(name,base,span)
|
143
|
+
|
144
|
+
[
|
145
|
+
[ 2012,10, 1, 0, 0, 2012,10, 1, 0, 0, 0],
|
146
|
+
[ 2012,10, 1, 0, 0, 2012,10, 1, 0, 1, 1],
|
147
|
+
[ 2012,10, 1, 0,50, 2012,10, 1, 0,59, 9],
|
148
|
+
[ 2012,10, 1, 8,50, 2012,10, 1, 9, 0, 10],
|
149
|
+
[ 2012,10, 1, 0, 0, 2012,10, 1,23,59, 1439],
|
150
|
+
[ 2012,10, 1, 0, 0, 2012,10, 2, 0, 0, 1440],
|
151
|
+
[ 2012,10, 1, 0, 0, 2012,10, 2, 0, 1, 1441],
|
152
|
+
[ 2012,10, 1, 0, 0, 2013, 3,22, 6,11,248051],
|
153
|
+
[ 2012,10, 1, 0, 1, 2012,10, 1, 0, 0, 1],
|
154
|
+
[ 2012,10, 1, 0,59, 2012,10, 1, 0,50, 9],
|
155
|
+
[ 2012,10, 1, 9, 0, 2012,10, 1, 8,50, 10],
|
156
|
+
[ 2012,10, 1,23,59, 2012,10, 1, 0, 0, 1439],
|
157
|
+
[ 2012,10, 2, 0, 0, 2012,10, 1, 0, 0, 1440],
|
158
|
+
[ 2012,10, 2, 0, 1, 2012,10, 1, 0, 0, 1441],
|
159
|
+
[ 2013, 3,22, 6,11, 2012,10, 1, 0, 0,248051],
|
160
|
+
[ 2012,10, 2, 6,11, 2012,10, 4, 8, 9, 2998]
|
161
|
+
].each {|start_year, start_month, start_day, start_hour,start_min,
|
162
|
+
finish_year, finish_month, finish_day, finish_hour,finish_min,result|
|
163
|
+
start=DateTime.new(start_year, start_month, start_day, start_hour,start_min)
|
164
|
+
finish=DateTime.new(finish_year, finish_month, finish_day, finish_hour,finish_min)
|
165
|
+
duration, result_date=wp.diff(start,finish)
|
166
|
+
assert_equal result, duration,"duration diff(#{start}, #{finish})"
|
167
|
+
}
|
168
|
+
end
|
169
|
+
|
170
|
+
must "calculate difference between minutes in resting workpattern" do
|
171
|
+
assert true
|
172
|
+
end
|
173
|
+
|
174
|
+
must "calculate difference between minutes in pattern workpattern" do
|
175
|
+
assert true
|
176
|
+
end
|
177
|
+
|
178
|
+
must "follow the example in workpattern" do
|
179
|
+
mywp=Workpattern.new('My Workpattern',2011,10)
|
180
|
+
mywp.resting(:days => :weekend)
|
181
|
+
mywp.resting(:days =>:weekday, :from_time=>Workpattern.clock(0,0),:to_time=>Workpattern.clock(8,59))
|
182
|
+
mywp.resting(:days =>:weekday, :from_time=>Workpattern.clock(12,0),:to_time=>Workpattern.clock(12,59))
|
183
|
+
mywp.resting(:days =>:weekday, :from_time=>Workpattern.clock(18,0),:to_time=>Workpattern.clock(23,59))
|
184
|
+
mydate=DateTime.civil(2011,9,1,9,0)
|
185
|
+
result_date = mywp.calc(mydate,1920) # => 6/9/11@18:00
|
186
|
+
assert_equal DateTime.civil(2011,9,6,18,0), result_date, 'example in workpattern'
|
187
|
+
end
|
188
|
+
|
189
|
+
must "calculate across week patterns" do
|
190
|
+
name='mypattern'
|
191
|
+
base=2011
|
192
|
+
span=11
|
193
|
+
wp=Workpattern.new(name,base,span)
|
194
|
+
start=DateTime.new(2012,9,24,0,0)
|
195
|
+
finish=DateTime.new(2012,10,14,0,0)
|
196
|
+
wp.resting(:days =>:all,:start=> start, :finish=>finish)
|
197
|
+
wp.working(:days =>:mon,:start=> start, :finish=>finish, :from_time=>Workpattern.clock(1,0),:to_time=>Workpattern.clock(1,59))
|
198
|
+
wp.working(:days =>:tue,:start=> start, :finish=>finish, :from_time=>Workpattern.clock(2,0),:to_time=>Workpattern.clock(2,59))
|
199
|
+
wp.working(:days =>:wed,:start=> start, :finish=>finish, :from_time=>Workpattern.clock(3,0),:to_time=>Workpattern.clock(3,59))
|
200
|
+
wp.working(:days =>:thu,:start=> start, :finish=>finish, :from_time=>Workpattern.clock(4,0),:to_time=>Workpattern.clock(4,59))
|
201
|
+
wp.working(:days =>:fri,:start=> start, :finish=>finish, :from_time=>Workpattern.clock(5,0),:to_time=>Workpattern.clock(5,59))
|
202
|
+
wp.working(:days =>:sat,:start=> start, :finish=>finish, :from_time=>Workpattern.clock(6,0),:to_time=>Workpattern.clock(6,59))
|
203
|
+
wp.working(:days =>:sun,:start=> start, :finish=>finish, :from_time=>Workpattern.clock(0,0),:to_time=>Workpattern.clock(23,59))
|
204
|
+
|
205
|
+
# Mon Tue Wed Thu Fri Sat Sun
|
206
|
+
# 24 25 26 27 28 29 30
|
207
|
+
# 1 2 3 4 5 6 7
|
208
|
+
# 8 9 10 11 12 13 14
|
209
|
+
# Mon 01:00 - 01:59
|
210
|
+
# Tue 02:00 - 02:59
|
211
|
+
# Wed 03:00 - 03:59
|
212
|
+
# Thu 04:00 - 04:59
|
213
|
+
# Fri 05:00 - 05:59
|
214
|
+
# Sat 06:00 - 06:59
|
215
|
+
# Sun 00:00 - 23:59
|
216
|
+
#
|
217
|
+
tests=[[2012,10,1,1,0,1,2012,10,1,1,1],
|
218
|
+
[2012,10,14,23,59,1,2012,10,15,0,0],
|
219
|
+
[2012,10,1,1,0,60*60+1,2012,10,15,0,1],
|
220
|
+
[2012,10,1,2,0,-1,2012,10,1,1,59],
|
221
|
+
[2012,10,2,3,0,-61,2012,10,1,1,59],
|
222
|
+
[2012,9,24,1,1,-2,2012,9,23,23,59],
|
223
|
+
[2012,10,1,1,59,61,2012,10,2,3,0],
|
224
|
+
[2012,10,1,1,1,-1,2012,10,1,1,0],
|
225
|
+
[2012,10,1,1,0,-1,2012,9,30,23,59]
|
226
|
+
]
|
227
|
+
clue="calculate across week patterns"
|
228
|
+
calc_test(wp,tests,clue)
|
229
|
+
end
|
230
|
+
|
231
|
+
must "know whether a time is working or resting" do
|
232
|
+
name='working?'
|
233
|
+
base=2011
|
234
|
+
span=11
|
235
|
+
wp=Workpattern.new(name,base,span)
|
236
|
+
wp.resting(:to_time=>Workpattern.clock(8,59))
|
237
|
+
assert wp.working?(DateTime.new(2012,1,1,9,0))
|
238
|
+
assert !wp.working?(DateTime.new(2012,1,1,8,59))
|
239
|
+
end
|
240
|
+
|
241
|
+
|
242
|
+
private
|
243
|
+
|
244
|
+
def get_week(ss)
|
245
|
+
ss.each {|obj| return obj}
|
246
|
+
end
|
247
|
+
|
248
|
+
|
249
|
+
def calc_test(wp,tests,clue)
|
250
|
+
|
251
|
+
tests.each{|y,m,d,h,n,add,yr,mr,dr,hr,nr|
|
252
|
+
start_date=DateTime.new(y,m,d,h,n)
|
253
|
+
result_date = wp.calc(start_date,add)
|
254
|
+
assert_equal DateTime.new(yr,mr,dr,hr,nr), result_date, "result date calc(#{start_date},#{add}) for #{clue}"
|
255
|
+
}
|
256
|
+
end
|
257
|
+
def clock(hour,min)
|
258
|
+
return Workpattern.clock(hour,min)
|
259
|
+
end
|
260
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestWorkpatternModule < Test::Unit::TestCase #:nodoc:
|
4
|
+
|
5
|
+
def setup
|
6
|
+
Workpattern.clear()
|
7
|
+
end
|
8
|
+
|
9
|
+
must "create workpattern with given name" do
|
10
|
+
|
11
|
+
wp = Workpattern.new()
|
12
|
+
assert_equal Workpattern::DEFAULT_WORKPATTERN_NAME, wp.name, 'not returned the default workpattern name'
|
13
|
+
assert_equal Workpattern::DEFAULT_BASE_YEAR, wp.from.year, 'not returned the default workpattern base year'
|
14
|
+
assert_equal Workpattern::DEFAULT_SPAN, wp.span, 'not returned the default workpattern span'
|
15
|
+
|
16
|
+
mywp_name='barrie callender'
|
17
|
+
mywp_base=1963
|
18
|
+
mywp_span=48
|
19
|
+
mywp = Workpattern.new(mywp_name, mywp_base,mywp_span)
|
20
|
+
assert_equal mywp_name, mywp.name, 'not returned the supplied workpattern name'
|
21
|
+
assert_equal mywp_base, mywp.from.year, 'not returned the supplied workpattern base year'
|
22
|
+
assert_equal mywp_span, mywp.span, 'not returned the supplied workpattern span'
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
must "raise error when creating workpattern with existing name" do
|
27
|
+
|
28
|
+
assert_raise NameError do
|
29
|
+
mywp_name='duplicate'
|
30
|
+
wp=Workpattern.new(mywp_name)
|
31
|
+
wp=Workpattern.new(mywp_name)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
must "return an array of all known workpattern objects" do
|
37
|
+
|
38
|
+
names =%w{fred harry sally}
|
39
|
+
names.each {|name| wp=Workpattern.new(name)}
|
40
|
+
wp_names = Workpattern.to_a
|
41
|
+
|
42
|
+
assert_equal names.size, wp_names.size, "lists are not the same size"
|
43
|
+
|
44
|
+
wp_names.each {|name, wp| assert names.include?(name)}
|
45
|
+
end
|
46
|
+
|
47
|
+
must "return empty array when no workpatterns exist" do
|
48
|
+
|
49
|
+
assert Workpattern.to_a.empty?
|
50
|
+
end
|
51
|
+
|
52
|
+
must "return existing workpattern" do
|
53
|
+
|
54
|
+
names =%w{fred harry sally}
|
55
|
+
names.each {|name| wp=Workpattern.new(name)}
|
56
|
+
|
57
|
+
names.each {|name|
|
58
|
+
wp=Workpattern.get(name)
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
must "raise error when workpattern does not exist" do
|
63
|
+
|
64
|
+
names =%w{fred harry sally}
|
65
|
+
names.each {|name| wp=Workpattern.new(name)}
|
66
|
+
assert_raise NameError do
|
67
|
+
wp=Workpattern.get('missing')
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
must "delete existing workpattern returning true" do
|
72
|
+
|
73
|
+
names =%w{fred harry sally}
|
74
|
+
names.each {|name| wp=Workpattern.new(name)}
|
75
|
+
names.each {|name| assert Workpattern.delete(name)}
|
76
|
+
end
|
77
|
+
|
78
|
+
must "return false deleting workpattern that does not exist" do
|
79
|
+
names =%w{fred harry sally}
|
80
|
+
names.each {|name| wp=Workpattern.new(name)}
|
81
|
+
assert !Workpattern.delete('missing')
|
82
|
+
end
|
83
|
+
|
84
|
+
must "delete all workpatterns" do
|
85
|
+
|
86
|
+
names =%w{fred harry sally}
|
87
|
+
names.each {|name| wp=Workpattern.new(name)}
|
88
|
+
Workpattern.clear
|
89
|
+
assert Workpattern.to_a.empty?
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
end
|
data/workpattern.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "workpattern/version"
|
4
|
+
|
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 = ""
|
11
|
+
s.summary = %q{temporal calculations}
|
12
|
+
s.description = %q{Workpattern performs date calculations that take into account working and resting periods.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "workpattern"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
# s.add_runtime_dependency "rest-client"
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: workpattern
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Barrie Callender
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-31 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description: Workpattern performs date calculations that take into account working
|
15
|
+
and resting periods.
|
16
|
+
email:
|
17
|
+
- barrie@callenb.org
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- .gitignore
|
23
|
+
- CHANGELOG
|
24
|
+
- Gemfile
|
25
|
+
- README.md
|
26
|
+
- Rakefile
|
27
|
+
- config/website.yml
|
28
|
+
- lib/workpattern.rb
|
29
|
+
- lib/workpattern/clock.rb
|
30
|
+
- lib/workpattern/day.rb
|
31
|
+
- lib/workpattern/hour.rb
|
32
|
+
- lib/workpattern/utility/base.rb
|
33
|
+
- lib/workpattern/version.rb
|
34
|
+
- lib/workpattern/week.rb
|
35
|
+
- lib/workpattern/workpattern.rb
|
36
|
+
- script/console
|
37
|
+
- script/destroy
|
38
|
+
- script/generate
|
39
|
+
- script/txt2html
|
40
|
+
- test/test_clock.rb
|
41
|
+
- test/test_day.rb
|
42
|
+
- test/test_helper.rb
|
43
|
+
- test/test_hour.rb
|
44
|
+
- test/test_week.rb
|
45
|
+
- test/test_workpattern.rb
|
46
|
+
- test/test_workpattern_module.rb
|
47
|
+
- workpattern.gemspec
|
48
|
+
homepage: ''
|
49
|
+
licenses: []
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ! '>='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
requirements: []
|
67
|
+
rubyforge_project: workpattern
|
68
|
+
rubygems_version: 1.8.15
|
69
|
+
signing_key:
|
70
|
+
specification_version: 3
|
71
|
+
summary: temporal calculations
|
72
|
+
test_files: []
|