edtf 0.0.6 → 0.0.7

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.
@@ -1,12 +1,140 @@
1
1
  module EDTF
2
2
  describe 'Interval' do
3
- describe 'when it ends in 2008' do
3
+
4
+ describe 'the interval 2008/2011' do
5
+ let(:interval) { Date.edtf('2008/2011') }
4
6
 
5
- let(:interval) { Interval.new(Date.new(2007), Date.new(2008)) }
7
+ it { interval.should_not be_open }
8
+ it { interval.should_not be_open_end }
9
+ it { interval.should_not be_unknown_start }
10
+ it { interval.should_not be_unknown_end }
11
+
12
+ it 'has a length of 4' do
13
+ interval.to_a.length.should == 4
14
+ end
15
+
16
+ it '#step(2) yields the years 2008 and 2010' do
17
+ interval.step(2).map(&:year).should == [2008,2010]
18
+ end
19
+
20
+ it 'the max date is 2011-12-31' do
21
+ interval.max.to_s.should == '2011-12-31'
22
+ end
23
+
24
+ it 'the max date has year precision' do
25
+ interval.max.should be_year_precision
26
+ end
27
+
28
+ it 'the min date is 2008-01-01' do
29
+ interval.min.to_s.should == '2008-01-01'
30
+ end
31
+
32
+ it 'the min date has year precision' do
33
+ interval.min.should be_year_precision
34
+ end
35
+
36
+
37
+ it 'includes the years 2008, 2009, 2010 and 2011' do
38
+ interval.to_a.map(&:year).should == [2008, 2009, 2010, 2011]
39
+ end
40
+
41
+ it 'does not include christmas day 2009' do
42
+ interval.should_not include(Date.new(2009,12,24))
43
+ end
44
+
45
+ it 'christmas day 2009 is less than max' do
46
+ Date.new(2009,12,24).should < interval.max
47
+ end
48
+
49
+ it 'christmas day 2009 is greater than min' do
50
+ Date.new(2009,12,24).should > interval.min
51
+ end
52
+
53
+ it 'covers christmas day 2009' do
54
+ interval.should cover(Date.new(2009,12,24))
55
+ end
56
+
57
+ it 'covers 2011-12-31' do
58
+ interval.should cover(Date.new(2011,12,31))
59
+ end
60
+
61
+ end
62
+
63
+ describe 'the interval 2008-08-23/2011-07-01' do
64
+ let(:interval) { Date.edtf('2008-08-23/2011-07-01') }
65
+
66
+ it 'includes christmas day 2009' do
67
+ interval.should include(Date.new(2009,12,24))
68
+ end
6
69
 
7
- it 'should include any day in the year 2008' do
8
- interval.should include(Date.new(2008, 12, 31))
70
+ it 'covers christmas day 2009' do
71
+ interval.should cover(Date.new(2009,12,24))
72
+ end
73
+
74
+ it 'does not cover 2011-07-02' do
75
+ interval.should_not cover(Date.new(2011,07,02))
9
76
  end
10
77
  end
