barometer 0.6.1 → 0.6.2
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/README.rdoc +1 -1
- data/VERSION.yml +1 -1
- data/bin/barometer +4 -12
- data/lib/barometer/data.rb +2 -5
- data/lib/barometer/data/local_datetime.rb +2 -2
- data/lib/barometer/measurements/measurement.rb +6 -6
- data/lib/barometer/measurements/result.rb +207 -0
- data/lib/barometer/measurements/{forecast_array.rb → result_array.rb} +16 -13
- data/lib/barometer/translations/weather_country_codes.yml +3 -3
- data/lib/barometer/weather_services/google.rb +3 -3
- data/lib/barometer/weather_services/weather_bug.rb +3 -3
- data/lib/barometer/weather_services/weather_dot_com.rb +65 -38
- data/lib/barometer/weather_services/wunderground.rb +3 -3
- data/lib/barometer/weather_services/yahoo.rb +3 -3
- data/lib/demometer/demometer.rb +2 -2
- data/lib/demometer/public/css/master.css +4 -75
- data/lib/demometer/public/css/print.css +1 -2
- data/lib/demometer/public/css/syntax.css +1 -2
- data/lib/demometer/views/about.erb +1 -1
- data/lib/demometer/views/contributing.erb +4 -4
- data/lib/demometer/views/index.erb +8 -9
- data/lib/demometer/views/layout.erb +1 -2
- data/spec/measurements/measurement_spec.rb +29 -53
- data/spec/measurements/{forecast_array_spec.rb → result_array_spec.rb} +8 -8
- data/spec/measurements/result_spec.rb +660 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/weather_services/google_spec.rb +4 -4
- data/spec/weather_services/services_spec.rb +1 -1
- data/spec/weather_services/weather_bug_spec.rb +3 -3
- data/spec/weather_services/weather_dot_com_spec.rb +19 -22
- data/spec/weather_services/wunderground_spec.rb +2 -2
- data/spec/weather_services/yahoo_spec.rb +2 -2
- data/spec/weather_spec.rb +14 -39
- metadata +6 -12
- data/lib/barometer/measurements/common.rb +0 -113
- data/lib/barometer/measurements/current.rb +0 -76
- data/lib/barometer/measurements/forecast.rb +0 -62
- data/lib/barometer/measurements/night.rb +0 -27
- data/spec/measurements/common_spec.rb +0 -352
- data/spec/measurements/current_spec.rb +0 -186
- data/spec/measurements/forecast_spec.rb +0 -135
- data/spec/measurements/night_measurement_spec.rb +0 -49
@@ -6,8 +6,7 @@
|
|
6
6
|
<link rel='stylesheet' href='/css/master.css' type='text/css' media="screen, projection">
|
7
7
|
<link rel='stylesheet' href='/css/syntax.css' type='text/css' media="screen, projection">
|
8
8
|
<link rel='stylesheet' href='/css/print.css' type='text/css' media="print">
|
9
|
-
|
10
|
-
<link rel='alternate' href='http://attack.github.com/feed.xml' type='application/atom+xml' title='Barometers Blog'>
|
9
|
+
<link rel='alternate' href='http://attack.github.com/feed.xml' type='application/atom+xml' title='Barometer Feed'>
|
11
10
|
|
12
11
|
</head>
|
13
12
|
<body id=''>
|
@@ -99,23 +99,23 @@ describe "Measurement" do
|
|
99
99
|
lambda { @measurement.utc_time_stamp = valid_data }.should_not raise_error(ArgumentError)
|
100
100
|
end
|
101
101
|
|
102
|
-
it "only accepts
|
102
|
+
it "only accepts Measurement::Result for current" do
|
103
103
|
invalid_data = "invalid"
|
104
|
-
invalid_data.class.should_not == Measurement::
|
104
|
+
invalid_data.class.should_not == Measurement::Result
|
105
105
|
lambda { @measurement.current = invalid_data }.should raise_error(ArgumentError)
|
106
106
|
|
107
|
-
valid_data = Measurement::
|
108
|
-
valid_data.class.should == Measurement::
|
107
|
+
valid_data = Measurement::Result.new
|
108
|
+
valid_data.class.should == Measurement::Result
|
109
109
|
lambda { @measurement.current = valid_data }.should_not raise_error(ArgumentError)
|
110
110
|
end
|
111
111
|
|
112
|
-
it "only accepts Data::
|
112
|
+
it "only accepts Data::ResultArray for forecast" do
|
113
113
|
invalid_data = 1
|
114
|
-
invalid_data.class.should_not == Measurement::
|
114
|
+
invalid_data.class.should_not == Measurement::ResultArray
|
115
115
|
lambda { @measurement.forecast = invalid_data }.should raise_error(ArgumentError)
|
116
116
|
|
117
|
-
valid_data = Measurement::
|
118
|
-
valid_data.class.should == Measurement::
|
117
|
+
valid_data = Measurement::ResultArray.new
|
118
|
+
valid_data.class.should == Measurement::ResultArray
|
119
119
|
lambda { @measurement.forecast = valid_data }.should_not raise_error(ArgumentError)
|
120
120
|
end
|
121
121
|
|
@@ -194,7 +194,7 @@ describe "Measurement" do
|
|
194
194
|
@measurement.current.should be_nil
|
195
195
|
@measurement.success.should be_false
|
196
196
|
|
197
|
-
@measurement.current = Measurement::
|
197
|
+
@measurement.current = Measurement::Result.new
|
198
198
|
@measurement.current.temperature = Data::Temperature.new
|
199
199
|
@measurement.current.temperature.c = 10
|
200
200
|
@measurement.utc_time_stamp.should_not be_nil
|
@@ -203,7 +203,7 @@ describe "Measurement" do
|
|
203
203
|
end
|
204
204
|
|
205
205
|
it "returns successful state" do
|
206
|
-
@measurement.current = Measurement::
|
206
|
+
@measurement.current = Measurement::Result.new
|
207
207
|
@measurement.current.temperature = Data::Temperature.new
|
208
208
|
@measurement.current.temperature.c = 10
|
209
209
|
@measurement.success!
|
@@ -226,7 +226,7 @@ describe "Measurement" do
|
|
226
226
|
@measurement.current.should be_nil
|
227
227
|
@measurement.current?.should be_true
|
228
228
|
|
229
|
-
@measurement.current = Measurement::
|
229
|
+
@measurement.current = Measurement::Result.new
|
230
230
|
@measurement.current.current_at.should be_nil
|
231
231
|
@measurement.current?.should be_true
|
232
232
|
|
@@ -288,11 +288,11 @@ describe "Measurement" do
|
|
288
288
|
before(:each) do
|
289
289
|
@measurement = Barometer::Measurement.new
|
290
290
|
|
291
|
-
# create a measurement object with a
|
291
|
+
# create a measurement object with a result array that includes
|
292
292
|
# dates for 4 consecutive days starting with tommorrow
|
293
|
-
@measurement.forecast = Measurement::
|
293
|
+
@measurement.forecast = Measurement::ResultArray.new
|
294
294
|
1.upto(4) do |i|
|
295
|
-
forecast_measurement = Measurement::
|
295
|
+
forecast_measurement = Measurement::Result.new
|
296
296
|
forecast_measurement.date = Date.parse((Time.now + (i * 60 * 60 * 24)).to_s)
|
297
297
|
@measurement.forecast << forecast_measurement
|
298
298
|
end
|
@@ -302,7 +302,7 @@ describe "Measurement" do
|
|
302
302
|
end
|
303
303
|
|
304
304
|
it "returns nil when there are no forecasts" do
|
305
|
-
@measurement.forecast = Measurement::
|
305
|
+
@measurement.forecast = Measurement::ResultArray.new
|
306
306
|
@measurement.forecast.size.should == 0
|
307
307
|
@measurement.for.should be_nil
|
308
308
|
end
|
@@ -348,7 +348,7 @@ describe "Measurement" do
|
|
348
348
|
|
349
349
|
before(:each) do
|
350
350
|
@measurement = Barometer::Measurement.new(:wunderground)
|
351
|
-
@measurement.current = Measurement::
|
351
|
+
@measurement.current = Measurement::Result.new
|
352
352
|
@now = Data::LocalDateTime.parse("2009-05-01 2:05 pm")
|
353
353
|
end
|
354
354
|
|
@@ -366,16 +366,12 @@ describe "Measurement" do
|
|
366
366
|
describe "windy?" do
|
367
367
|
|
368
368
|
it "returns true if a current_measurement returns true" do
|
369
|
-
|
370
|
-
def windy?(a=nil); true; end
|
371
|
-
end; end
|
369
|
+
@measurement.current.stubs(:windy?).returns(true)
|
372
370
|
@measurement.windy?.should be_true
|
373
371
|
end
|
374
|
-
|
372
|
+
|
375
373
|
it "returns false if a current_measurement returns false" do
|
376
|
-
|
377
|
-
def windy?(a=nil); false; end
|
378
|
-
end; end
|
374
|
+
@measurement.current.stubs(:windy?).returns(false)
|
379
375
|
@measurement.windy?.should be_false
|
380
376
|
end
|
381
377
|
|
@@ -384,16 +380,12 @@ describe "Measurement" do
|
|
384
380
|
describe "wet?" do
|
385
381
|
|
386
382
|
it "returns true if the current_measurement returns true" do
|
387
|
-
|
388
|
-
def wet?(a=nil,b=nil,c=nil); true; end
|
389
|
-
end; end
|
383
|
+
@measurement.current.stubs(:wet?).returns(true)
|
390
384
|
@measurement.wet?.should be_true
|
391
385
|
end
|
392
386
|
|
393
387
|
it "returns false if the current_measurement returns false" do
|
394
|
-
|
395
|
-
def wet?(a=nil,b=nil,c=nil); false; end
|
396
|
-
end; end
|
388
|
+
@measurement.current.stubs(:wet?).returns(false)
|
397
389
|
@measurement.wet?.should be_false
|
398
390
|
end
|
399
391
|
|
@@ -402,16 +394,12 @@ describe "Measurement" do
|
|
402
394
|
describe "day?" do
|
403
395
|
|
404
396
|
it "returns true if the current_measurement returns true" do
|
405
|
-
|
406
|
-
def day?(a=nil); true; end
|
407
|
-
end; end
|
397
|
+
@measurement.current.stubs(:day?).returns(true)
|
408
398
|
@measurement.day?.should be_true
|
409
399
|
end
|
410
400
|
|
411
401
|
it "returns false if the current_measurement returns false" do
|
412
|
-
|
413
|
-
def day?(a=nil); false; end
|
414
|
-
end; end
|
402
|
+
@measurement.current.stubs(:day?).returns(false)
|
415
403
|
@measurement.day?.should be_false
|
416
404
|
end
|
417
405
|
|
@@ -420,34 +408,22 @@ describe "Measurement" do
|
|
420
408
|
describe "sunny?" do
|
421
409
|
|
422
410
|
it "returns true if the current_measurement returns true and day" do
|
423
|
-
|
424
|
-
|
425
|
-
end; end
|
426
|
-
module Barometer; class Measurement::Current < Measurement::Common
|
427
|
-
def sunny?(a=nil,b=nil); true; end
|
428
|
-
end; end
|
411
|
+
@measurement.current.stubs(:day?).returns(true)
|
412
|
+
@measurement.current.stubs(:sunny?).returns(true)
|
429
413
|
@measurement.day?.should be_true
|
430
414
|
@measurement.sunny?.should be_true
|
431
415
|
end
|
432
416
|
|
433
417
|
it "returns false if the current_measurement returns false and day" do
|
434
|
-
|
435
|
-
|
436
|
-
end; end
|
437
|
-
module Barometer; class Measurement::Current < Measurement::Common
|
438
|
-
def sunny?(a=nil,b=nil); false; end
|
439
|
-
end; end
|
418
|
+
@measurement.current.stubs(:day?).returns(true)
|
419
|
+
@measurement.current.stubs(:sunny?).returns(false)
|
440
420
|
@measurement.day?.should be_true
|
441
421
|
@measurement.sunny?.should be_false
|
442
422
|
end
|
443
423
|
|
444
424
|
it "returns false if night time" do
|
445
|
-
|
446
|
-
|
447
|
-
end; end
|
448
|
-
module Barometer; class Measurement::Current < Measurement::Common
|
449
|
-
def sunny?(a=nil,b=nil); true; end
|
450
|
-
end; end
|
425
|
+
@measurement.current.stubs(:day?).returns(false)
|
426
|
+
@measurement.current.stubs(:sunny?).returns(true)
|
451
427
|
@measurement.day?.should be_false
|
452
428
|
@measurement.sunny?.should be_false
|
453
429
|
end
|
@@ -1,22 +1,22 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe "
|
3
|
+
describe "Result Array" do
|
4
4
|
|
5
5
|
describe "instance methods" do
|
6
6
|
|
7
7
|
before(:each) do
|
8
|
-
@array = Measurement::
|
8
|
+
@array = Measurement::ResultArray.new
|
9
9
|
end
|
10
10
|
|
11
11
|
describe "'<<'" do
|
12
12
|
|
13
|
-
it "requires
|
13
|
+
it "requires Measurement::Result" do
|
14
14
|
lambda { @array << "invalid" }.should raise_error(ArgumentError)
|
15
15
|
end
|
16
16
|
|
17
17
|
it "adds ForecastMeasurement" do
|
18
18
|
@array.size.should == 0
|
19
|
-
forecast = Measurement::
|
19
|
+
forecast = Measurement::Result.new
|
20
20
|
@array << forecast
|
21
21
|
@array.size.should == 1
|
22
22
|
end
|
@@ -27,7 +27,7 @@ describe "Forecast Array" do
|
|
27
27
|
|
28
28
|
before(:each) do
|
29
29
|
1.upto(4) do |i|
|
30
|
-
forecast_measurement = Measurement::
|
30
|
+
forecast_measurement = Measurement::Result.new
|
31
31
|
forecast_measurement.date = Date.parse((Time.now + (i * 60 * 60 * 24)).to_s)
|
32
32
|
@array << forecast_measurement
|
33
33
|
end
|
@@ -37,7 +37,7 @@ describe "Forecast Array" do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
it "returns nil when there are no forecasts" do
|
40
|
-
@array = Measurement::
|
40
|
+
@array = Measurement::ResultArray.new
|
41
41
|
@array.size.should == 0
|
42
42
|
@array.for(@tommorrow).should be_nil
|
43
43
|
end
|
@@ -90,7 +90,7 @@ describe "Forecast Array" do
|
|
90
90
|
describe "simple questions" do
|
91
91
|
|
92
92
|
before(:each) do
|
93
|
-
@array = Measurement::
|
93
|
+
@array = Measurement::ResultArray.new
|
94
94
|
#@early = Data::LocalTime("6:00 am")
|
95
95
|
#@noon = Data::LocalTime("12:00 pm")
|
96
96
|
#@late = Data::LocalTime("8:00 pm")
|
@@ -99,7 +99,7 @@ describe "Forecast Array" do
|
|
99
99
|
@sun_icons = %w(sunny)
|
100
100
|
|
101
101
|
0.upto(1) do |i|
|
102
|
-
forecast_measurement = Measurement::
|
102
|
+
forecast_measurement = Measurement::Result.new
|
103
103
|
forecast_measurement.date = Date.parse((@now + (i * 60 * 60 * 24)).to_s)
|
104
104
|
wind = Data::Speed.new
|
105
105
|
wind << (i * 5)
|
@@ -0,0 +1,660 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Result Measurement" do
|
4
|
+
|
5
|
+
describe "when initialized" do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@result = Measurement::Result.new
|
9
|
+
end
|
10
|
+
|
11
|
+
it "responds to temperature" do
|
12
|
+
@result.temperature.should be_nil
|
13
|
+
end
|
14
|
+
|
15
|
+
it "responds to dew_point" do
|
16
|
+
@result.dew_point.should be_nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it "responds to heat_index" do
|
20
|
+
@result.heat_index.should be_nil
|
21
|
+
end
|
22
|
+
|
23
|
+
it "responds to wind_chill" do
|
24
|
+
@result.wind_chill.should be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it "responds to pressure" do
|
28
|
+
@result.pressure.should be_nil
|
29
|
+
end
|
30
|
+
|
31
|
+
it "responds to visibility" do
|
32
|
+
@result.pressure.should be_nil
|
33
|
+
end
|
34
|
+
|
35
|
+
it "responds to current_at" do
|
36
|
+
@result.current_at.should be_nil
|
37
|
+
end
|
38
|
+
|
39
|
+
it "responds to updated_at" do
|
40
|
+
@result.updated_at.should be_nil
|
41
|
+
end
|
42
|
+
|
43
|
+
it "responds to date" do
|
44
|
+
@result.date.should be_nil
|
45
|
+
end
|
46
|
+
|
47
|
+
it "responds to low" do
|
48
|
+
@result.low.should be_nil
|
49
|
+
end
|
50
|
+
|
51
|
+
it "responds to high" do
|
52
|
+
@result.high.should be_nil
|
53
|
+
end
|
54
|
+
|
55
|
+
it "responds to pop" do
|
56
|
+
@result.pop.should be_nil
|
57
|
+
end
|
58
|
+
|
59
|
+
it "responds to valid_start_date" do
|
60
|
+
@result.valid_start_date.should be_nil
|
61
|
+
end
|
62
|
+
|
63
|
+
it "responds to valid_end_date" do
|
64
|
+
@result.valid_end_date.should be_nil
|
65
|
+
end
|
66
|
+
|
67
|
+
it "responds to description" do
|
68
|
+
@result.description.should be_nil
|
69
|
+
end
|
70
|
+
|
71
|
+
it "responds to humidity" do
|
72
|
+
@result.humidity.should be_nil
|
73
|
+
end
|
74
|
+
|
75
|
+
it "responds to icon" do
|
76
|
+
@result.icon.should be_nil
|
77
|
+
end
|
78
|
+
|
79
|
+
it "responds to condition" do
|
80
|
+
@result.condition.should be_nil
|
81
|
+
end
|
82
|
+
|
83
|
+
it "responds to wind" do
|
84
|
+
@result.wind.should be_nil
|
85
|
+
end
|
86
|
+
|
87
|
+
it "responds to sun" do
|
88
|
+
@result.sun.should be_nil
|
89
|
+
end
|
90
|
+
|
91
|
+
it "responds to metric" do
|
92
|
+
@result.metric.should be_true
|
93
|
+
end
|
94
|
+
|
95
|
+
it "responds to metric?" do
|
96
|
+
@result.metric?.should be_true
|
97
|
+
@result.metric = false
|
98
|
+
@result.metric?.should be_false
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "when writing data" do
|
104
|
+
|
105
|
+
before(:each) do
|
106
|
+
@result = Measurement::Result.new
|
107
|
+
end
|
108
|
+
|
109
|
+
it "only accepts Data::Temperature for temperature" do
|
110
|
+
invalid_data = 1
|
111
|
+
invalid_data.class.should_not == Data::Temperature
|
112
|
+
lambda { @result.temperature = invalid_data }.should raise_error(ArgumentError)
|
113
|
+
|
114
|
+
valid_data = Data::Temperature.new
|
115
|
+
valid_data.class.should == Data::Temperature
|
116
|
+
lambda { @result.temperature = valid_data }.should_not raise_error(ArgumentError)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "only accepts Data::Temperature for dew_point" do
|
120
|
+
invalid_data = 1
|
121
|
+
invalid_data.class.should_not == Data::Temperature
|
122
|
+
lambda { @result.dew_point = invalid_data }.should raise_error(ArgumentError)
|
123
|
+
|
124
|
+
valid_data = Data::Temperature.new
|
125
|
+
valid_data.class.should == Data::Temperature
|
126
|
+
lambda { @result.dew_point = valid_data }.should_not raise_error(ArgumentError)
|
127
|
+
end
|
128
|
+
|
129
|
+
it "only accepts Data::Temperature for heat_index" do
|
130
|
+
invalid_data = 1
|
131
|
+
invalid_data.class.should_not == Data::Temperature
|
132
|
+
lambda { @result.heat_index = invalid_data }.should raise_error(ArgumentError)
|
133
|
+
|
134
|
+
valid_data = Data::Temperature.new
|
135
|
+
valid_data.class.should == Data::Temperature
|
136
|
+
lambda { @result.heat_index = valid_data }.should_not raise_error(ArgumentError)
|
137
|
+
end
|
138
|
+
|
139
|
+
it "only accepts Data::Temperature for wind_chill" do
|
140
|
+
invalid_data = 1
|
141
|
+
invalid_data.class.should_not == Data::Temperature
|
142
|
+
lambda { @result.wind_chill = invalid_data }.should raise_error(ArgumentError)
|
143
|
+
|
144
|
+
valid_data = Data::Temperature.new
|
145
|
+
valid_data.class.should == Data::Temperature
|
146
|
+
lambda { @result.wind_chill = valid_data }.should_not raise_error(ArgumentError)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "only accepts Data::Pressure for pressure" do
|
150
|
+
invalid_data = 1
|
151
|
+
invalid_data.class.should_not == Data::Pressure
|
152
|
+
lambda { @result.pressure = invalid_data }.should raise_error(ArgumentError)
|
153
|
+
|
154
|
+
valid_data = Data::Pressure.new
|
155
|
+
valid_data.class.should == Data::Pressure
|
156
|
+
lambda { @result.pressure = valid_data }.should_not raise_error(ArgumentError)
|
157
|
+
end
|
158
|
+
|
159
|
+
it "only accepts Data::Distance for visibility" do
|
160
|
+
invalid_data = 1
|
161
|
+
invalid_data.class.should_not == Data::Distance
|
162
|
+
lambda { @result.visibility = invalid_data }.should raise_error(ArgumentError)
|
163
|
+
|
164
|
+
valid_data = Data::Distance.new
|
165
|
+
valid_data.class.should == Data::Distance
|
166
|
+
lambda { @result.visibility = valid_data }.should_not raise_error(ArgumentError)
|
167
|
+
end
|
168
|
+
|
169
|
+
it "only accepts Data::LocalTime || Data::LocalDateTime current_at" do
|
170
|
+
invalid_data = 1
|
171
|
+
invalid_data.class.should_not == Data::LocalTime
|
172
|
+
invalid_data.class.should_not == Data::LocalDateTime
|
173
|
+
lambda { @result.current_at = invalid_data }.should raise_error(ArgumentError)
|
174
|
+
|
175
|
+
valid_data = Data::LocalTime.new
|
176
|
+
valid_data.class.should == Data::LocalTime
|
177
|
+
lambda { @result.current_at = valid_data }.should_not raise_error(ArgumentError)
|
178
|
+
|
179
|
+
valid_data = Data::LocalDateTime.new(2009,1,1)
|
180
|
+
valid_data.class.should == Data::LocalDateTime
|
181
|
+
lambda { @result.current_at = valid_data }.should_not raise_error(ArgumentError)
|
182
|
+
end
|
183
|
+
|
184
|
+
it "only accepts Data::LocalTime || Data::LocalDateTime current_at" do
|
185
|
+
invalid_data = 1
|
186
|
+
invalid_data.class.should_not == Data::LocalTime
|
187
|
+
invalid_data.class.should_not == Data::LocalDateTime
|
188
|
+
lambda { @result.updated_at = invalid_data }.should raise_error(ArgumentError)
|
189
|
+
|
190
|
+
valid_data = Data::LocalTime.new
|
191
|
+
valid_data.class.should == Data::LocalTime
|
192
|
+
lambda { @result.updated_at = valid_data }.should_not raise_error(ArgumentError)
|
193
|
+
|
194
|
+
valid_data = Data::LocalDateTime.new(2009,1,1)
|
195
|
+
valid_data.class.should == Data::LocalDateTime
|
196
|
+
lambda { @result.updated_at = valid_data }.should_not raise_error(ArgumentError)
|
197
|
+
end
|
198
|
+
|
199
|
+
it "only accepts Date for date" do
|
200
|
+
invalid_data = 1
|
201
|
+
invalid_data.class.should_not == Date
|
202
|
+
lambda { @result.date = invalid_data }.should raise_error(ArgumentError)
|
203
|
+
|
204
|
+
valid_data = Date.new
|
205
|
+
valid_data.class.should == Date
|
206
|
+
lambda { @result.date = valid_data }.should_not raise_error(ArgumentError)
|
207
|
+
end
|
208
|
+
|
209
|
+
it "only accepts Data::Temperature for high" do
|
210
|
+
invalid_data = 1
|
211
|
+
invalid_data.class.should_not == Data::Temperature
|
212
|
+
lambda { @result.high = invalid_data }.should raise_error(ArgumentError)
|
213
|
+
|
214
|
+
valid_data = Data::Temperature.new
|
215
|
+
valid_data.class.should == Data::Temperature
|
216
|
+
lambda { @result.high = valid_data }.should_not raise_error(ArgumentError)
|
217
|
+
end
|
218
|
+
|
219
|
+
it "only accepts Data::Temperature for low" do
|
220
|
+
invalid_data = 1
|
221
|
+
invalid_data.class.should_not == Data::Temperature
|
222
|
+
lambda { @result.low = invalid_data }.should raise_error(ArgumentError)
|
223
|
+
|
224
|
+
valid_data = Data::Temperature.new
|
225
|
+
valid_data.class.should == Data::Temperature
|
226
|
+
lambda { @result.low = valid_data }.should_not raise_error(ArgumentError)
|
227
|
+
end
|
228
|
+
|
229
|
+
it "only accepts Fixnum for pop" do
|
230
|
+
invalid_data = "test"
|
231
|
+
invalid_data.class.should_not == Fixnum
|
232
|
+
lambda { @result.pop = invalid_data }.should raise_error(ArgumentError)
|
233
|
+
|
234
|
+
valid_data = 50
|
235
|
+
valid_data.class.should == Fixnum
|
236
|
+
lambda { @result.pop = valid_data }.should_not raise_error(ArgumentError)
|
237
|
+
end
|
238
|
+
|
239
|
+
it "only accepts Data::LocalDateTime for valid_start_date" do
|
240
|
+
invalid_data = 1
|
241
|
+
invalid_data.class.should_not == Data::LocalDateTime
|
242
|
+
lambda { @result.valid_start_date = invalid_data }.should raise_error(ArgumentError)
|
243
|
+
|
244
|
+
valid_data = Data::LocalDateTime.new(2009,1,1)
|
245
|
+
valid_data.class.should == Data::LocalDateTime
|
246
|
+
lambda { @result.valid_start_date = valid_data }.should_not raise_error(ArgumentError)
|
247
|
+
end
|
248
|
+
|
249
|
+
it "only accepts Data::LocalDateTime for valid_end_date" do
|
250
|
+
invalid_data = 1
|
251
|
+
invalid_data.class.should_not == Data::LocalDateTime
|
252
|
+
lambda { @result.valid_end_date = invalid_data }.should raise_error(ArgumentError)
|
253
|
+
|
254
|
+
valid_data = Data::LocalDateTime.new(2009,1,1)
|
255
|
+
valid_data.class.should == Data::LocalDateTime
|
256
|
+
lambda { @result.valid_end_date = valid_data }.should_not raise_error(ArgumentError)
|
257
|
+
end
|
258
|
+
|
259
|
+
it "sets valid_start_date and valid_end_date if given date" do
|
260
|
+
forecast = Measurement::Result.new
|
261
|
+
forecast.valid_start_date.should be_nil
|
262
|
+
forecast.valid_end_date.should be_nil
|
263
|
+
date = Date.new(2009,05,05)
|
264
|
+
forecast.date = date
|
265
|
+
forecast.valid_start_date.should_not be_nil
|
266
|
+
forecast.valid_start_date.year.should == date.year
|
267
|
+
forecast.valid_start_date.month.should == date.month
|
268
|
+
forecast.valid_start_date.day.should == date.day
|
269
|
+
forecast.valid_start_date.hour.should == 0
|
270
|
+
forecast.valid_start_date.min.should == 0
|
271
|
+
forecast.valid_start_date.sec.should == 0
|
272
|
+
|
273
|
+
forecast.valid_end_date.should_not be_nil
|
274
|
+
forecast.valid_end_date.year.should == date.year
|
275
|
+
forecast.valid_end_date.month.should == date.month
|
276
|
+
forecast.valid_end_date.day.should == date.day
|
277
|
+
forecast.valid_end_date.hour.should == 23
|
278
|
+
forecast.valid_end_date.min.should == 59
|
279
|
+
forecast.valid_end_date.sec.should == 59
|
280
|
+
end
|
281
|
+
|
282
|
+
it "returns true if the valid_date range includes the given date" do
|
283
|
+
forecast = Measurement::Result.new
|
284
|
+
forecast.date = Date.new(2009,05,05)
|
285
|
+
forecast.for_datetime?(Data::LocalDateTime.new(2009,5,5,12,0,0)).should be_true
|
286
|
+
end
|
287
|
+
|
288
|
+
it "returns false if the valid_date range excludes the given date" do
|
289
|
+
forecast = Measurement::Result.new
|
290
|
+
forecast.date = Date.new(2009,05,05)
|
291
|
+
forecast.for_datetime?(Data::LocalDateTime.new(2009,5,4,12,0,0)).should be_false
|
292
|
+
end
|
293
|
+
|
294
|
+
it "only accepts Fixnum or Float for humidity" do
|
295
|
+
invalid_data = "invalid"
|
296
|
+
invalid_data.class.should_not == Fixnum
|
297
|
+
invalid_data.class.should_not == Float
|
298
|
+
lambda { @result.humidity = invalid_data }.should raise_error(ArgumentError)
|
299
|
+
|
300
|
+
valid_data = 1.to_i
|
301
|
+
valid_data.class.should == Fixnum
|
302
|
+
lambda { @result.humidity = valid_data }.should_not raise_error(ArgumentError)
|
303
|
+
|
304
|
+
valid_data = 1.0.to_f
|
305
|
+
valid_data.class.should == Float
|
306
|
+
lambda { @result.humidity = valid_data }.should_not raise_error(ArgumentError)
|
307
|
+
end
|
308
|
+
|
309
|
+
it "only accepts String for icon" do
|
310
|
+
invalid_data = 1
|
311
|
+
invalid_data.class.should_not == String
|
312
|
+
lambda { @result.icon = invalid_data }.should raise_error(ArgumentError)
|
313
|
+
|
314
|
+
valid_data = "valid"
|
315
|
+
valid_data.class.should == String
|
316
|
+
lambda { @result.icon = valid_data }.should_not raise_error(ArgumentError)
|
317
|
+
end
|
318
|
+
|
319
|
+
it "only accepts String for condition" do
|
320
|
+
invalid_data = 1
|
321
|
+
invalid_data.class.should_not == String
|
322
|
+
lambda { @result.condition = invalid_data }.should raise_error(ArgumentError)
|
323
|
+
|
324
|
+
valid_data = "valid"
|
325
|
+
valid_data.class.should == String
|
326
|
+
lambda { @result.condition = valid_data }.should_not raise_error(ArgumentError)
|
327
|
+
end
|
328
|
+
|
329
|
+
it "only accepts Data::Speed for wind" do
|
330
|
+
invalid_data = 1
|
331
|
+
invalid_data.class.should_not == Data::Speed
|
332
|
+
lambda { @result.wind = invalid_data }.should raise_error(ArgumentError)
|
333
|
+
|
334
|
+
valid_data = Data::Speed.new
|
335
|
+
valid_data.class.should == Data::Speed
|
336
|
+
lambda { @result.wind = valid_data }.should_not raise_error(ArgumentError)
|
337
|
+
end
|
338
|
+
|
339
|
+
it "only accepts Data::Sun for sun" do
|
340
|
+
invalid_data = 1
|
341
|
+
invalid_data.class.should_not == Data::Sun
|
342
|
+
lambda { @result.sun = invalid_data }.should raise_error(ArgumentError)
|
343
|
+
|
344
|
+
valid_data = Data::Sun.new
|
345
|
+
valid_data.class.should == Data::Sun
|
346
|
+
lambda { @result.sun = valid_data }.should_not raise_error(ArgumentError)
|
347
|
+
end
|
348
|
+
|
349
|
+
end
|
350
|
+
|
351
|
+
describe "method missing" do
|
352
|
+
|
353
|
+
before(:each) do
|
354
|
+
@result = Measurement::Result.new
|
355
|
+
end
|
356
|
+
|
357
|
+
it "responds to method + ?" do
|
358
|
+
valid_method = "humidity"
|
359
|
+
@result.respond_to?(valid_method).should be_true
|
360
|
+
lambda { @result.send(valid_method + "?") }.should_not raise_error(NoMethodError)
|
361
|
+
end
|
362
|
+
|
363
|
+
it "ignores non_method + ?" do
|
364
|
+
invalid_method = "humid"
|
365
|
+
@result.respond_to?(invalid_method).should be_false
|
366
|
+
lambda { @result.send(invalid_method + "?") }.should raise_error(NoMethodError)
|
367
|
+
end
|
368
|
+
|
369
|
+
it "returns true if set" do
|
370
|
+
@result.humidity = 10
|
371
|
+
@result.humidity.should_not be_nil
|
372
|
+
@result.humidity?.should be_true
|
373
|
+
end
|
374
|
+
|
375
|
+
it "returns false if not set" do
|
376
|
+
@result.humidity.should be_nil
|
377
|
+
@result.humidity?.should be_false
|
378
|
+
end
|
379
|
+
|
380
|
+
end
|
381
|
+
|
382
|
+
describe "answer simple questions, like" do
|
383
|
+
|
384
|
+
before(:each) do
|
385
|
+
@result = Measurement::Result.new
|
386
|
+
@result.temperature = Data::Temperature.new
|
387
|
+
@result.temperature << 5
|
388
|
+
@dew_point = Data::Temperature.new
|
389
|
+
@dew_point << 10
|
390
|
+
end
|
391
|
+
|
392
|
+
describe "windy?" do
|
393
|
+
|
394
|
+
before(:each) do
|
395
|
+
@wind = Data::Speed.new
|
396
|
+
@wind << 11
|
397
|
+
end
|
398
|
+
|
399
|
+
it "requires real threshold number (or nil)" do
|
400
|
+
lambda { @result.windy?("invalid") }.should raise_error(ArgumentError)
|
401
|
+
lambda { @result.windy? }.should_not raise_error(ArgumentError)
|
402
|
+
lambda { @result.windy?(10) }.should_not raise_error(ArgumentError)
|
403
|
+
end
|
404
|
+
|
405
|
+
it "returns nil when no wind" do
|
406
|
+
@result.wind?.should be_false
|
407
|
+
@result.windy?.should be_nil
|
408
|
+
@result.wind = @wind
|
409
|
+
@result.wind?.should be_true
|
410
|
+
@result.windy?.should_not be_nil
|
411
|
+
end
|
412
|
+
|
413
|
+
it "return true when current wind over threshold" do
|
414
|
+
@result.wind = @wind
|
415
|
+
@result.windy?.should be_true
|
416
|
+
@result.windy?(10).should be_true
|
417
|
+
end
|
418
|
+
|
419
|
+
it "return false when current wind under threshold" do
|
420
|
+
@result.wind = @wind
|
421
|
+
@result.windy?(15).should be_false
|
422
|
+
end
|
423
|
+
|
424
|
+
end
|
425
|
+
|
426
|
+
describe "day?" do
|
427
|
+
|
428
|
+
before(:each) do
|
429
|
+
@early_time = Data::LocalTime.parse("6:00 am")
|
430
|
+
@mid_time = Data::LocalTime.parse("11:00 am")
|
431
|
+
@late_time = Data::LocalTime.parse("8:00 pm")
|
432
|
+
@sun = Data::Sun.new(@early_time, @late_time)
|
433
|
+
|
434
|
+
end
|
435
|
+
|
436
|
+
it "requires Data::LocalTime object" do
|
437
|
+
@result.sun = @sun
|
438
|
+
lambda { @result.day?("invalid") }.should raise_error(ArgumentError)
|
439
|
+
lambda { @result.day? }.should raise_error(ArgumentError)
|
440
|
+
lambda { @result.day?(@mid_time) }.should_not raise_error(ArgumentError)
|
441
|
+
end
|
442
|
+
|
443
|
+
it "returns nil when no sun" do
|
444
|
+
@result.sun?.should be_false
|
445
|
+
@result.day?(@mid_time).should be_nil
|
446
|
+
@result.sun = @sun
|
447
|
+
@result.sun?.should be_true
|
448
|
+
@result.day?(@mid_time).should_not be_nil
|
449
|
+
end
|
450
|
+
|
451
|
+
it "return true when time between rise and set" do
|
452
|
+
@result.sun = @sun
|
453
|
+
@result.day?(@mid_time).should be_true
|
454
|
+
end
|
455
|
+
|
456
|
+
it "return false when time before rise or after set" do
|
457
|
+
sun = Data::Sun.new(@mid_time, @late_time)
|
458
|
+
@result.sun = sun
|
459
|
+
@result.day?(@early_time).should be_false
|
460
|
+
|
461
|
+
sun = Data::Sun.new(@early_time, @mid_time)
|
462
|
+
@result.sun = sun
|
463
|
+
@result.day?(@late_time).should be_false
|
464
|
+
end
|
465
|
+
|
466
|
+
end
|
467
|
+
|
468
|
+
describe "wet?" do
|
469
|
+
|
470
|
+
describe "wet_by_humidity?" do
|
471
|
+
|
472
|
+
it "requires real threshold number (or nil)" do
|
473
|
+
lambda { @result.send("_wet_by_humidity?","invalid") }.should raise_error(ArgumentError)
|
474
|
+
lambda { @result.send("_wet_by_humidity?") }.should_not raise_error(ArgumentError)
|
475
|
+
lambda { @result.send("_wet_by_humidity?",99) }.should_not raise_error(ArgumentError)
|
476
|
+
end
|
477
|
+
|
478
|
+
it "returns nil when no humidity" do
|
479
|
+
@result.humidity?.should be_false
|
480
|
+
@result.send("_wet_by_humidity?").should be_nil
|
481
|
+
@result.wet?(nil,99).should be_nil
|
482
|
+
@result.humidity = 100
|
483
|
+
@result.humidity?.should be_true
|
484
|
+
@result.send("_wet_by_humidity?").should_not be_nil
|
485
|
+
@result.wet?(nil,99).should_not be_nil
|
486
|
+
end
|
487
|
+
|
488
|
+
it "return true when current humidity over threshold" do
|
489
|
+
@result.humidity = 100
|
490
|
+
@result.send("_wet_by_humidity?").should be_true
|
491
|
+
@result.send("_wet_by_humidity?",99).should be_true
|
492
|
+
@result.wet?(nil,99).should be_true
|
493
|
+
end
|
494
|
+
|
495
|
+
it "return false when current humidity under threshold" do
|
496
|
+
@result.humidity = 98
|
497
|
+
@result.send("_wet_by_humidity?",99).should be_false
|
498
|
+
@result.wet?(nil,99).should be_false
|
499
|
+
end
|
500
|
+
|
501
|
+
end
|
502
|
+
|
503
|
+
describe "wet_by_icon?" do
|
504
|
+
|
505
|
+
before(:each) do
|
506
|
+
@wet_icons = %w(rain thunderstorm)
|
507
|
+
end
|
508
|
+
|
509
|
+
it "requires Array (or nil)" do
|
510
|
+
lambda { @result.send("_wet_by_icon?","invalid") }.should raise_error(ArgumentError)
|
511
|
+
lambda { @result.send("_wet_by_icon?") }.should_not raise_error(ArgumentError)
|
512
|
+
lambda { @result.send("_wet_by_icon?",@wet_icons) }.should_not raise_error(ArgumentError)
|
513
|
+
end
|
514
|
+
|
515
|
+
it "returns nil when no icon or Array" do
|
516
|
+
@result.icon?.should be_false
|
517
|
+
@result.send("_wet_by_icon?",@wet_icons).should be_nil
|
518
|
+
@result.wet?(@wet_icons).should be_nil
|
519
|
+
@result.icon = "rain"
|
520
|
+
@result.icon?.should be_true
|
521
|
+
@result.send("_wet_by_icon?").should be_nil
|
522
|
+
@result.send("_wet_by_icon?",@wet_icons).should_not be_nil
|
523
|
+
@result.wet?(@wet_icons).should_not be_nil
|
524
|
+
end
|
525
|
+
|
526
|
+
it "return true when current icon indicates wet" do
|
527
|
+
@result.icon = "rain"
|
528
|
+
@result.send("_wet_by_icon?",@wet_icons).should be_true
|
529
|
+
@result.wet?(@wet_icons).should be_true
|
530
|
+
end
|
531
|
+
|
532
|
+
it "return false when current icon does NOT indicate wet" do
|
533
|
+
@result.icon = "sun"
|
534
|
+
@result.send("_wet_by_icon?",@wet_icons).should be_false
|
535
|
+
@result.wet?(@wet_icons).should be_false
|
536
|
+
end
|
537
|
+
|
538
|
+
end
|
539
|
+
|
540
|
+
describe "wet_by_dewpoint?" do
|
541
|
+
|
542
|
+
it "returns nil when no dewpoint" do
|
543
|
+
@result.dew_point?.should be_false
|
544
|
+
@result.send("_wet_by_dewpoint?").should be_nil
|
545
|
+
@result.wet?.should be_nil
|
546
|
+
@result.dew_point = @dew_point
|
547
|
+
@result.dew_point?.should be_true
|
548
|
+
@result.send("_wet_by_dewpoint?").should_not be_nil
|
549
|
+
@result.wet?.should_not be_nil
|
550
|
+
end
|
551
|
+
|
552
|
+
it "return true when current dewpoint over temperature" do
|
553
|
+
@result.dew_point = @dew_point
|
554
|
+
@result.send("_wet_by_dewpoint?").should be_true
|
555
|
+
@result.wet?.should be_true
|
556
|
+
end
|
557
|
+
|
558
|
+
it "return false when current dewpoint under temperature" do
|
559
|
+
@result.temperature << 15
|
560
|
+
@result.dew_point = @dew_point
|
561
|
+
@result.send("_wet_by_dewpoint?").should be_false
|
562
|
+
@result.wet?.should be_false
|
563
|
+
end
|
564
|
+
|
565
|
+
end
|
566
|
+
|
567
|
+
describe "wet_by_pop?" do
|
568
|
+
|
569
|
+
it "requires real threshold number (or nil)" do
|
570
|
+
lambda { @result.send("_wet_by_pop?","invalid") }.should raise_error(ArgumentError)
|
571
|
+
lambda { @result.send("_wet_by_pop?") }.should_not raise_error(ArgumentError)
|
572
|
+
lambda { @result.send("_wet_by_pop?",50) }.should_not raise_error(ArgumentError)
|
573
|
+
end
|
574
|
+
|
575
|
+
it "returns nil when no pop" do
|
576
|
+
@result.pop?.should be_false
|
577
|
+
@result.send("_wet_by_pop?",50).should be_nil
|
578
|
+
@result.wet?.should be_nil
|
579
|
+
@result.pop = 60
|
580
|
+
@result.pop?.should be_true
|
581
|
+
@result.send("_wet_by_pop?",50).should_not be_nil
|
582
|
+
@result.wet?.should_not be_nil
|
583
|
+
end
|
584
|
+
|
585
|
+
it "return true when current pop over threshold" do
|
586
|
+
@result.pop = 60
|
587
|
+
@result.send("_wet_by_pop?",50).should be_true
|
588
|
+
@result.wet?.should be_true
|
589
|
+
end
|
590
|
+
|
591
|
+
it "return false when current pop under threshold" do
|
592
|
+
@result.pop = 40
|
593
|
+
@result.send("_wet_by_pop?",50).should be_false
|
594
|
+
@result.wet?.should be_false
|
595
|
+
end
|
596
|
+
|
597
|
+
end
|
598
|
+
|
599
|
+
end
|
600
|
+
|
601
|
+
describe "sunny?" do
|
602
|
+
|
603
|
+
describe "sunny_by_icon?" do
|
604
|
+
|
605
|
+
before(:each) do
|
606
|
+
@sunny_icons = %w(sunny clear)
|
607
|
+
@early_time = Data::LocalTime.parse("6:00 am")
|
608
|
+
@mid_time = Data::LocalTime.parse("11:00 am")
|
609
|
+
@late_time = Data::LocalTime.parse("8:00 pm")
|
610
|
+
@sun = Data::Sun.new(@early_time, @late_time)
|
611
|
+
|
612
|
+
@result.sun = @sun
|
613
|
+
end
|
614
|
+
|
615
|
+
it "requires Array (or nil)" do
|
616
|
+
lambda { @result.send("_sunny_by_icon?","invalid") }.should raise_error(ArgumentError)
|
617
|
+
lambda { @result.send("_sunny_by_icon?") }.should_not raise_error(ArgumentError)
|
618
|
+
lambda { @result.send("_sunny_by_icon?",@sunny_icons) }.should_not raise_error(ArgumentError)
|
619
|
+
end
|
620
|
+
|
621
|
+
it "returns nil when no icon or Array" do
|
622
|
+
@result.icon?.should be_false
|
623
|
+
@result.send("_sunny_by_icon?",@sunny_icons).should be_nil
|
624
|
+
@result.sunny?(@mid_time,@sunny_icons).should be_nil
|
625
|
+
@result.icon = "sunny"
|
626
|
+
@result.icon?.should be_true
|
627
|
+
@result.send("_sunny_by_icon?").should be_nil
|
628
|
+
@result.send("_sunny_by_icon?",@sunny_icons).should_not be_nil
|
629
|
+
@result.sun?(@mid_time,@sunny_icons).should_not be_nil
|
630
|
+
end
|
631
|
+
|
632
|
+
it "returns true when current icon indicates sunny" do
|
633
|
+
@result.icon = "sunny"
|
634
|
+
@result.send("_sunny_by_icon?",@sunny_icons).should be_true
|
635
|
+
@result.sunny?(@mid_time,@sunny_icons).should be_true
|
636
|
+
end
|
637
|
+
|
638
|
+
it "returns false when current icon does NOT indicate sunny" do
|
639
|
+
@result.icon = "rain"
|
640
|
+
@result.send("_sunny_by_icon?",@sunny_icons).should be_false
|
641
|
+
@result.sunny?(@mid_time,@sunny_icons).should be_false
|
642
|
+
end
|
643
|
+
|
644
|
+
it "returns false when night" do
|
645
|
+
@result.icon = "sunny"
|
646
|
+
@result.send("_sunny_by_icon?",@sunny_icons).should be_true
|
647
|
+
@result.sunny?(@mid_time,@sunny_icons).should be_true
|
648
|
+
|
649
|
+
@sun = Data::Sun.new(@mid_time, @late_time)
|
650
|
+
@result.sun = @sun
|
651
|
+
@result.sunny?(@early_time,@sunny_icons).should be_false
|
652
|
+
end
|
653
|
+
|
654
|
+
end
|
655
|
+
|
656
|
+
end
|
657
|
+
|
658
|
+
end
|
659
|
+
|
660
|
+
end
|