weekling 1.0.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.tar.gz.sig +2 -0
- data/.gitignore +10 -0
- data/.travis.yml +5 -0
- data/.yardopts +5 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +54 -0
- data/HISTORY.md +6 -0
- data/LICENSE.md +15 -0
- data/README.md +397 -0
- data/Rakefile +47 -0
- data/lib/aef/weekling.rb +45 -0
- data/lib/aef/weekling/core_extensions.rb +28 -0
- data/lib/aef/weekling/core_extensions/to_week_and_week_day.rb +41 -0
- data/lib/aef/weekling/core_extensions/to_year.rb +36 -0
- data/lib/aef/weekling/week.rb +373 -0
- data/lib/aef/weekling/week_day.rb +339 -0
- data/lib/aef/weekling/year.rb +251 -0
- data/lib/weekling.rb +33 -0
- data/lib/weekling/bare.rb +24 -0
- data/spec/aef/weekling/core_extensions_spec.rb +81 -0
- data/spec/aef/weekling/week_day_spec.rb +607 -0
- data/spec/aef/weekling/week_spec.rb +596 -0
- data/spec/aef/weekling/year_spec.rb +378 -0
- data/spec/spec_helper.rb +26 -0
- data/weekling.gemspec +55 -0
- metadata +196 -0
- metadata.gz.sig +0 -0
data/lib/weekling.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
=begin
|
3
|
+
Copyright Alexander E. Fischer <aef@raxys.net>, 2012
|
4
|
+
|
5
|
+
This file is part of Weekling.
|
6
|
+
|
7
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
8
|
+
purpose with or without fee is hereby granted, provided that the above
|
9
|
+
copyright notice and this permission notice appear in all copies.
|
10
|
+
|
11
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
12
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
13
|
+
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
14
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
15
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
16
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
17
|
+
PERFORMANCE OF THIS SOFTWARE.
|
18
|
+
=end
|
19
|
+
|
20
|
+
# Helper file to allow loading by gem name. Includes namespace Aef::Weekling
|
21
|
+
# into Object and extends Date, DateTime and Time to support to_year, to_week
|
22
|
+
# and to_week_day.
|
23
|
+
|
24
|
+
require 'aef/weekling'
|
25
|
+
|
26
|
+
Object.method(:include).call(Aef::Weekling)
|
27
|
+
|
28
|
+
Integer.method(:include).call(Aef::Weekling::CoreExtensions::ToYear)
|
29
|
+
|
30
|
+
[Date, Time, DateTime].each do |klass|
|
31
|
+
klass.method(:include).call(Aef::Weekling::CoreExtensions::ToYear)
|
32
|
+
klass.method(:include).call(Aef::Weekling::CoreExtensions::ToWeekAndWeekDay)
|
33
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
=begin
|
3
|
+
Copyright Alexander E. Fischer <aef@raxys.net>, 2012
|
4
|
+
|
5
|
+
This file is part of Weekling.
|
6
|
+
|
7
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
8
|
+
purpose with or without fee is hereby granted, provided that the above
|
9
|
+
copyright notice and this permission notice appear in all copies.
|
10
|
+
|
11
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
12
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
13
|
+
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
14
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
15
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
16
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
17
|
+
PERFORMANCE OF THIS SOFTWARE.
|
18
|
+
=end
|
19
|
+
|
20
|
+
# Require this file if you don't want the Aef::Weekling namespace to be
|
21
|
+
# included into Object and don't want Date, DateTime and Time to be extended
|
22
|
+
# to support to_year, to_week and to_week_day.
|
23
|
+
|
24
|
+
require 'aef/weekling'
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
=begin
|
3
|
+
Copyright Alexander E. Fischer <aef@raxys.net>, 2012
|
4
|
+
|
5
|
+
This file is part of Weekling.
|
6
|
+
|
7
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
8
|
+
purpose with or without fee is hereby granted, provided that the above
|
9
|
+
copyright notice and this permission notice appear in all copies.
|
10
|
+
|
11
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
12
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
13
|
+
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
14
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
15
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
16
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
17
|
+
PERFORMANCE OF THIS SOFTWARE.
|
18
|
+
=end
|
19
|
+
|
20
|
+
require 'spec_helper'
|
21
|
+
require 'weekling'
|
22
|
+
|
23
|
+
describe "weekling gem" do
|
24
|
+
it "should include the Aef namespace into Object" do
|
25
|
+
Object.should include Aef::Weekling
|
26
|
+
Year.should equal Aef::Weekling::Year
|
27
|
+
Week.should equal Aef::Weekling::Week
|
28
|
+
WeekDay.should equal Aef::Weekling::WeekDay
|
29
|
+
end
|
30
|
+
|
31
|
+
shared_examples_for "convertible to year" do
|
32
|
+
it "should be convertible to year" do
|
33
|
+
subject.should respond_to(:to_year)
|
34
|
+
subject.to_year.should be_a(Aef::Weekling::Year)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
shared_examples_for "convertible to week" do
|
39
|
+
it "should be convertible to week" do
|
40
|
+
subject.should respond_to(:to_week)
|
41
|
+
subject.to_week.should be_a(Aef::Weekling::Week)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
shared_examples_for "convertible to week day" do
|
46
|
+
it "should be convertible to week day" do
|
47
|
+
subject.should respond_to(:to_week_day)
|
48
|
+
subject.to_week_day.should be_a(Aef::Weekling::WeekDay)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe Integer do
|
53
|
+
subject { 123 }
|
54
|
+
|
55
|
+
it_should_behave_like "convertible to year"
|
56
|
+
end
|
57
|
+
|
58
|
+
describe Date do
|
59
|
+
subject { described_class.today }
|
60
|
+
|
61
|
+
it_should_behave_like "convertible to year"
|
62
|
+
it_should_behave_like "convertible to week"
|
63
|
+
it_should_behave_like "convertible to week day"
|
64
|
+
end
|
65
|
+
|
66
|
+
describe DateTime do
|
67
|
+
subject { described_class.now }
|
68
|
+
|
69
|
+
it_should_behave_like "convertible to year"
|
70
|
+
it_should_behave_like "convertible to week"
|
71
|
+
it_should_behave_like "convertible to week day"
|
72
|
+
end
|
73
|
+
|
74
|
+
describe Time do
|
75
|
+
subject { described_class.now }
|
76
|
+
|
77
|
+
it_should_behave_like "convertible to year"
|
78
|
+
it_should_behave_like "convertible to week"
|
79
|
+
it_should_behave_like "convertible to week day"
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,607 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
=begin
|
3
|
+
Copyright Alexander E. Fischer <aef@raxys.net>, 2012
|
4
|
+
|
5
|
+
This file is part of Weekling.
|
6
|
+
|
7
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
8
|
+
purpose with or without fee is hereby granted, provided that the above
|
9
|
+
copyright notice and this permission notice appear in all copies.
|
10
|
+
|
11
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
12
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
13
|
+
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
14
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
15
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
16
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
17
|
+
PERFORMANCE OF THIS SOFTWARE.
|
18
|
+
=end
|
19
|
+
|
20
|
+
require 'spec_helper'
|
21
|
+
require 'aef/weekling/week_day'
|
22
|
+
require 'ostruct'
|
23
|
+
|
24
|
+
describe Aef::Weekling::WeekDay do
|
25
|
+
[:today, :now].each do |method|
|
26
|
+
context ".#{method}" do
|
27
|
+
it "should generate a representation of the current day as week day" do
|
28
|
+
today = Date.today
|
29
|
+
|
30
|
+
week_day = described_class.method(method).call
|
31
|
+
|
32
|
+
week_day.week.year.should eql Aef::Weekling::Year.new(today.year)
|
33
|
+
week_day.week.index.should eql today.cweek
|
34
|
+
week_day.index.should eql ((today.wday - 1) % 7) + 1
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context ".parse" do
|
40
|
+
it "should recognize an ancient week day" do
|
41
|
+
week_day = described_class.parse('-1503-W50-6')
|
42
|
+
|
43
|
+
week_day.week.should eql Aef::Weekling::Week.new(-1503, 50)
|
44
|
+
week_day.index.should eql 6
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should recognize a normal week day" do
|
48
|
+
week_day = described_class.parse('2011-W30-1')
|
49
|
+
|
50
|
+
week_day.week.should eql Aef::Weekling::Week.new(2011, 30)
|
51
|
+
week_day.index.should eql 1
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should recognize a post apocalyptic week day" do
|
55
|
+
week_day = described_class.parse('50023-W03-7')
|
56
|
+
|
57
|
+
week_day.week.should eql Aef::Weekling::Week.new(50023, 3)
|
58
|
+
week_day.index.should eql 7
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should report being unable to parse the given String" do
|
62
|
+
lambda{
|
63
|
+
described_class.parse('no week day!')
|
64
|
+
}.should raise_error(ArgumentError, 'No week day found for parsing')
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context ".new" do
|
69
|
+
it "should complain about a param of invalid type" do
|
70
|
+
lambda {
|
71
|
+
described_class.new(123)
|
72
|
+
}.should raise_error(ArgumentError, 'A single argument must either respond to #week and #index or to #to_date')
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should complain about less than one argument" do
|
76
|
+
lambda {
|
77
|
+
described_class.new
|
78
|
+
}.should raise_error(ArgumentError, 'wrong number of arguments (0 for 1..3)')
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should complain about more than three arguments" do
|
82
|
+
lambda {
|
83
|
+
described_class.new(123, 456, 789, 123)
|
84
|
+
}.should raise_error(ArgumentError, 'wrong number of arguments (4 for 1..3)')
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should allow to create a weekday by a given year, week index and day index" do
|
88
|
+
week_day = described_class.new(2011, 1, 6)
|
89
|
+
week_day.week.should eql Aef::Weekling::Week.new(2011, 1)
|
90
|
+
week_day.index.should eql 6
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should allow to create a weekday by a given year, week index and day symbol" do
|
94
|
+
week_day = described_class.new(2011, 1, :saturday)
|
95
|
+
week_day.week.should eql Aef::Weekling::Week.new(2011, 1)
|
96
|
+
week_day.index.should eql 6
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should allow to create a weekday by a given WeekDay object" do
|
100
|
+
old_week_day = described_class.new(2011, 1, 6)
|
101
|
+
|
102
|
+
week_day = described_class.new(old_week_day)
|
103
|
+
week_day.week.should eql Aef::Weekling::Week.new(2011, 1)
|
104
|
+
week_day.index.should eql 6
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should allow to create a weekday by a given Week object and day index" do
|
108
|
+
week_day = described_class.new(Aef::Weekling::Week.new(2011, 1), 3)
|
109
|
+
week_day.week.should eql Aef::Weekling::Week.new(2011, 1)
|
110
|
+
week_day.index.should eql 3
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should allow to create a weekday by a given Week object and day symbol" do
|
114
|
+
week_day = described_class.new(Aef::Weekling::Week.new(2011, 1), :wednesday)
|
115
|
+
week_day.week.should eql Aef::Weekling::Week.new(2011, 1)
|
116
|
+
week_day.index.should eql 3
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should allow to create a weekday by a given Date object" do
|
120
|
+
date = Date.new(2011, 4, 6)
|
121
|
+
|
122
|
+
week_day = described_class.new(date)
|
123
|
+
week_day.week.should eql Aef::Weekling::Week.new(2011, 14)
|
124
|
+
week_day.index.should eql 3
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should allow to create a weekday by a given DateTime object" do
|
128
|
+
datetime = DateTime.parse('2011-04-06T16:45:30')
|
129
|
+
|
130
|
+
week_day = described_class.new(datetime)
|
131
|
+
week_day.week.should eql Aef::Weekling::Week.new(2011, 14)
|
132
|
+
week_day.index.should eql 3
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should allow to create a weekday by a given Time object" do
|
136
|
+
datetime = Time.parse('2011-04-06T16:45:30')
|
137
|
+
|
138
|
+
week_day = described_class.new(datetime)
|
139
|
+
week_day.week.should eql Aef::Weekling::Week.new(2011, 14)
|
140
|
+
week_day.index.should eql 3
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should complain about a day index below 1" do
|
144
|
+
lambda {
|
145
|
+
described_class.new(Aef::Weekling::Week.today, 0)
|
146
|
+
}.should raise_error(ArgumentError)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should complain about a day index above 7" do
|
150
|
+
lambda {
|
151
|
+
described_class.new(Aef::Weekling::Week.today, 8)
|
152
|
+
}.should raise_error(ArgumentError)
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should complain about an invalid day symbol" do
|
156
|
+
lambda {
|
157
|
+
described_class.new(Aef::Weekling::Week.today, :poopsday)
|
158
|
+
}.should raise_error(ArgumentError)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context "#== (type independent equality)" do
|
163
|
+
it "should be true if week and index match" do
|
164
|
+
week = described_class.new(2012, 1, 3)
|
165
|
+
other = described_class.new(2012, 1, 3)
|
166
|
+
|
167
|
+
week.should == other
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should be true if week and index match, independent of the other object's type" do
|
171
|
+
week = described_class.new(2012, 1, 3)
|
172
|
+
|
173
|
+
other = OpenStruct.new
|
174
|
+
other.week = Aef::Weekling::Week.new(2012, 1)
|
175
|
+
other.index = 3
|
176
|
+
|
177
|
+
week.should == other
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should be false if week matches but not index" do
|
181
|
+
week = described_class.new(2012, 1, 2)
|
182
|
+
other = described_class.new(2012, 1, 4)
|
183
|
+
|
184
|
+
week.should_not == other
|
185
|
+
end
|
186
|
+
|
187
|
+
it "should be false if week matches but not index, independent of the other object's type" do
|
188
|
+
week = described_class.new(2012, 1, 2)
|
189
|
+
|
190
|
+
other = OpenStruct.new
|
191
|
+
other.week = Aef::Weekling::Week.new(2012, 1)
|
192
|
+
other.index = 4
|
193
|
+
|
194
|
+
week.should_not == other
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should be false if index matches but not week" do
|
198
|
+
week = described_class.new(2011, 15, 1)
|
199
|
+
other = described_class.new(2011, 17, 1)
|
200
|
+
|
201
|
+
week.should_not == other
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should be false if index matches but not week, independent of the other object's type" do
|
205
|
+
week = described_class.new(2011, 15, 1)
|
206
|
+
|
207
|
+
other = OpenStruct.new
|
208
|
+
other.week = Aef::Weekling::Week.new(2011, 17)
|
209
|
+
other.index = 1
|
210
|
+
|
211
|
+
week.should_not == other
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should be false if both index and week do not match" do
|
215
|
+
week = described_class.new(2012, 23, 1)
|
216
|
+
other = described_class.new(2005, 14, 5)
|
217
|
+
|
218
|
+
week.should_not == other
|
219
|
+
end
|
220
|
+
|
221
|
+
it "should be false if both index and year do not match, independent of the other object's type" do
|
222
|
+
week = described_class.new(2012, 23, 1)
|
223
|
+
|
224
|
+
other = OpenStruct.new
|
225
|
+
other.week = Aef::Weekling::Week.new(2005, 14)
|
226
|
+
other.index = 5
|
227
|
+
|
228
|
+
week.should_not == other
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
context "#eql? (type dependent equality)" do
|
233
|
+
it "should be true if week and index match" do
|
234
|
+
week = described_class.new(2012, 1, 3)
|
235
|
+
other = described_class.new(2012, 1, 3)
|
236
|
+
|
237
|
+
week.should eql other
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should be false if week matches but not index" do
|
241
|
+
week = described_class.new(2012, 1, 2)
|
242
|
+
other = described_class.new(2012, 1, 4)
|
243
|
+
|
244
|
+
week.should_not eql other
|
245
|
+
end
|
246
|
+
|
247
|
+
it "should be false if index matches but not week" do
|
248
|
+
week = described_class.new(2011, 15, 1)
|
249
|
+
other = described_class.new(2011, 17, 1)
|
250
|
+
|
251
|
+
week.should_not eql other
|
252
|
+
end
|
253
|
+
|
254
|
+
it "should be false if both index and week do not match" do
|
255
|
+
week = described_class.new(2012, 23, 1)
|
256
|
+
other = described_class.new(2005, 14, 4)
|
257
|
+
|
258
|
+
week.should_not eql other
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
context "#hash" do
|
263
|
+
it "should return Integers" do
|
264
|
+
a_week_day = described_class.new(2012, 5, 4)
|
265
|
+
another_week_day = described_class.new(2012, 5, 5)
|
266
|
+
|
267
|
+
a_week_day.hash.should be_a(Integer)
|
268
|
+
another_week_day.hash.should be_a(Integer)
|
269
|
+
end
|
270
|
+
|
271
|
+
it "should discriminate a week-day from another one" do
|
272
|
+
a_week_day = described_class.new(2012, 5, 4)
|
273
|
+
another_week_day = described_class.new(2012, 5, 5)
|
274
|
+
|
275
|
+
a_week_day.hash.should_not == another_week_day.hash
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
context "#<=>" do
|
280
|
+
it "should correctly determine the order of week days based on week" do
|
281
|
+
lower_week_day = described_class.new(2011, 13, 3)
|
282
|
+
higher_week_day = described_class.new(2012, 50, 3)
|
283
|
+
|
284
|
+
lower_week_day.should < higher_week_day
|
285
|
+
end
|
286
|
+
|
287
|
+
it "should correctly determine the order of week days based on year, independent of type" do
|
288
|
+
lower_week_day = described_class.new(2011, 13, 3)
|
289
|
+
|
290
|
+
higher_week_day = OpenStruct.new
|
291
|
+
higher_week_day.week = Aef::Weekling::Week.new(2012, 50)
|
292
|
+
higher_week_day.index = 3
|
293
|
+
|
294
|
+
lower_week_day.should < higher_week_day
|
295
|
+
end
|
296
|
+
|
297
|
+
it "should correctly determine the order of week days based on index" do
|
298
|
+
lower_week_day = described_class.new(2011, 15, 2)
|
299
|
+
higher_week_day = described_class.new(2011, 15, 3)
|
300
|
+
|
301
|
+
lower_week_day.should < higher_week_day
|
302
|
+
end
|
303
|
+
|
304
|
+
it "should correctly determine the order of week days based on index, independent of type" do
|
305
|
+
lower_week_day = described_class.new(2011, 15, 2)
|
306
|
+
|
307
|
+
higher_week_day = OpenStruct.new
|
308
|
+
higher_week_day.week = Aef::Weekling::Week.new(2011, 15)
|
309
|
+
higher_week_day.index = 3
|
310
|
+
|
311
|
+
lower_week_day.should < higher_week_day
|
312
|
+
end
|
313
|
+
|
314
|
+
it "should prioritize the order weeks when determining the order of week days" do
|
315
|
+
lower_week_day = described_class.new(2012, 13, 4)
|
316
|
+
higher_week_day = described_class.new(2012, 14, 3)
|
317
|
+
|
318
|
+
lower_week_day.should < higher_week_day
|
319
|
+
end
|
320
|
+
|
321
|
+
it "should prioritize the order weeks when determining the order of week days, independent of type" do
|
322
|
+
lower_week_day = described_class.new(2012, 13, 4)
|
323
|
+
|
324
|
+
higher_week_day = OpenStruct.new
|
325
|
+
higher_week_day.week = Aef::Weekling::Week.new(2012, 14)
|
326
|
+
higher_week_day.index = 3
|
327
|
+
|
328
|
+
lower_week_day.should < higher_week_day
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
context "#to_s" do
|
333
|
+
it "should be able to display an ancient week day" do
|
334
|
+
week_day = described_class.new(-1503, 50, 3)
|
335
|
+
|
336
|
+
week_day.to_s.should eql '-1503-W50-3'
|
337
|
+
end
|
338
|
+
|
339
|
+
it "should be able to display a normal week" do
|
340
|
+
week_day = described_class.new(2011, 30, 7)
|
341
|
+
|
342
|
+
week_day.to_s.should eql '2011-W30-7'
|
343
|
+
end
|
344
|
+
|
345
|
+
it "should be able to display a post apocalyptic week" do
|
346
|
+
week_day = described_class.new(50023, 3, 1)
|
347
|
+
|
348
|
+
week_day.to_s.should eql '50023-W03-1'
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
context "#inspect" do
|
353
|
+
it "should be able to display an ancient week day" do
|
354
|
+
week_day = described_class.new(-1503, 50, 3)
|
355
|
+
|
356
|
+
week_day.inspect.should eql '#<Aef::Weekling::WeekDay: -1503-W50-3>'
|
357
|
+
end
|
358
|
+
|
359
|
+
it "should be able to display a normal week" do
|
360
|
+
week_day = described_class.new(2011, 30, 7)
|
361
|
+
|
362
|
+
week_day.inspect.should eql '#<Aef::Weekling::WeekDay: 2011-W30-7>'
|
363
|
+
end
|
364
|
+
|
365
|
+
it "should be able to display a post apocalyptic week" do
|
366
|
+
week_day = described_class.new(50023, 3, 1)
|
367
|
+
|
368
|
+
week_day.inspect.should eql '#<Aef::Weekling::WeekDay: 50023-W03-1>'
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
context "#to_date" do
|
373
|
+
it "should translate to the Date of the day" do
|
374
|
+
week_day = described_class.new(2011, 30, 3)
|
375
|
+
|
376
|
+
week_day.to_date.should eql Date.new(2011, 7, 27)
|
377
|
+
end
|
378
|
+
|
379
|
+
it "should translate to the Date of the day in edge cases early in the year" do
|
380
|
+
week_day = described_class.new(2010, 52, 6)
|
381
|
+
|
382
|
+
week_day.to_date.should eql Date.new(2011, 1, 1)
|
383
|
+
end
|
384
|
+
|
385
|
+
it "should translate to the Date of the day in edge cases late in the year" do
|
386
|
+
week_day = described_class.new(2011, 52, 7)
|
387
|
+
|
388
|
+
week_day.to_date.should eql Date.new(2012, 1, 1)
|
389
|
+
end
|
390
|
+
end
|
391
|
+
|
392
|
+
context "#to_week_date" do
|
393
|
+
it "should return itself" do
|
394
|
+
week_day = described_class.new(2011, 30, 6)
|
395
|
+
week_day.to_week_day.should equal(week_day)
|
396
|
+
end
|
397
|
+
end
|
398
|
+
|
399
|
+
[:next, :succ].each do |method|
|
400
|
+
context "##{method}" do
|
401
|
+
it "should return the next week day" do
|
402
|
+
described_class.new(2011, 19, 3).method(method).call.should eql described_class.new(2011, 19, 4)
|
403
|
+
end
|
404
|
+
|
405
|
+
it "should return the next week day at the end of a week" do
|
406
|
+
described_class.new(2011, 30, 7).method(method).call.should eql described_class.new(2011, 31, 1)
|
407
|
+
end
|
408
|
+
|
409
|
+
it "should return the next week day at the end of a year with 52 weeks" do
|
410
|
+
described_class.new(2000, 52, 7).method(method).call.should eql described_class.new(2001, 1, 1)
|
411
|
+
end
|
412
|
+
|
413
|
+
it "should return the next week day at the end of a year with 53 weeks" do
|
414
|
+
described_class.new(1998, 53, 7).method(method).call.should eql described_class.new(1999, 1, 1)
|
415
|
+
end
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
[:previous, :pred].each do |method|
|
420
|
+
context "##{method}" do
|
421
|
+
it "should return the previous week day" do
|
422
|
+
described_class.new(2011, 20, 3).method(method).call.should eql described_class.new(2011, 20, 2)
|
423
|
+
end
|
424
|
+
|
425
|
+
it "should return the previous week day at the beginning of a week" do
|
426
|
+
described_class.new(2011, 9, 1).method(method).call.should eql described_class.new(2011, 8, 7)
|
427
|
+
end
|
428
|
+
|
429
|
+
it "should return the previous week day at the beginning of a year following a year with 52 weeks" do
|
430
|
+
described_class.new(2001, 1, 1).method(method).call.should eql described_class.new(2000, 52, 7)
|
431
|
+
end
|
432
|
+
|
433
|
+
it "should return the previous week day at the beginning of a year following a year with 53 weeks" do
|
434
|
+
described_class.new(1999, 1, 1).method(method).call.should eql described_class.new(1998, 53, 7)
|
435
|
+
end
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
439
|
+
context "#+" do
|
440
|
+
it "should be able to add a positive amount of days" do
|
441
|
+
(described_class.new(1996, 51, 4) + 2).should eql described_class.new(1996, 51, 6)
|
442
|
+
end
|
443
|
+
|
444
|
+
it "should be able to add a positive amount of days so that the result isn't in the week anymore'" do
|
445
|
+
(described_class.new(1996, 51, 4) + 4).should eql described_class.new(1996, 52, 1)
|
446
|
+
end
|
447
|
+
|
448
|
+
it "should be able to add a positive amount of days so that the result isn't in the year anymore'" do
|
449
|
+
(described_class.new(1996, 51, 4) + 12).should eql described_class.new(1997, 1, 2)
|
450
|
+
end
|
451
|
+
|
452
|
+
it "should be able to add a positive amount of days so that the result isn't in the year with 53 weeks anymore'" do
|
453
|
+
(described_class.new(1998, 51, 4) + 20).should eql described_class.new(1999, 1, 3)
|
454
|
+
end
|
455
|
+
|
456
|
+
it "should be able to add a negative amount of days" do
|
457
|
+
(described_class.new(1996, 2, 4) + -2).should eql described_class.new(1996, 2, 2)
|
458
|
+
end
|
459
|
+
|
460
|
+
it "should be able to add a negative amount of days so that the result isn't in the week anymore'" do
|
461
|
+
(described_class.new(1996, 2, 4) + -5).should eql described_class.new(1996, 1, 6)
|
462
|
+
end
|
463
|
+
|
464
|
+
it "should be able to add a negative amount of days so that the result isn't in the year anymore'" do
|
465
|
+
(described_class.new(1996, 2, 4) + -15).should eql described_class.new(1995, 52, 3)
|
466
|
+
end
|
467
|
+
|
468
|
+
it "should be able to add a negative amount of days so that the result is in the previous year with 53 weeks'" do
|
469
|
+
(described_class.new(1999, 2, 1) + -10).should eql described_class.new(1998, 53, 5)
|
470
|
+
end
|
471
|
+
|
472
|
+
it "should be able to add zero days" do
|
473
|
+
(described_class.new(1996, 51, 4) + 0).should eql described_class.new(1996, 51, 4)
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
context "#-" do
|
478
|
+
it "should be able to subtract a positive amount of days" do
|
479
|
+
(described_class.new(1996, 2, 4) - 2).should eql described_class.new(1996, 2, 2)
|
480
|
+
end
|
481
|
+
|
482
|
+
it "should be able to subtract a positive amount of days so that the result isn't in the week anymore'" do
|
483
|
+
(described_class.new(1996, 2, 4) - 5).should eql described_class.new(1996, 1, 6)
|
484
|
+
end
|
485
|
+
|
486
|
+
it "should be able to subtract a positive amount of days so that the result isn't in the year anymore'" do
|
487
|
+
(described_class.new(1996, 2, 4) - 15).should eql described_class.new(1995, 52, 3)
|
488
|
+
end
|
489
|
+
|
490
|
+
it "should be able to subtract a positive amount of days so that the result is in the previous year with 53 weeks'" do
|
491
|
+
(described_class.new(1999, 2, 1) - 10).should eql described_class.new(1998, 53, 5)
|
492
|
+
end
|
493
|
+
|
494
|
+
it "should be able to subtract a negative amount of days" do
|
495
|
+
(described_class.new(1996, 51, 4) - -2).should eql described_class.new(1996, 51, 6)
|
496
|
+
end
|
497
|
+
|
498
|
+
it "should be able to subtract a negative amount of days so that the result isn't in the week anymore'" do
|
499
|
+
(described_class.new(1996, 51, 4) - -4).should eql described_class.new(1996, 52, 1)
|
500
|
+
end
|
501
|
+
|
502
|
+
it "should be able to subtract a negative amount of days so that the result isn't in the year anymore'" do
|
503
|
+
(described_class.new(1996, 51, 4) - -12).should eql described_class.new(1997, 1, 2)
|
504
|
+
end
|
505
|
+
|
506
|
+
it "should be able to subtract a negative amount of days so that the result isn't in the year with 53 weeks anymore'" do
|
507
|
+
(described_class.new(1998, 51, 4) - -20).should eql described_class.new(1999, 1, 3)
|
508
|
+
end
|
509
|
+
|
510
|
+
it "should be able to subtract zero days" do
|
511
|
+
(described_class.new(1996, 51, 4) - 0).should eql described_class.new(1996, 51, 4)
|
512
|
+
end
|
513
|
+
end
|
514
|
+
|
515
|
+
context "weekday methods" do
|
516
|
+
it "should report monday" do
|
517
|
+
week_day = described_class.new(2011, 17, 1)
|
518
|
+
week_day.monday?.should be_true
|
519
|
+
week_day.tuesday?.should be_false
|
520
|
+
week_day.wednesday?.should be_false
|
521
|
+
week_day.thursday?.should be_false
|
522
|
+
week_day.friday?.should be_false
|
523
|
+
week_day.saturday?.should be_false
|
524
|
+
week_day.sunday?.should be_false
|
525
|
+
week_day.weekend?.should be_false
|
526
|
+
week_day.to_sym.should eql :monday
|
527
|
+
end
|
528
|
+
|
529
|
+
it "should report tuesday" do
|
530
|
+
week_day = described_class.new(2011, 17, 2)
|
531
|
+
week_day.monday?.should be_false
|
532
|
+
week_day.tuesday?.should be_true
|
533
|
+
week_day.wednesday?.should be_false
|
534
|
+
week_day.thursday?.should be_false
|
535
|
+
week_day.friday?.should be_false
|
536
|
+
week_day.saturday?.should be_false
|
537
|
+
week_day.sunday?.should be_false
|
538
|
+
week_day.weekend?.should be_false
|
539
|
+
week_day.to_sym.should eql :tuesday
|
540
|
+
end
|
541
|
+
|
542
|
+
it "should report wednesday" do
|
543
|
+
week_day = described_class.new(2011, 17, 3)
|
544
|
+
week_day.monday?.should be_false
|
545
|
+
week_day.tuesday?.should be_false
|
546
|
+
week_day.wednesday?.should be_true
|
547
|
+
week_day.thursday?.should be_false
|
548
|
+
week_day.friday?.should be_false
|
549
|
+
week_day.saturday?.should be_false
|
550
|
+
week_day.sunday?.should be_false
|
551
|
+
week_day.weekend?.should be_false
|
552
|
+
week_day.to_sym.should eql :wednesday
|
553
|
+
end
|
554
|
+
|
555
|
+
it "should report thursday" do
|
556
|
+
week_day = described_class.new(2011, 17, 4)
|
557
|
+
week_day.monday?.should be_false
|
558
|
+
week_day.tuesday?.should be_false
|
559
|
+
week_day.wednesday?.should be_false
|
560
|
+
week_day.thursday?.should be_true
|
561
|
+
week_day.friday?.should be_false
|
562
|
+
week_day.saturday?.should be_false
|
563
|
+
week_day.sunday?.should be_false
|
564
|
+
week_day.weekend?.should be_false
|
565
|
+
week_day.to_sym.should eql :thursday
|
566
|
+
end
|
567
|
+
|
568
|
+
it "should report friday" do
|
569
|
+
week_day = described_class.new(2011, 17, 5)
|
570
|
+
week_day.monday?.should be_false
|
571
|
+
week_day.tuesday?.should be_false
|
572
|
+
week_day.wednesday?.should be_false
|
573
|
+
week_day.thursday?.should be_false
|
574
|
+
week_day.friday?.should be_true
|
575
|
+
week_day.saturday?.should be_false
|
576
|
+
week_day.sunday?.should be_false
|
577
|
+
week_day.weekend?.should be_false
|
578
|
+
week_day.to_sym.should eql :friday
|
579
|
+
end
|
580
|
+
|
581
|
+
it "should report saturday" do
|
582
|
+
week_day = described_class.new(2011, 17, 6)
|
583
|
+
week_day.monday?.should be_false
|
584
|
+
week_day.tuesday?.should be_false
|
585
|
+
week_day.wednesday?.should be_false
|
586
|
+
week_day.thursday?.should be_false
|
587
|
+
week_day.friday?.should be_false
|
588
|
+
week_day.saturday?.should be_true
|
589
|
+
week_day.sunday?.should be_false
|
590
|
+
week_day.weekend?.should be_true
|
591
|
+
week_day.to_sym.should eql :saturday
|
592
|
+
end
|
593
|
+
|
594
|
+
it "should report sunday" do
|
595
|
+
week_day = described_class.new(2011, 17, 7)
|
596
|
+
week_day.monday?.should be_false
|
597
|
+
week_day.tuesday?.should be_false
|
598
|
+
week_day.wednesday?.should be_false
|
599
|
+
week_day.thursday?.should be_false
|
600
|
+
week_day.friday?.should be_false
|
601
|
+
week_day.saturday?.should be_false
|
602
|
+
week_day.sunday?.should be_true
|
603
|
+
week_day.weekend?.should be_true
|
604
|
+
week_day.to_sym.should eql :sunday
|
605
|
+
end
|
606
|
+
end
|
607
|
+
end
|