78
+
79
+ describe 'the interval 2008-08-23/open' do
80
+ let(:interval) { Date.edtf('2008-08-23/open') }
81
+
82
+ it { interval.should be_open }
83
+ it { interval.should be_open_end }
84
+ it { interval.should_not be_unknown }
85
+ it { interval.should_not be_unknown_start }
86
+ it { interval.should_not be_unknown_end }
87
+
88
+ it 'the min date is 2008-08-23' do
89
+ interval.min.should == Date.new(2008,8,23)
90
+ end
91
+
92
+ it 'the max date is nil' do
93
+ interval.max.should be nil
94
+ end
95
+
96
+ it 'includes christmas day 2009' do
97
+ interval.should include(Date.new(2009,12,24))
98
+ end
99
+
100
+ it 'covers christmas day 2009' do
101
+ interval.should cover(Date.new(2009,12,24))
102
+ end
103
+
104
+ it 'covers 2023-07-02' do
105
+ interval.should cover(Date.new(2023,07,02))
106
+ end
107
+
108
+ end
109
+
110
+ describe 'comparisions' do
111
+
112
+ it '2007/2009 should be greater than 2001/2002' do
113
+ Date.edtf('2007/2009').should > Date.edtf('2001/2002')
114
+ end
115
+
116
+ it '2007/2009 should be less than 2011/2012' do
117
+ Date.edtf('2007/2009').should < Date.edtf('2011/2012')
118
+ end
119
+
120
+ it '2007/2009 should be less than 2008/2009' do
121
+ Date.edtf('2007/2009').should < Date.edtf('2008/2009')
122
+ end
123
+
124
+ it '2007/2009 should be greater than 2007/2008' do
125
+ Date.edtf('2007/2009').should > Date.edtf('2007/2008')
126
+ end
127
+
128
+ it '2007/2009 should be greater than 2006/2007' do
129
+ Date.edtf('2007/2009').should > Date.edtf('2006/2007')
130
+ end
131
+
132
+ it '2007/2009 should be equal to 2007/2009' do
133
+ Date.edtf('2007/2009').should == Date.edtf('2007/2009')
134
+ end
135
+
136
+
137
+
138
+ end
11
139
  end
12
140
  end
@@ -23,9 +23,7 @@ module EDTF
23
23
  end
24
24
 
25
25
  it 'parses simple intervals like "2007/2008"' do
26
- Parser.new.parse('2007/2008').should include(Date.new(2007,12,24))
27
- Parser.new.parse('2007/2008').should include(Date.new(2008,1,2))
28
- Parser.new.parse('2007/2008').should_not include(Date.new(2009,1,2))
26
+ Parser.new.parse('2007/2008').should be_a(Interval)
29
27
  end
30
28
 
31
29
  it 'parses uncertain dates' do
@@ -67,130 +65,139 @@ module EDTF
67
65
  Parser.new.parse('1984-06-02?/2004-08-08~').to.should be_approximate
68
66
  end
69
67
 
70
- it 'should parse positive long years' do
68
+ it 'parses positive long years' do
71
69
  Parser.new.parse('y170000002').year.should == 170000002
72
70
  end
73
71
 
74
- it 'should parse negative long years' do
72
+ it 'parses negative long years' do
75
73
  Parser.new.parse('y-170000002').year.should == -170000002
76
74
  end
77
75
 
78
- it 'should parse season codes' do
76
+ it 'parses season codes' do
79
77
  Parser.new.parse('2003-23').should be_autumn
80
78
  end
81
79
 
82
- it 'should parse calendar names' do
80
+ it 'parses calendar names' do
83
81
  Parser.new.parse('2001-02-03^xyz').calendar.should == 'xyz'
84
82
  end
85
83
 
86
- it 'should parse season qualifiers' do
84
+ it 'parses season qualifiers' do
87
85
  d = Parser.new.parse('2003-23^european')
88
86
  d.should be_autumn
89
87
  d.should be_qualified
90
88
  d.qualifier.should == 'european'
91
89
  end
92
90
 
93
- it 'should parse positive scientific long years' do
91
+ it 'parses positive scientific long years' do
94
92
  Parser.new.parse('y17e7').year.should == 170000000
95
93
  end
96
94
 
97
- it 'should parse negative scientific long years' do
95
+ it 'parses negative scientific long years' do
98
96
  Parser.new.parse('y-17e7').year.should == -170000000
99
97
  end
100
98
 
101
99
  it 'parses masked precision date strings (decades)' do
102
- d = Parser.new.parse('198x')
100
+ d = Parser.new.parse!('198x')
103
101
  d.should include(Date.new(1983,3,12))
104
102
  d.should_not include(Date.new(1990,1,1))
105
103
  end
106
104
 
107
105
  it 'parses masked precision date strings (centuries)' do
108
- d = Parser.new.parse('18xx')
106
+ d = Parser.new.parse!('18xx')
109
107
  d.should include(Date.new(1848,1,14))
110
108
  d.should_not include(Date.new(1799,12,31))
111
109
  end
112
110
 
113
111
  it 'parses multiple dates (years)' do
114
- d = Parser.new.parse('{1667,1668, 1670..1672}')
112
+ d = Parser.new.parse!('{1667,1668, 1670..1672}')
115
113
  d.map(&:year).should == [1667,1668,1670,1671,1672]
116
114
  end
117
115
 
118
116
  it 'parses multiple dates (mixed years and months)' do
119
- d = Parser.new.parse('{1960, 1961-12}')
117
+ d = Parser.new.parse!('{1960, 1961-12}')
120
118
  d.map { |x| [x.year,x.month] }.should == [[1960,1],[1961,12]]
121
119
  end
122
120
 
123
121
  it 'parses choice lists (One of the years 1667, 1668, 1670, 1671, 1672)' do
124
- d = Parser.new.parse('[1667,1668, 1670..1672]')
122
+ d = Parser.new.parse!('[1667,1668, 1670..1672]')
125
123
  d.map(&:year).should == [1667,1668,1670,1671,1672]
126
124
  end
127
125
 
128
126
  it 'parses choice lists (December 3, 1760 or some earlier date)' do
129
- d = Parser.new.parse('[..1760-12-03]')
127
+ d = Parser.new.parse!('[..1760-12-03]')
130
128
  d.map(&:to_s).should == ['1760-12-03']
131
129
  end
132
130
 
133
131
  it 'parses choice lists (December 1760 or some later month)' do
134
- d = Parser.new.parse('[1760-12..]')
132
+ d = Parser.new.parse!('[1760-12..]')
135
133
  d.map { |x| [x.year,x.month] }.should == [[1760,12]]
136
134
  end
137
135
 
138
136
  it 'parses choice lists (January or February of 1760 or December 1760 or some later month)' do
139
- d = Parser.new.parse('[1760-01, 1760-02, 1760-12..]')
137
+ d = Parser.new.parse!('[1760-01, 1760-02, 1760-12..]')
140
138
  d.length.should == 3
141
139
  end
142
140
 
143
141
  it 'parses intern unspecified "199u-01-01"' do
144
- Parser.new.parse('199u-01-01').unspecified.to_s.should == 'sssu-ss-ss'
142
+ Parser.new.parse!('199u-01-01').unspecified.to_s.should == 'sssu-ss-ss'
145
143
  end
146
144
 
147
145
  it 'parses intern unspecified "19uu-01-01"' do
148
- Parser.new.parse('19uu-01-01').unspecified.to_s.should == 'ssuu-ss-ss'
146
+ Parser.new.parse!('19uu-01-01').unspecified.to_s.should == 'ssuu-ss-ss'
149
147
  end
150
148
 
151
149
  it 'parses intern unspecified "199u-uu-01"' do
152
- Parser.new.parse('199u-uu-01').unspecified.to_s.should == 'sssu-uu-ss'
150
+ Parser.new.parse!('199u-uu-01').unspecified.to_s.should == 'sssu-uu-ss'
153
151
  end
154
152
 
155
153
  it 'parses intern unspecified "19uu-uu-01"' do
156
- Parser.new.parse('19uu-uu-01').unspecified.to_s.should == 'ssuu-uu-ss'
154
+ Parser.new.parse!('19uu-uu-01').unspecified.to_s.should == 'ssuu-uu-ss'
157
155
  end
158
156
 
159
157
  it 'parses intern unspecified "199u-uu-uu"' do
160
- Parser.new.parse('199u-uu-uu').unspecified.to_s.should == 'sssu-uu-uu'
158
+ Parser.new.parse!('199u-uu-uu').unspecified.to_s.should == 'sssu-uu-uu'
161
159
  end
162
160
 
163
161
  it 'parses intern unspecified "19uu-uu-uu"' do
164
- Parser.new.parse('19uu-uu-uu').unspecified.to_s.should == 'ssuu-uu-uu'
162
+ Parser.new.parse!('19uu-uu-uu').unspecified.to_s.should == 'ssuu-uu-uu'
165
163
  end
166
164
 
167
165
  it 'parses intern unspecified "199u-01-uu"' do
168
- Parser.new.parse('199u-01-uu').unspecified.to_s.should == 'sssu-ss-uu'
166
+ Parser.new.parse!('199u-01-uu').unspecified.to_s.should == 'sssu-ss-uu'
169
167
  end
170
168
 
171
169
  it 'parses intern unspecified "19uu-01-uu"' do
172
- Parser.new.parse('19uu-01-uu').unspecified.to_s.should == 'ssuu-ss-uu'
170
+ Parser.new.parse!('19uu-01-uu').unspecified.to_s.should == 'ssuu-ss-uu'
173
171
  end
174
172
 
175
173
  it 'parses intern unspecified "1999-uu-01"' do
176
- Parser.new.parse('1999-uu-01').unspecified.to_s.should == 'ssss-uu-ss'
174
+ Parser.new.parse!('1999-uu-01').unspecified.to_s.should == 'ssss-uu-ss'
177
175
  end
176
+
177
+ it 'parses intern unspecified "2004-06-uu"' do
178
+ Parser.new.parse!('2004-06-uu').unspecified.to_s.should == 'ssss-ss-uu'
179
+ end
180
+
178
181
 
182
+ it 'parses internal unspecified interval "2004-06-uu/2004-07-03"' do
183
+ Parser.new.parse!('2004-06-uu/2004-07-03').from.should == Date.new(2004,6,1)
184
+ end
185
+
179
186
  it 'parses "2004?-06-11": uncertain year; month, day known' do
180
- d = Parser.new.parse('2004?-06-11')
187
+ d = Parser.new.parse!('2004?-06-11')
181
188
  d.uncertain?(:year).should be true
182
189
  d.uncertain?([:month, :day]).should be false
183
190
  end
184
191
 
185
192
  it 'parses "2004-06~-11": year and month are approximate; day known' do
186
- d = Parser.new.parse('2004-06~-11')
193
+ d = Parser.new.parse!('2004-06~-11')
187
194
  d.approximate?(:year).should be true
188
195
  d.approximate?(:month).should be true
189
196
  d.approximate?(:day).should be false
190
197
  end
191
198
 
192
199
  it 'parses "2004-(06)?-11": uncertain month, year and day known' do
193
- d = Parser.new.parse('2004-(06)?-11')
200
+ d = Parser.new.parse!('2004-(06)?-11')
194
201
 
195
202
  d.uncertain?(:year).should be false
196
203
  d.approximate?(:year).should be false
@@ -203,15 +210,15 @@ module EDTF
203
210
  end
204
211
 
205
212
  it 'parses "2004-06-(11)~": day is approximate; year, month known' do
206
- d = Parser.new.parse('2004-06-(11)~')
213
+ d = Parser.new.parse!('2004-06-(11)~')
207
214
  d.approximate?(:year).should be false
208
215
  d.approximate?(:month).should be false
209
216
  d.approximate?(:day).should be true
210
217
  end
211
218
 
212
219
  it 'parses "2004-(06)?~": year known, month within year is approximate and uncertain' do
213
- d = Parser.new.parse('2004-(06)?~')
214
-
220
+ d = Parser.new.parse!('2004-(06)?~')
221
+
215
222
  d.approximate?(:year).should be false
216
223
  d.uncertain?(:year).should be false
217
224
 
@@ -223,7 +230,7 @@ module EDTF
223
230
  end
224
231
 
225
232
  it 'parses "2004-(06-11)?": year known, month and day uncertain' do
226
- d = Parser.new.parse('2004-(06-11)?')
233
+ d = Parser.new.parse!('2004-(06-11)?')
227
234
 
228
235
  d.approximate?(:year).should be false
229
236
  d.uncertain?(:year).should be false
@@ -249,7 +256,7 @@ module EDTF
249
256
  end
250
257
 
251
258
  it 'parses "(2004-(06)~)?": year uncertain and month is both uncertain and approximate' do
252
- d = Parser.new.parse('(2004-(06)~)?')
259
+ d = Parser.new.parse!('(2004-(06)~)?')
253
260
 
254
261
  d.approximate?(:year).should be false
255
262
  d.uncertain?(:year).should be true
@@ -261,6 +268,20 @@ module EDTF
261
268
  d.uncertain?(:day).should be false
262
269
  end
263
270
 
271
+ it 'parses "2004~-(06)?-01~": year and day approximate, month uncertain' do
272
+ d = Parser.new.parse!("2004~-(06)?-01~")
273
+ end
274
+
275
+ it 'parses "2004~-(06-(01)~)?": year and day approximate, month and day uncertain' do
276
+ d = Parser.new.parse!("2004~-(06-(01)~)?")
277
+ end
278
+
279
+ it 'parses "2004~-(06)?-01?~": year and day approximate, month and day uncertain' do
280
+ d = Parser.new.parse!("2004~-(06)?-01?~")
281
+ end
282
+
283
+
284
+
264
285
  end
265
286
  end
266
287
  end
@@ -13,14 +13,15 @@ module EDTF
13
13
  end
14
14
 
15
15
  it 'should not be uncertain if all parts are certain' do
16
- Uncertainty.new(false, false, false, false, false, false).should be_certain
16
+ Uncertainty.new(false, false, false).should be_certain
17
17
  end
18
18
 
19
19
  it 'should be uncertain if all parts are uncertain' do
20
- Uncertainty.new(true, true, true, true, true, true).should be_uncertain
20
+ Uncertainty.new(true, true, true).should be_uncertain
21
21
  end
22
22
 
23
- [:year, :month, :day, :hour, :minute, :second].each do |part|
23
+ # [:year, :month, :day, :hour, :minute, :second].each do |part|
24
+ [:year, :month, :day].each do |part|
24
25
  it "#{ part } should not be uncertain by default" do
25
26
  uncertainty.uncertain?(part).should be false
26
27
  end
@@ -30,12 +31,53 @@ module EDTF
30
31
  uncertainty.uncertain?(part).should be true
31
32
  end
32
33
 
33
- ([:year, :month, :day, :hour, :minute, :second] - [part]).each do |other|
34
+ # ([:year, :month, :day, :hour, :minute, :second] - [part]).each do |other|
35
+ ([:year, :month, :day] - [part]).each do |other|
34
36
  it "#{other} should not be uncertain if #{part} is uncertain" do
35
37
  uncertainty.send("#{part}=", true)
36
38
  uncertainty.uncertain?(other).should be false
37
39
  end
38
40
  end
41
+
42
+ end
43
+
44
+ describe '#hash' do
45
+
46
+ describe 'with the default hash base (1)' do
47
+
48
+ it 'returns 0 by default' do
49
+ Uncertainty.new.hash.should == 0
50
+ end
51
+
52
+ it 'returns 1 for uncertain year' do
53
+ Uncertainty.new.hash.should == 0
54
+ end
55
+
56
+ it 'returns 2 for uncertain month' do
57
+ Uncertainty.new.hash.should == 0
58
+ end
59
+
60
+ it 'returns 4 for uncertain day' do
61
+ Uncertainty.new.hash.should == 0
62
+ end
63
+
64
+ it 'returns 3 for uncertain year, month' do
65
+ Uncertainty.new(true, true).hash.should == 3
66
+ end
67
+
68
+ it 'returns 7 for uncertain year, month, day' do
69
+ Uncertainty.new(true, true, true).hash.should == 7
70
+ end
71
+
72
+ it 'returns 5 for uncertain year, day' do
73
+ Uncertainty.new(true, nil, true).hash.should == 5
74
+ end
75
+
76
+ it 'returns 6 for uncertain month, day' do
77
+ Uncertainty.new(nil, true, true).hash.should == 6
78
+ end
79
+
80
+ end
39
81
 
40
82
  end
41
83
 
@@ -108,6 +150,127 @@ module EDTF
108
150
  end
109
151
 
110
152
  end
153
+
154
+ describe '#mask' do
155
+
156
+ context 'when passed an empty array' do
157
+ it 'should return an empty array' do
158
+ u.mask([]).should == []
159
+ end
160
+ end
161
+
162
+ context 'when passed an array with a year string' do
163
+ let(:date) { ['1994'] }
164
+
165
+ it 'should return the array with the year by default' do
166
+ u.mask(date).should == ['1994']
167
+ end
168
+
169
+ context 'when the year is unspecified' do
170
+ before(:each) { u.year[3] = true }
171
+
172
+ it 'should return the array with the year and the fourth digit masked' do
173
+ u.mask(date).should == ['199u']
174
+ end
175
+
176
+ end
177
+
178
+ context 'when the decade is unspecified' do
179
+ before(:each) { u.year[2,2] = [true,true] }
180
+
181
+ it 'should return the array with the year and the third and fourth digit masked' do
182
+ u.mask(date).should == ['19uu']
183
+ end
184
+
185
+ end
186
+
187
+ end
188
+
189
+ context 'when passed an array with a year-month string' do
190
+ let(:date) { ['1994', '01'] }
191
+
192
+ it 'should return the array with the year by default' do
193
+ u.mask(date).should == ['1994', '01']
194
+ end
195
+
196
+ context 'when the year is unspecified' do
197
+ before(:each) { u.year[3] = true }
198
+
199
+ it 'should return the array with the year and the fourth digit masked' do
200
+ u.mask(date).should == ['199u', '01']
201
+ end
202
+
203
+ context 'when the month is unspecified' do
204
+ before(:each) { u.unspecified! :month }
205
+
206
+ it 'should return the array with the month masked' do
207
+ u.mask(date).should == ['199u', 'uu']
208
+ end
209
+ end
210
+ end
211
+
212
+ context 'when the decade is unspecified' do
213
+ before(:each) { u.year[2,2] = [true,true] }
214
+
215
+ it 'should return the array with the year and the third and fourth digit masked' do
216
+ u.mask(date).should == ['19uu', '01']
217
+ end
218
+
219
+ context 'when the month is unspecified' do
220
+ before(:each) { u.unspecified! :month }
221
+
222
+ it 'should return the array with the month masked' do
223
+ u.mask(date).should == ['19uu', 'uu']
224
+ end
225
+ end
226
+ end
227
+
228
+ context 'when the month is unspecified' do
229
+ before(:each) { u.unspecified! :month }
230
+
231
+ it 'should return the array with the month masked' do
232
+ u.mask(date).should == ['1994', 'uu']
233
+ end
234
+ end
235
+
236
+ end
237
+
238
+ context 'when passed an array with a year-month-day string' do
239
+ let(:date) { ['1994', '01', '27'] }
240
+
241
+ it 'should return the array with the date by default' do
242
+ u.mask(date).should == ['1994', '01', '27']
243
+ end
244
+
245
+ context 'when the year is unspecified' do
246
+ before(:each) { u.year[3] = true }
247
+
248
+ it 'should return the array with the year and the fourth digit masked' do
249
+ u.mask(date).should == ['199u', '01', '27']
250
+ end
251
+
252
+ context 'when the month is unspecified' do
253
+ before(:each) { u.unspecified! :month }
254
+
255
+ it 'should return the array with the month masked' do
256
+ u.mask(date).should == ['199u', 'uu', '27']
257
+ end
258
+
259
+ context 'when the day is unspecified' do
260
+ before(:each) { u.unspecified! :day }
261
+
262
+ it 'should return the array with the month masked' do
263
+ u.mask(date).should == ['199u', 'uu', 'uu']
264
+ end
265
+ end
266
+ end
267
+ end
268
+
269
+
270
+ end
271
+
272
+
273
+ end
111
274
 
112
275
  end
113
276