barometer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +266 -0
  3. data/VERSION.yml +4 -0
  4. data/bin/barometer +63 -0
  5. data/lib/barometer.rb +52 -0
  6. data/lib/barometer/base.rb +52 -0
  7. data/lib/barometer/data.rb +15 -0
  8. data/lib/barometer/data/current.rb +93 -0
  9. data/lib/barometer/data/distance.rb +131 -0
  10. data/lib/barometer/data/forecast.rb +66 -0
  11. data/lib/barometer/data/geo.rb +98 -0
  12. data/lib/barometer/data/location.rb +20 -0
  13. data/lib/barometer/data/measurement.rb +161 -0
  14. data/lib/barometer/data/pressure.rb +133 -0
  15. data/lib/barometer/data/speed.rb +147 -0
  16. data/lib/barometer/data/sun.rb +35 -0
  17. data/lib/barometer/data/temperature.rb +164 -0
  18. data/lib/barometer/data/units.rb +55 -0
  19. data/lib/barometer/data/zone.rb +124 -0
  20. data/lib/barometer/extensions/graticule.rb +50 -0
  21. data/lib/barometer/extensions/httparty.rb +21 -0
  22. data/lib/barometer/query.rb +228 -0
  23. data/lib/barometer/services.rb +6 -0
  24. data/lib/barometer/services/google.rb +146 -0
  25. data/lib/barometer/services/noaa.rb +6 -0
  26. data/lib/barometer/services/service.rb +324 -0
  27. data/lib/barometer/services/weather_bug.rb +6 -0
  28. data/lib/barometer/services/weather_dot_com.rb +6 -0
  29. data/lib/barometer/services/wunderground.rb +285 -0
  30. data/lib/barometer/services/yahoo.rb +274 -0
  31. data/lib/barometer/weather.rb +187 -0
  32. data/spec/barometer_spec.rb +162 -0
  33. data/spec/data_current_spec.rb +225 -0
  34. data/spec/data_distance_spec.rb +336 -0
  35. data/spec/data_forecast_spec.rb +150 -0
  36. data/spec/data_geo_spec.rb +90 -0
  37. data/spec/data_location_spec.rb +59 -0
  38. data/spec/data_measurement_spec.rb +411 -0
  39. data/spec/data_pressure_spec.rb +336 -0
  40. data/spec/data_speed_spec.rb +374 -0
  41. data/spec/data_sun_spec.rb +76 -0
  42. data/spec/data_temperature_spec.rb +396 -0
  43. data/spec/data_zone_spec.rb +133 -0
  44. data/spec/fixtures/current_calgary_ab.xml +1 -0
  45. data/spec/fixtures/forecast_calgary_ab.xml +1 -0
  46. data/spec/fixtures/geocode_40_73.xml +1 -0
  47. data/spec/fixtures/geocode_90210.xml +1 -0
  48. data/spec/fixtures/geocode_T5B4M9.xml +1 -0
  49. data/spec/fixtures/geocode_calgary_ab.xml +1 -0
  50. data/spec/fixtures/geocode_newyork_ny.xml +1 -0
  51. data/spec/fixtures/google_calgary_ab.xml +1 -0
  52. data/spec/fixtures/yahoo_90210.xml +1 -0
  53. data/spec/query_spec.rb +469 -0
  54. data/spec/service_google_spec.rb +144 -0
  55. data/spec/service_wunderground_spec.rb +330 -0
  56. data/spec/service_yahoo_spec.rb +299 -0
  57. data/spec/services_spec.rb +1106 -0
  58. data/spec/spec_helper.rb +14 -0
  59. data/spec/units_spec.rb +101 -0
  60. data/spec/weather_spec.rb +265 -0
  61. metadata +119 -0
@@ -0,0 +1,299 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Yahoo" do
4
+
5
+ before(:each) do
6
+ @accepted_formats = [:zipcode]
7
+ #@base_uri = "http://google.com"
8
+ end
9
+
10
+ describe "the class methods" do
11
+
12
+ it "defines accepted_formats" do
13
+ Barometer::Yahoo.accepted_formats.should == @accepted_formats
14
+ end
15
+
16
+ # it "defines base_uri" do
17
+ # Barometer::Google.base_uri.should == @base_uri
18
+ # end
19
+
20
+ it "defines get_all" do
21
+ Barometer::Yahoo.respond_to?("get_all").should be_true
22
+ end
23
+
24
+ end
25
+
26
+ describe "building the current data" do
27
+
28
+ it "defines the build method" do
29
+ Barometer::Yahoo.respond_to?("build_current").should be_true
30
+ end
31
+
32
+ it "requires Hash input" do
33
+ lambda { Barometer::Yahoo.build_current }.should raise_error(ArgumentError)
34
+ lambda { Barometer::Yahoo.build_current({}) }.should_not raise_error(ArgumentError)
35
+ end
36
+
37
+ it "returns Barometer::CurrentMeasurement object" do
38
+ current = Barometer::Yahoo.build_current({})
39
+ current.is_a?(Barometer::CurrentMeasurement).should be_true
40
+ end
41
+
42
+ end
43
+
44
+ describe "building the forecast data" do
45
+
46
+ it "defines the build method" do
47
+ Barometer::Yahoo.respond_to?("build_forecast").should be_true
48
+ end
49
+
50
+ it "requires Hash input" do
51
+ lambda { Barometer::Yahoo.build_forecast }.should raise_error(ArgumentError)
52
+ lambda { Barometer::Yahoo.build_forecast({}) }.should_not raise_error(ArgumentError)
53
+ end
54
+
55
+ it "returns Array object" do
56
+ current = Barometer::Yahoo.build_forecast({})
57
+ current.is_a?(Array).should be_true
58
+ end
59
+
60
+ end
61
+
62
+ describe "building the location data" do
63
+
64
+ it "defines the build method" do
65
+ Barometer::Yahoo.respond_to?("build_location").should be_true
66
+ end
67
+
68
+ it "requires Hash input" do
69
+ lambda { Barometer::Yahoo.build_location }.should raise_error(ArgumentError)
70
+ lambda { Barometer::Yahoo.build_location({}) }.should_not raise_error(ArgumentError)
71
+ end
72
+
73
+ it "requires Barometer::Geo input" do
74
+ geo = Barometer::Geo.new({})
75
+ lambda { Barometer::Yahoo.build_location({}, {}) }.should raise_error(ArgumentError)
76
+ lambda { Barometer::Yahoo.build_location({}, geo) }.should_not raise_error(ArgumentError)
77
+ end
78
+
79
+ it "returns Barometer::Location object" do
80
+ location = Barometer::Yahoo.build_location({})
81
+ location.is_a?(Barometer::Location).should be_true
82
+ end
83
+
84
+ end
85
+
86
+ # describe "building the timezone" do
87
+ #
88
+ # it "defines the build method" do
89
+ # Barometer::Yahoo.respond_to?("build_timezone").should be_true
90
+ # end
91
+ #
92
+ # it "requires Hash input" do
93
+ # lambda { Barometer::Yahoo.build_timezone }.should raise_error(ArgumentError)
94
+ # lambda { Barometer::Yahoo.build_timezone({}) }.should_not raise_error(ArgumentError)
95
+ # end
96
+ #
97
+ # end
98
+
99
+ describe "when measuring" do
100
+
101
+ before(:each) do
102
+ @query = Barometer::Query.new("90210")
103
+ @query.preferred = "90210"
104
+ @measurement = Barometer::Measurement.new
105
+
106
+ FakeWeb.register_uri(:get,
107
+ "http://weather.yahooapis.com:80/forecastrss?u=c&p=#{CGI.escape(@query.preferred)}",
108
+ :string => File.read(File.join(File.dirname(__FILE__),
109
+ 'fixtures',
110
+ 'yahoo_90210.xml')
111
+ )
112
+ )
113
+ end
114
+
115
+ describe "all" do
116
+
117
+ it "responds to _measure" do
118
+ Barometer::Yahoo.respond_to?("_measure").should be_true
119
+ end
120
+
121
+ it "requires a Barometer::Measurement object" do
122
+ lambda { Barometer::Yahoo._measure(nil, @query) }.should raise_error(ArgumentError)
123
+ lambda { Barometer::Yahoo._measure("invlaid", @query) }.should raise_error(ArgumentError)
124
+
125
+ lambda { Barometer::Yahoo._measure(@measurement, @query) }.should_not raise_error(ArgumentError)
126
+ end
127
+
128
+ it "requires a Barometer::Query query" do
129
+ lambda { Barometer::Yahoo._measure }.should raise_error(ArgumentError)
130
+ lambda { Barometer::Yahoo._measure(@measurement, 1) }.should raise_error(ArgumentError)
131
+
132
+ lambda { Barometer::Yahoo._measure(@measurement, @query) }.should_not raise_error(ArgumentError)
133
+ end
134
+
135
+ it "returns a Barometer::Measurement object" do
136
+ result = Barometer::Yahoo._measure(@measurement, @query)
137
+ result.is_a?(Barometer::Measurement).should be_true
138
+ result.current.is_a?(Barometer::CurrentMeasurement).should be_true
139
+ result.forecast.is_a?(Array).should be_true
140
+
141
+ result.source.should == :yahoo
142
+ end
143
+
144
+ end
145
+
146
+ end
147
+
148
+ describe "when answering the simple questions," do
149
+
150
+ before(:each) do
151
+ @measurement = Barometer::Measurement.new
152
+ end
153
+
154
+ describe "currently_wet_by_icon?" do
155
+
156
+ before(:each) do
157
+ @measurement.current = Barometer::CurrentMeasurement.new
158
+ end
159
+
160
+ it "returns true if matching icon code" do
161
+ @measurement.current.icon = "4"
162
+ @measurement.current.icon?.should be_true
163
+ Barometer::Yahoo.currently_wet_by_icon?(@measurement.current).should be_true
164
+ end
165
+
166
+ it "returns false if NO matching icon code" do
167
+ @measurement.current.icon = "32"
168
+ @measurement.current.icon?.should be_true
169
+ Barometer::Yahoo.currently_wet_by_icon?(@measurement.current).should be_false
170
+ end
171
+
172
+ end
173
+
174
+ describe "forecasted_wet_by_icon?" do
175
+
176
+ before(:each) do
177
+ @measurement.forecast = [Barometer::ForecastMeasurement.new]
178
+ @measurement.forecast.first.date = Date.today
179
+ @measurement.forecast.size.should == 1
180
+ end
181
+
182
+ it "returns true if matching icon code" do
183
+ @measurement.forecast.first.icon = "4"
184
+ @measurement.forecast.first.icon?.should be_true
185
+ Barometer::Yahoo.forecasted_wet_by_icon?(@measurement.forecast.first).should be_true
186
+ end
187
+
188
+ it "returns false if NO matching icon code" do
189
+ @measurement.forecast.first.icon = "32"
190
+ @measurement.forecast.first.icon?.should be_true
191
+ Barometer::Yahoo.forecasted_wet_by_icon?(@measurement.forecast.first).should be_false
192
+ end
193
+
194
+ end
195
+
196
+ describe "currently_sunny_by_icon?" do
197
+
198
+ before(:each) do
199
+ @measurement.current = Barometer::CurrentMeasurement.new
200
+ end
201
+
202
+ it "returns true if matching icon code" do
203
+ @measurement.current.icon = "32"
204
+ @measurement.current.icon?.should be_true
205
+ Barometer::Yahoo.currently_sunny_by_icon?(@measurement.current).should be_true
206
+ end
207
+
208
+ it "returns false if NO matching icon code" do
209
+ @measurement.current.icon = "4"
210
+ @measurement.current.icon?.should be_true
211
+ Barometer::Yahoo.currently_sunny_by_icon?(@measurement.current).should be_false
212
+ end
213
+
214
+ end
215
+
216
+ describe "forecasted_sunny_by_icon?" do
217
+
218
+ before(:each) do
219
+ @measurement.forecast = [Barometer::ForecastMeasurement.new]
220
+ @measurement.forecast.first.date = Date.today
221
+ @measurement.forecast.size.should == 1
222
+ end
223
+
224
+ it "returns true if matching icon code" do
225
+ @measurement.forecast.first.icon = "32"
226
+ @measurement.forecast.first.icon?.should be_true
227
+ Barometer::Yahoo.forecasted_sunny_by_icon?(@measurement.forecast.first).should be_true
228
+ end
229
+
230
+ it "returns false if NO matching icon code" do
231
+ @measurement.forecast.first.icon = "4"
232
+ @measurement.forecast.first.icon?.should be_true
233
+ Barometer::Yahoo.forecasted_sunny_by_icon?(@measurement.forecast.first).should be_false
234
+ end
235
+
236
+ end
237
+
238
+ end
239
+
240
+ describe "overall data correctness" do
241
+
242
+ before(:each) do
243
+ @query = Barometer::Query.new("90210")
244
+ @query.preferred = "90210"
245
+ @measurement = Barometer::Measurement.new
246
+
247
+ FakeWeb.register_uri(:get,
248
+ "http://weather.yahooapis.com:80/forecastrss?u=c&p=#{CGI.escape(@query.preferred)}",
249
+ :string => File.read(File.join(File.dirname(__FILE__),
250
+ 'fixtures',
251
+ 'yahoo_90210.xml')
252
+ )
253
+ )
254
+ end
255
+
256
+ # TODO: complete this
257
+ it "should correctly build the data" do
258
+ result = Barometer::Yahoo._measure(@measurement, @query)
259
+
260
+ sun_rise = Barometer::Zone.merge("6:09 am", "Sun, 26 Apr 2009 10:51 am PDT", "PDT")
261
+ sun_set = Barometer::Zone.merge("7:34 pm", "Sun, 26 Apr 2009 10:51 am PDT", "PDT")
262
+
263
+ # build current
264
+ @measurement.current.sun.rise.should == sun_rise
265
+ @measurement.current.sun.set.should == sun_set
266
+
267
+ # builds location
268
+ @measurement.location.city.should == "Beverly Hills"
269
+
270
+ # builds forecasts
271
+ @measurement.forecast.size.should == 2
272
+
273
+ @measurement.forecast[0].condition.should == "Mostly Sunny"
274
+ @measurement.forecast[0].icon.should == "34"
275
+ @measurement.forecast[0].sun.rise.should == sun_rise + (60*60*24*0)
276
+ @measurement.forecast[0].sun.set.should == sun_set + (60*60*24*0)
277
+
278
+ @measurement.forecast[1].condition.should == "Cloudy"
279
+ @measurement.forecast[1].icon.should == "26"
280
+ @measurement.forecast[1].sun.rise.should == sun_rise + (60*60*24*1)
281
+ @measurement.forecast[1].sun.set.should == sun_set + (60*60*24*1)
282
+
283
+ end
284
+ # <yweather:location city="Beverly Hills" region="CA" country="US"/>
285
+ # <yweather:units temperature="C" distance="km" pressure="mb" speed="kph"/>
286
+ # <yweather:wind chill="17" direction="0" speed="4.83" />
287
+ # <yweather:atmosphere humidity="50" visibility="16.09" pressure="1017" rising="0" />
288
+ # <item>
289
+ # <geo:lat>34.08</geo:lat>
290
+ # <geo:long>-118.4</geo:long>
291
+ # <pubDate>Sun, 26 Apr 2009 10:51 am PDT</pubDate>
292
+ # <yweather:condition text="Partly Cloudy" code="30" temp="17" date="Sun, 26 Apr 2009 10:51 am PDT" />
293
+ # <yweather:forecast day="Sun" date="26 Apr 2009" low="11" high="19"
294
+ # <yweather:forecast day="Mon" date="27 Apr 2009" low="11" high="18"
295
+ # </item>
296
+
297
+ end
298
+
299
+ end
@@ -0,0 +1,1106 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Services" do
4
+
5
+ before(:each) do
6
+ query_term = "Calgary,AB"
7
+ @query = Barometer::Query.new(query_term)
8
+ @service = Barometer::Service.source(:wunderground)
9
+ @time = Time.now
10
+ FakeWeb.register_uri(:get,
11
+ "http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=#{query_term}",
12
+ :string => File.read(File.join(File.dirname(__FILE__),
13
+ 'fixtures',
14
+ 'current_calgary_ab.xml')
15
+ )
16
+ )
17
+ FakeWeb.register_uri(:get,
18
+ "http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=#{query_term}",
19
+ :string => File.read(File.join(File.dirname(__FILE__),
20
+ 'fixtures',
21
+ 'forecast_calgary_ab.xml')
22
+ )
23
+ )
24
+ end
25
+
26
+ describe "and the class method" do
27
+
28
+ describe "source" do
29
+
30
+ it "responds" do
31
+ Barometer::Service.respond_to?("source").should be_true
32
+ end
33
+
34
+ it "requires a Symbol or String" do
35
+ lambda { Barometer::Service.source }.should raise_error(ArgumentError)
36
+ lambda { Barometer::Service.source(1) }.should raise_error(ArgumentError)
37
+
38
+ lambda { Barometer::Service.source("wunderground") }.should_not raise_error(ArgumentError)
39
+ lambda { Barometer::Service.source(:wunderground) }.should_not raise_error(ArgumentError)
40
+ end
41
+
42
+ it "raises an error if source doesn't exist" do
43
+ lambda { Barometer::Service.source(:not_valid) }.should raise_error(ArgumentError)
44
+ lambda { Barometer::Service.source(:wunderground) }.should_not raise_error(ArgumentError)
45
+ end
46
+
47
+ it "returns the corresponding Service object" do
48
+ Barometer::Service.source(:wunderground).should == Barometer::Wunderground
49
+ Barometer::Service.source(:wunderground).superclass.should == Barometer::Service
50
+ end
51
+
52
+ it "raises an error when retrieving the wrong class" do
53
+ lambda { Barometer::Service.source(:temperature) }.should raise_error(ArgumentError)
54
+ end
55
+
56
+ end
57
+
58
+ end
59
+
60
+ describe "when initialized" do
61
+
62
+ before(:each) do
63
+ @service = Barometer::Service.new
64
+ end
65
+
66
+ it "stubs _measure" do
67
+ lambda { Barometer::Service._measure }.should raise_error(NotImplementedError)
68
+ end
69
+
70
+ it "stubs accepted_formats" do
71
+ lambda { Barometer::Service.accepted_formats }.should raise_error(NotImplementedError)
72
+ end
73
+
74
+ it "defaults meets_requirements?" do
75
+ Barometer::Service.meets_requirements?.should be_true
76
+ end
77
+
78
+ it "defaults supports_country?" do
79
+ Barometer::Service.supports_country?.should be_true
80
+ end
81
+
82
+ it "defaults requires_keys?" do
83
+ Barometer::Service.requires_keys?.should be_false
84
+ end
85
+
86
+ it "defaults has_keys?" do
87
+ lambda { Barometer::Service.has_keys? }.should raise_error(NotImplementedError)
88
+ end
89
+
90
+ end
91
+
92
+ describe "when measuring," do
93
+
94
+ it "responds to measure" do
95
+ Barometer::Service.respond_to?("measure").should be_true
96
+ end
97
+
98
+ # since Barometer::Service defines the measure method, you could actuall just
99
+ # call Barometer::Service.measure ... but this will not invoke a specific
100
+ # weather API driver. Make sure this usage raises an error.
101
+ it "requires an actuall driver" do
102
+ lambda { Barometer::Service.measure(@query) }.should raise_error(NotImplementedError)
103
+ end
104
+
105
+ it "requires a Barometer::Query object" do
106
+ lambda { Barometer::Service.measure("invalid") }.should raise_error(ArgumentError)
107
+ @query.is_a?(Barometer::Query).should be_true
108
+ lambda { Barometer::Service.measure(@query) }.should_not raise_error(ArgumentError)
109
+ end
110
+
111
+ it "returns a Barometer::Measurement object" do
112
+ @service.measure(@query).is_a?(Barometer::Measurement).should be_true
113
+ end
114
+
115
+ it "returns current and future" do
116
+ measurement = @service.measure(@query)
117
+ measurement.current.is_a?(Barometer::CurrentMeasurement).should be_true
118
+ measurement.forecast.is_a?(Array).should be_true
119
+ end
120
+
121
+ end
122
+
123
+ describe "when answering the simple questions," do
124
+
125
+ before(:each) do
126
+ # the function being tested was monkey patched in an earlier test
127
+ # so the original file must be reloaded
128
+ load 'lib/barometer/services/service.rb'
129
+
130
+ @measurement = Barometer::Measurement.new
131
+ end
132
+
133
+ describe "windy?" do
134
+
135
+ it "requires a measurement object" do
136
+ lambda { Barometer::Service.windy? }.should raise_error(ArgumentError)
137
+ lambda { Barometer::Service.windy?("a") }.should raise_error(ArgumentError)
138
+ lambda { Barometer::Service.windy?(@measurement) }.should_not raise_error(ArgumentError)
139
+ end
140
+
141
+ it "requires threshold as a number" do
142
+ lambda { Barometer::Service.windy?(@measurement,"a") }.should raise_error(ArgumentError)
143
+ lambda { Barometer::Service.windy?(@measurement,1) }.should_not raise_error(ArgumentError)
144
+ lambda { Barometer::Service.windy?(@measurement,1.1) }.should_not raise_error(ArgumentError)
145
+ end
146
+
147
+ it "requires time as a Time object" do
148
+ lambda { Barometer::Service.windy?(@measurement,1,"a") }.should raise_error(ArgumentError)
149
+ lambda { Barometer::Service.windy?(@measurement,1,Time.now.utc) }.should_not raise_error(ArgumentError)
150
+ end
151
+
152
+ it "stubs forecasted_windy?" do
153
+ Barometer::Service.forecasted_windy?(@measurement,nil,nil).should be_nil
154
+ end
155
+
156
+ describe "and is current" do
157
+
158
+ before(:each) do
159
+ module Barometer; class Measurement
160
+ def current?(a=nil); true; end
161
+ end; end
162
+ end
163
+
164
+ it "returns nil" do
165
+ Barometer::Service.windy?(@measurement).should be_nil
166
+ end
167
+
168
+ it "returns true if currently_windy?" do
169
+ module Barometer; class Service
170
+ def self.currently_windy?(a=nil,b=nil); true; end
171
+ end; end
172
+ Barometer::Service.windy?(@measurement).should be_true
173
+ end
174
+
175
+ it "returns false if !currently_windy?" do
176
+ module Barometer; class Service
177
+ def self.currently_windy?(a=nil,b=nil); false; end
178
+ end; end
179
+ Barometer::Service.windy?(@measurement).should be_false
180
+ end
181
+
182
+ end
183
+
184
+ describe "and is NOT current" do
185
+
186
+ before(:each) do
187
+ module Barometer; class Measurement
188
+ def current?(a=nil); false; end
189
+ end; end
190
+ end
191
+
192
+ it "returns nil" do
193
+ Barometer::Service.windy?(@measurement).should be_nil
194
+ end
195
+
196
+ it "returns true if forecasted_windy?" do
197
+ module Barometer; class Service
198
+ def self.forecasted_windy?(a=nil,b=nil,c=nil); true; end
199
+ end; end
200
+ Barometer::Service.windy?(@measurement).should be_true
201
+ end
202
+
203
+ it "returns false if !forecasted_windy?" do
204
+ module Barometer; class Service
205
+ def self.forecasted_windy?(a=nil,b=nil,c=nil); false; end
206
+ end; end
207
+ Barometer::Service.windy?(@measurement).should be_false
208
+ end
209
+
210
+ end
211
+
212
+ end
213
+
214
+ describe "currently_windy?" do
215
+
216
+ before(:each) do
217
+ # the function being tested was monkey patched in an earlier test
218
+ # so the original file must be reloaded
219
+ load 'lib/barometer/services/service.rb'
220
+
221
+ @measurement = Barometer::Measurement.new
222
+ @threshold = 10
223
+ end
224
+
225
+ it "requires a measurement object" do
226
+ lambda { Barometer::Service.currently_windy? }.should raise_error(ArgumentError)
227
+ lambda { Barometer::Service.currently_windy?("a") }.should raise_error(ArgumentError)
228
+ lambda { Barometer::Service.currently_windy?(@measurement) }.should_not raise_error(ArgumentError)
229
+ end
230
+
231
+ it "requires threshold as a number" do
232
+ lambda { Barometer::Service.currently_windy?(@measurement,"a") }.should raise_error(ArgumentError)
233
+ lambda { Barometer::Service.currently_windy?(@measurement,1) }.should_not raise_error(ArgumentError)
234
+ lambda { Barometer::Service.currently_windy?(@measurement,1.1) }.should_not raise_error(ArgumentError)
235
+ end
236
+
237
+ it "returns nil when value unavailable" do
238
+ measurement = Barometer::Measurement.new
239
+ Barometer::Service.currently_windy?(measurement,@threshold).should be_nil
240
+ measurement.current = Barometer::CurrentMeasurement.new
241
+ Barometer::Service.currently_windy?(measurement,@threshold).should be_nil
242
+ measurement.current.wind = Barometer::Speed.new
243
+ Barometer::Service.currently_windy?(measurement,@threshold).should be_nil
244
+ end
245
+
246
+ describe "when metric" do
247
+
248
+ before(:each) do
249
+ @measurement = Barometer::Measurement.new
250
+ @measurement.current = Barometer::CurrentMeasurement.new
251
+ @measurement.current.wind = Barometer::Speed.new
252
+ @measurement.metric!
253
+ @measurement.metric?.should be_true
254
+ end
255
+
256
+ # measurement.current.wind.kph.to_f
257
+ it "returns true when wind speed (kph) above threshold" do
258
+ @measurement.current.wind.kph = @threshold + 1
259
+ Barometer::Service.currently_windy?(@measurement,@threshold).should be_true
260
+ end
261
+
262
+ it "returns false when wind speed (kph) below threshold" do
263
+ @measurement.current.wind.kph = @threshold - 1
264
+ Barometer::Service.currently_windy?(@measurement,@threshold).should be_false
265
+ end
266
+
267
+ end
268
+
269
+ describe "when imperial" do
270
+
271
+ before(:each) do
272
+ @measurement = Barometer::Measurement.new
273
+ @measurement.current = Barometer::CurrentMeasurement.new
274
+ @measurement.current.wind = Barometer::Speed.new
275
+ @measurement.imperial!
276
+ @measurement.metric?.should be_false
277
+ end
278
+
279
+ it "returns true when wind speed (mph) above threshold" do
280
+ @measurement.current.wind.mph = @threshold - 1
281
+ Barometer::Service.currently_windy?(@measurement,@threshold).should be_false
282
+ end
283
+
284
+ it "returns false when wind speed (mph) below threshold" do
285
+ @measurement.current.wind.mph = @threshold - 1
286
+ Barometer::Service.currently_windy?(@measurement,@threshold).should be_false
287
+ end
288
+
289
+ end
290
+
291
+ end
292
+
293
+ describe "wet?" do
294
+
295
+ it "requires a measurement object" do
296
+ lambda { Barometer::Service.wet? }.should raise_error(ArgumentError)
297
+ lambda { Barometer::Service.wet?("a") }.should raise_error(ArgumentError)
298
+ lambda { Barometer::Service.wet?(@measurement) }.should_not raise_error(ArgumentError)
299
+ end
300
+
301
+ it "requires threshold as a number" do
302
+ lambda { Barometer::Service.wet?(@measurement,"a") }.should raise_error(ArgumentError)
303
+ lambda { Barometer::Service.wet?(@measurement,1) }.should_not raise_error(ArgumentError)
304
+ lambda { Barometer::Service.wet?(@measurement,1.1) }.should_not raise_error(ArgumentError)
305
+ end
306
+
307
+ it "requires time as a Time object" do
308
+ lambda { Barometer::Service.wet?(@measurement,1,"a") }.should raise_error(ArgumentError)
309
+ lambda { Barometer::Service.wet?(@measurement,1,Time.now.utc) }.should_not raise_error(ArgumentError)
310
+ end
311
+
312
+ describe "and is current" do
313
+
314
+ before(:each) do
315
+ module Barometer; class Measurement
316
+ def current?(a=nil); true; end
317
+ end; end
318
+ end
319
+
320
+ it "returns nil" do
321
+ Barometer::Service.wet?(@measurement).should be_nil
322
+ end
323
+
324
+ it "returns true if currently_wet?" do
325
+ module Barometer; class Service
326
+ def self.currently_wet?(a=nil,b=nil); true; end
327
+ end; end
328
+ Barometer::Service.wet?(@measurement).should be_true
329
+ end
330
+
331
+ it "returns false if !currently_wet?" do
332
+ module Barometer; class Service
333
+ def self.currently_wet?(a=nil,b=nil); false; end
334
+ end; end
335
+ Barometer::Service.wet?(@measurement).should be_false
336
+ end
337
+
338
+ end
339
+
340
+ describe "and is NOT current" do
341
+
342
+ before(:each) do
343
+ module Barometer; class Measurement
344
+ def current?(a=nil); false; end
345
+ end; end
346
+ end
347
+
348
+ it "returns nil" do
349
+ Barometer::Service.wet?(@measurement).should be_nil
350
+ end
351
+
352
+ it "returns true if forecasted_wet?" do
353
+ module Barometer; class Service
354
+ def self.forecasted_wet?(a=nil,b=nil,c=nil); true; end
355
+ end; end
356
+ Barometer::Service.wet?(@measurement).should be_true
357
+ end
358
+
359
+ it "returns false if !forecasted_wet?" do
360
+ module Barometer; class Service
361
+ def self.forecasted_wet?(a=nil,b=nil,c=nil); false; end
362
+ end; end
363
+ Barometer::Service.wet?(@measurement).should be_false
364
+ end
365
+
366
+ end
367
+
368
+ end
369
+
370
+ describe "currently_wet?" do
371
+
372
+ before(:each) do
373
+ # the function being tested was monkey patched in an earlier test
374
+ # so the original file must be reloaded
375
+ load 'lib/barometer/services/service.rb'
376
+
377
+ @measurement = Barometer::Measurement.new
378
+ @threshold = 10
379
+ @temperature = 15
380
+ end
381
+
382
+ it "requires a measurement object" do
383
+ lambda { Barometer::Service.currently_wet? }.should raise_error(ArgumentError)
384
+ lambda { Barometer::Service.currently_wet?("a") }.should raise_error(ArgumentError)
385
+ lambda { Barometer::Service.currently_wet?(@measurement) }.should_not raise_error(ArgumentError)
386
+ end
387
+
388
+ it "requires threshold as a number" do
389
+ lambda { Barometer::Service.currently_wet?(@measurement,"a") }.should raise_error(ArgumentError)
390
+ lambda { Barometer::Service.currently_wet?(@measurement,1) }.should_not raise_error(ArgumentError)
391
+ lambda { Barometer::Service.currently_wet?(@measurement,1.1) }.should_not raise_error(ArgumentError)
392
+ end
393
+
394
+ it "returns nil when value unavailable" do
395
+ measurement = Barometer::Measurement.new
396
+ Barometer::Service.currently_wet?(measurement,@threshold).should be_nil
397
+ measurement.current = Barometer::CurrentMeasurement.new
398
+ Barometer::Service.currently_wet?(measurement,@threshold).should be_nil
399
+ measurement.current.wind = Barometer::Speed.new
400
+ Barometer::Service.currently_wet?(measurement,@threshold).should be_nil
401
+ end
402
+
403
+ describe "currently_wet_by_icon?" do
404
+
405
+ before(:each) do
406
+ @measurement.current = Barometer::CurrentMeasurement.new
407
+ end
408
+
409
+ it "requires a Barometer::Measurement object" do
410
+ lambda { Barometer::Service.currently_wet_by_icon?(nil) }.should raise_error(ArgumentError)
411
+ lambda { Barometer::Service.currently_wet_by_icon?("invlaid") }.should raise_error(ArgumentError)
412
+
413
+ lambda { Barometer::Service.currently_wet_by_icon?(@measurement.current) }.should_not raise_error(ArgumentError)
414
+ end
415
+
416
+ it "returns nil if no icon" do
417
+ @measurement.current.icon?.should be_false
418
+ Barometer::Service.currently_wet_by_icon?(@measurement.current).should be_nil
419
+ end
420
+
421
+ it "returns true if matching icon code" do
422
+ module Barometer; class Service; def self.wet_icon_codes
423
+ ["rain"]
424
+ end; end; end
425
+ @measurement.current.icon = "rain"
426
+ @measurement.current.icon?.should be_true
427
+ Barometer::Service.currently_wet_by_icon?(@measurement.current).should be_true
428
+ end
429
+
430
+ it "returns false if NO matching icon code" do
431
+ module Barometer; class Service; def self.wet_icon_codes
432
+ ["rain"]
433
+ end; end; end
434
+ @measurement.current.icon = "sunny"
435
+ @measurement.current.icon?.should be_true
436
+ Barometer::Service.currently_wet_by_icon?(@measurement.current).should be_false
437
+ end
438
+
439
+ end
440
+
441
+ describe "and currently_wet_by_dewpoint?" do
442
+
443
+ describe "when metric" do
444
+
445
+ before(:each) do
446
+ @measurement = Barometer::Measurement.new
447
+ @measurement.current = Barometer::CurrentMeasurement.new
448
+ @measurement.current.temperature = Barometer::Temperature.new
449
+ @measurement.current.dew_point = Barometer::Temperature.new
450
+ @measurement.metric!
451
+ @measurement.metric?.should be_true
452
+ end
453
+
454
+ it "returns true when temperature < dew_point" do
455
+ @measurement.current.temperature.c = @temperature
456
+ @measurement.current.dew_point.c = @temperature + 1
457
+ Barometer::Service.currently_wet_by_dewpoint?(@measurement).should be_true
458
+ end
459
+
460
+ it "returns false when temperature > dew_point" do
461
+ @measurement.current.temperature.c = @temperature
462
+ @measurement.current.dew_point.c = @temperature - 1
463
+ Barometer::Service.currently_wet_by_dewpoint?(@measurement).should be_false
464
+ end
465
+
466
+ end
467
+
468
+ describe "when imperial" do
469
+
470
+ before(:each) do
471
+ @measurement = Barometer::Measurement.new
472
+ @measurement.current = Barometer::CurrentMeasurement.new
473
+ @measurement.current.temperature = Barometer::Temperature.new
474
+ @measurement.current.dew_point = Barometer::Temperature.new
475
+ @measurement.imperial!
476
+ @measurement.metric?.should be_false
477
+ end
478
+
479
+ it "returns true when temperature < dew_point" do
480
+ @measurement.current.temperature.f = @temperature
481
+ @measurement.current.dew_point.f = @temperature + 1
482
+ Barometer::Service.currently_wet_by_dewpoint?(@measurement).should be_true
483
+ end
484
+
485
+ it "returns false when temperature > dew_point" do
486
+ @measurement.current.temperature.f = @temperature
487
+ @measurement.current.dew_point.f = @temperature - 1
488
+ Barometer::Service.currently_wet_by_dewpoint?(@measurement).should be_false
489
+ end
490
+
491
+ end
492
+
493
+ end
494
+
495
+ describe "and currently_wet_by_humidity?" do
496
+
497
+ before(:each) do
498
+ @measurement = Barometer::Measurement.new
499
+ @measurement.current = Barometer::CurrentMeasurement.new
500
+ end
501
+
502
+ it "returns true when humidity >= 99%" do
503
+ @measurement.current.humidity = 99
504
+ Barometer::Service.currently_wet_by_humidity?(@measurement.current).should be_true
505
+ @measurement.current.humidity = 100
506
+ Barometer::Service.currently_wet_by_humidity?(@measurement.current).should be_true
507
+ end
508
+
509
+ it "returns false when humidity < 99%" do
510
+ @measurement.current.humidity = 98
511
+ Barometer::Service.currently_wet_by_humidity?(@measurement.current).should be_false
512
+ end
513
+
514
+ end
515
+
516
+ describe "and currently_wet_by_pop?" do
517
+
518
+ before(:each) do
519
+ @measurement = Barometer::Measurement.new
520
+ @measurement.forecast = [Barometer::ForecastMeasurement.new]
521
+ @measurement.forecast.first.date = Date.today
522
+ @measurement.forecast.size.should == 1
523
+ end
524
+
525
+ it "returns true when pop (%) above threshold" do
526
+ @measurement.forecast.first.pop = @threshold + 1
527
+ Barometer::Service.currently_wet_by_pop?(@measurement, @threshold).should be_true
528
+ end
529
+
530
+ it "returns false when pop (%) below threshold" do
531
+ @measurement.forecast.first.pop = @threshold - 1
532
+ Barometer::Service.currently_wet_by_pop?(@measurement, @threshold).should be_false
533
+ end
534
+
535
+ end
536
+
537
+ end
538
+
539
+ describe "forecasted_wet?" do
540
+
541
+ before(:each) do
542
+ # the function being tested was monkey patched in an earlier test
543
+ # so the original file must be reloaded
544
+ load 'lib/barometer/services/service.rb'
545
+
546
+ @measurement = Barometer::Measurement.new
547
+ @threshold = 10
548
+ @temperature = 15
549
+ end
550
+
551
+ it "requires a measurement object" do
552
+ lambda { Barometer::Service.forecasted_wet? }.should raise_error(ArgumentError)
553
+ lambda { Barometer::Service.forecasted_wet?("a") }.should raise_error(ArgumentError)
554
+ lambda { Barometer::Service.forecasted_wet?(@measurement) }.should_not raise_error(ArgumentError)
555
+ end
556
+
557
+ it "requires threshold as a number" do
558
+ lambda { Barometer::Service.forecasted_wet?(@measurement,"a") }.should raise_error(ArgumentError)
559
+ lambda { Barometer::Service.forecasted_wet?(@measurement,1) }.should_not raise_error(ArgumentError)
560
+ lambda { Barometer::Service.forecasted_wet?(@measurement,1.1) }.should_not raise_error(ArgumentError)
561
+ end
562
+
563
+ it "requires utc_time as a Time object" do
564
+ lambda { Barometer::Service.forecasted_wet?(@measurement,1,"string") }.should raise_error(ArgumentError)
565
+ lambda { Barometer::Service.forecasted_wet?(@measurement,1,Time.now.utc) }.should_not raise_error(ArgumentError)
566
+ end
567
+
568
+ it "returns nil when value unavailable" do
569
+ measurement = Barometer::Measurement.new
570
+ Barometer::Service.forecasted_wet?(measurement,@threshold).should be_nil
571
+ measurement.forecast = [Barometer::ForecastMeasurement.new]
572
+ Barometer::Service.forecasted_wet?(measurement,@threshold).should be_nil
573
+ end
574
+
575
+ describe "forecasted_wet_by_icon?" do
576
+
577
+ before(:each) do
578
+ @measurement.forecast = [Barometer::ForecastMeasurement.new]
579
+ @measurement.forecast.first.date = Date.today
580
+ @measurement.forecast.size.should == 1
581
+ end
582
+
583
+ it "requires a Barometer::Measurement object" do
584
+ lambda { Barometer::Service.forecasted_wet_by_icon?(nil) }.should raise_error(ArgumentError)
585
+ lambda { Barometer::Service.forecasted_wet_by_icon?("invlaid") }.should raise_error(ArgumentError)
586
+
587
+ lambda { Barometer::Service.forecasted_wet_by_icon?(@measurement.forecast.first) }.should_not raise_error(ArgumentError)
588
+ end
589
+
590
+ it "returns nil if no icon" do
591
+ @measurement.forecast.first.icon?.should be_false
592
+ Barometer::Service.forecasted_wet_by_icon?(@measurement.forecast.first).should be_nil
593
+ end
594
+
595
+ it "returns true if matching icon code" do
596
+ module Barometer; class Service; def self.wet_icon_codes
597
+ ["rain"]
598
+ end; end; end
599
+ @measurement.forecast.first.icon = "rain"
600
+ @measurement.forecast.first.icon?.should be_true
601
+ Barometer::Service.forecasted_wet_by_icon?(@measurement.forecast.first).should be_true
602
+ end
603
+
604
+ it "returns false if NO matching icon code" do
605
+ module Barometer; class Service; def self.wet_icon_codes
606
+ ["rain"]
607
+ end; end; end
608
+ @measurement.forecast.first.icon = "sunny"
609
+ @measurement.forecast.first.icon?.should be_true
610
+ Barometer::Service.forecasted_wet_by_icon?(@measurement.forecast.first).should be_false
611
+ end
612
+
613
+ after(:each) do
614
+ # the function being tested was monkey patched in an earlier test
615
+ # so the original file must be reloaded
616
+ load 'lib/barometer/services/service.rb'
617
+ end
618
+
619
+ end
620
+
621
+ describe "and forecasted_wet_by_pop?" do
622
+
623
+ before(:each) do
624
+ @measurement = Barometer::Measurement.new
625
+ @measurement.forecast = [Barometer::ForecastMeasurement.new]
626
+ @measurement.forecast.first.date = Date.today
627
+ @measurement.forecast.size.should == 1
628
+ end
629
+
630
+ it "returns true when pop (%) above threshold" do
631
+ @measurement.forecast.first.pop = @threshold + 1
632
+ Barometer::Service.forecasted_wet_by_pop?(@measurement.forecast.first, @threshold).should be_true
633
+ end
634
+
635
+ it "returns false when pop (%) below threshold" do
636
+ @measurement.forecast.first.pop = @threshold - 1
637
+ Barometer::Service.forecasted_wet_by_pop?(@measurement.forecast.first, @threshold).should be_false
638
+ end
639
+
640
+ end
641
+
642
+ end
643
+
644
+ describe "day?" do
645
+
646
+ it "requires a measurement object" do
647
+ lambda { Barometer::Service.day? }.should raise_error(ArgumentError)
648
+ lambda { Barometer::Service.day?("a") }.should raise_error(ArgumentError)
649
+ lambda { Barometer::Service.day?(@measurement) }.should_not raise_error(ArgumentError)
650
+ end
651
+
652
+ it "requires time as a Time object" do
653
+ lambda { Barometer::Service.day?(@measurement,"a") }.should raise_error(ArgumentError)
654
+ lambda { Barometer::Service.day?(@measurement,Time.now.utc) }.should_not raise_error(ArgumentError)
655
+ end
656
+
657
+ describe "and is current" do
658
+
659
+ before(:each) do
660
+ module Barometer; class Measurement
661
+ def current?(a=nil); true; end
662
+ end; end
663
+ end
664
+
665
+ it "returns nil" do
666
+ Barometer::Service.day?(@measurement).should be_nil
667
+ end
668
+
669
+ it "returns true if currently_day?" do
670
+ module Barometer; class Service
671
+ def self.currently_day?(a=nil); true; end
672
+ end; end
673
+ Barometer::Service.day?(@measurement).should be_true
674
+ end
675
+
676
+ it "returns false if !currently_day?" do
677
+ module Barometer; class Service
678
+ def self.currently_day?(a=nil); false; end
679
+ end; end
680
+ Barometer::Service.day?(@measurement).should be_false
681
+ end
682
+
683
+ end
684
+
685
+ describe "and is NOT current" do
686
+
687
+ before(:each) do
688
+ module Barometer; class Measurement
689
+ def current?(a=nil); false; end
690
+ end; end
691
+ end
692
+
693
+ it "returns nil" do
694
+ Barometer::Service.day?(@measurement).should be_nil
695
+ end
696
+
697
+ it "returns true if forecasted_day?" do
698
+ module Barometer; class Service
699
+ def self.forecasted_day?(a=nil,b=nil); true; end
700
+ end; end
701
+ Barometer::Service.day?(@measurement).should be_true
702
+ end
703
+
704
+ it "returns false if !forecasted_day?" do
705
+ module Barometer; class Service
706
+ def self.forecasted_day?(a=nil,b=nil); false; end
707
+ end; end
708
+ Barometer::Service.day?(@measurement).should be_false
709
+ end
710
+
711
+ end
712
+
713
+ end
714
+
715
+ describe "currently_day?" do
716
+
717
+ before(:each) do
718
+ # the function being tested was monkey patched in an earlier test
719
+ # so the original file must be reloaded
720
+ load 'lib/barometer/services/service.rb'
721
+
722
+ @measurement = Barometer::Measurement.new
723
+ end
724
+
725
+ it "requires a measurement object" do
726
+ lambda { Barometer::Service.currently_day? }.should raise_error(ArgumentError)
727
+ lambda { Barometer::Service.currently_day?("a") }.should raise_error(ArgumentError)
728
+ lambda { Barometer::Service.currently_day?(@measurement) }.should_not raise_error(ArgumentError)
729
+ end
730
+
731
+ it "returns nil when value unavailable" do
732
+ measurement = Barometer::Measurement.new
733
+ Barometer::Service.currently_day?(measurement).should be_nil
734
+ end
735
+
736
+ describe "and currently_after_sunrise?" do
737
+
738
+ before(:each) do
739
+ @measurement = Barometer::CurrentMeasurement.new
740
+ end
741
+
742
+ it "returns true when now is past sun_rise" do
743
+ @measurement.sun = Barometer::Sun.new(Time.now.utc - (60*60))
744
+ Barometer::Service.currently_after_sunrise?(@measurement).should be_true
745
+ end
746
+
747
+ it "returns false when now if before sun_rise" do
748
+ @measurement.sun = Barometer::Sun.new(Time.now.utc + (60*60))
749
+ Barometer::Service.currently_after_sunrise?(@measurement).should be_false
750
+ end
751
+
752
+ end
753
+
754
+ describe "and currently_before_sunset?" do
755
+
756
+ before(:each) do
757
+ @measurement = Barometer::CurrentMeasurement.new
758
+ end
759
+
760
+ it "returns true when now is before sun_set" do
761
+ @measurement.sun = Barometer::Sun.new(nil,Time.now.utc + (60*60))
762
+ Barometer::Service.currently_before_sunset?(@measurement).should be_true
763
+ end
764
+
765
+ it "returns false when now if after sun_set" do
766
+ @measurement.sun = Barometer::Sun.new(nil,Time.now.utc - (60*60))
767
+ Barometer::Service.currently_before_sunset?(@measurement).should be_false
768
+ end
769
+
770
+ end
771
+
772
+ end
773
+
774
+ describe "forecasted_day?" do
775
+
776
+ before(:each) do
777
+ # the function being tested was monkey patched in an earlier test
778
+ # so the original file must be reloaded
779
+ load 'lib/barometer/services/service.rb'
780
+
781
+ @measurement = Barometer::Measurement.new
782
+ end
783
+
784
+ it "requires a measurement object" do
785
+ lambda { Barometer::Service.forecasted_day? }.should raise_error(ArgumentError)
786
+ lambda { Barometer::Service.forecasted_day?("a") }.should raise_error(ArgumentError)
787
+ lambda { Barometer::Service.forecasted_day?(@measurement) }.should_not raise_error(ArgumentError)
788
+ end
789
+
790
+ it "requires time as a Time object" do
791
+ lambda { Barometer::Service.forecasted_day?(@measurement,"a") }.should raise_error(ArgumentError)
792
+ lambda { Barometer::Service.forecasted_day?(@measurement,Time.now.utc) }.should_not raise_error(ArgumentError)
793
+ end
794
+
795
+ it "returns nil when value unavailable" do
796
+ measurement = Barometer::Measurement.new
797
+ Barometer::Service.forecasted_day?(measurement).should be_nil
798
+ end
799
+
800
+ describe "and forecasted_after_sunrise?" do
801
+
802
+ before(:each) do
803
+ @measurement = Barometer::ForecastMeasurement.new
804
+ end
805
+
806
+ it "returns true when now is past sun_rise" do
807
+ one_day_from_now = Time.now.utc + (60*60*24)
808
+ @measurement.date = Date.parse(one_day_from_now.strftime("%d %B %Y"))
809
+ @measurement.sun = Barometer::Sun.new(one_day_from_now - (60*60))
810
+ Barometer::Service.forecasted_after_sunrise?(@measurement, one_day_from_now).should be_true
811
+ end
812
+
813
+ it "returns false when now if before sun_rise" do
814
+ one_day_from_now = Time.now.utc + (60*60*24)
815
+ @measurement.date = Date.parse(one_day_from_now.strftime("%d %B %Y"))
816
+ @measurement.sun = Barometer::Sun.new(one_day_from_now + (60*60))
817
+ Barometer::Service.forecasted_after_sunrise?(@measurement, one_day_from_now).should be_false
818
+ end
819
+
820
+ end
821
+
822
+ describe "and forecasted_before_sunset?" do
823
+
824
+ before(:each) do
825
+ @measurement = Barometer::ForecastMeasurement.new
826
+ end
827
+
828
+ it "returns true when now is before sun_set" do
829
+ one_day_from_now = Time.now.utc + (60*60*24)
830
+ @measurement.date = Date.parse(one_day_from_now.strftime("%d %B %Y"))
831
+ @measurement.sun = Barometer::Sun.new(nil,one_day_from_now + (60*60))
832
+ Barometer::Service.forecasted_before_sunset?(@measurement,one_day_from_now).should be_true
833
+ end
834
+
835
+ it "returns false when now if after sun_set" do
836
+ one_day_from_now = Time.now.utc + (60*60*24)
837
+ @measurement.date = Date.parse(one_day_from_now.strftime("%d %B %Y"))
838
+ @measurement.sun = Barometer::Sun.new(nil,one_day_from_now - (60*60))
839
+ Barometer::Service.forecasted_before_sunset?(@measurement,one_day_from_now).should be_false
840
+ end
841
+
842
+ end
843
+
844
+ end
845
+
846
+ describe "sunny?" do
847
+
848
+ it "requires a measurement object" do
849
+ lambda { Barometer::Service.sunny? }.should raise_error(ArgumentError)
850
+ lambda { Barometer::Service.sunny?("a") }.should raise_error(ArgumentError)
851
+ lambda { Barometer::Service.sunny?(@measurement) }.should_not raise_error(ArgumentError)
852
+ end
853
+
854
+ it "requires time as a Time object" do
855
+ lambda { Barometer::Service.sunny?(@measurement,"a") }.should raise_error(ArgumentError)
856
+ lambda { Barometer::Service.sunny?(@measurement,Time.now.utc) }.should_not raise_error(ArgumentError)
857
+ end
858
+
859
+ it "returns false if night time"
860
+ # do
861
+ # @measurement.forecast = [Barometer::ForecastMeasurement.new]
862
+ # @measurement.forecast.size.should == 1
863
+ # @measurement.forecast[0].date = Date.today
864
+ # module Barometer; class Service; def self.day?(a=nil, b=nil)
865
+ # true
866
+ # end; end; end
867
+ # Barometer::Service.forecasted_sunny?(@measurement).should be_true
868
+ # module Barometer; class Service; def self.day?(a=nil, b=nil)
869
+ # false
870
+ # end; end; end
871
+ # Barometer::Service.forecasted_sunny?(@measurement).should be_false
872
+ # end
873
+
874
+ describe "and is current" do
875
+
876
+ before(:each) do
877
+ module Barometer; class Measurement
878
+ def current?(a=nil); true; end
879
+ end; end
880
+ end
881
+
882
+ it "returns nil" do
883
+ Barometer::Service.sunny?(@measurement).should be_nil
884
+ end
885
+
886
+ it "returns true if currently_sunny?" do
887
+ module Barometer; class Service
888
+ def self.currently_sunny?(a=nil); true; end
889
+ end; end
890
+ Barometer::Service.sunny?(@measurement).should be_true
891
+ end
892
+
893
+ it "returns false if !currently_sunny?" do
894
+ module Barometer; class Service
895
+ def self.currently_sunny?(a=nil); false; end
896
+ end; end
897
+ Barometer::Service.sunny?(@measurement).should be_false
898
+ end
899
+
900
+ end
901
+
902
+ describe "and is NOT current" do
903
+
904
+ before(:each) do
905
+ module Barometer; class Measurement
906
+ def current?(a=nil); false; end
907
+ end; end
908
+ end
909
+
910
+ it "returns nil" do
911
+ Barometer::Service.sunny?(@measurement).should be_nil
912
+ end
913
+
914
+ it "returns true if forecasted_sunny?" do
915
+ module Barometer; class Service
916
+ def self.forecasted_sunny?(a=nil,b=nil); true; end
917
+ end; end
918
+ Barometer::Service.sunny?(@measurement).should be_true
919
+ end
920
+
921
+ it "returns false if !forecasted_wet?" do
922
+ module Barometer; class Service
923
+ def self.forecasted_sunny?(a=nil,b=nil); false; end
924
+ end; end
925
+ Barometer::Service.sunny?(@measurement).should be_false
926
+ end
927
+
928
+ end
929
+
930
+ end
931
+
932
+ describe "currently_sunny?" do
933
+
934
+ before(:each) do
935
+ # the function being tested was monkey patched in an earlier test
936
+ # so the original file must be reloaded
937
+ load 'lib/barometer/services/service.rb'
938
+
939
+ @measurement = Barometer::Measurement.new
940
+ end
941
+
942
+ it "requires a measurement object" do
943
+ lambda { Barometer::Service.currently_sunny? }.should raise_error(ArgumentError)
944
+ lambda { Barometer::Service.currently_sunny?("a") }.should raise_error(ArgumentError)
945
+ lambda { Barometer::Service.currently_sunny?(@measurement) }.should_not raise_error(ArgumentError)
946
+ end
947
+
948
+ it "returns nil when value unavailable" do
949
+ measurement = Barometer::Measurement.new
950
+ Barometer::Service.currently_sunny?(measurement).should be_nil
951
+ measurement.current = Barometer::CurrentMeasurement.new
952
+ Barometer::Service.currently_sunny?(measurement).should be_nil
953
+ end
954
+
955
+ it "returns false if night time" do
956
+ @measurement.current = Barometer::CurrentMeasurement.new
957
+ module Barometer; class Service; def self.currently_day?(a=nil)
958
+ true
959
+ end; end; end
960
+ module Barometer; class Service; def self.currently_sunny_by_icon?(a=nil)
961
+ true
962
+ end; end; end
963
+ Barometer::Service.currently_sunny?(@measurement).should be_true
964
+ module Barometer; class Service; def self.currently_day?(a=nil)
965
+ false
966
+ end; end; end
967
+ Barometer::Service.currently_sunny?(@measurement).should be_false
968
+ end
969
+
970
+ describe "currently_sunny_by_icon?" do
971
+
972
+ before(:each) do
973
+ @measurement.current = Barometer::CurrentMeasurement.new
974
+ end
975
+
976
+ it "requires a Barometer::Measurement object" do
977
+ lambda { Barometer::Service.currently_sunny_by_icon?(nil) }.should raise_error(ArgumentError)
978
+ lambda { Barometer::Service.currently_sunny_by_icon?("invlaid") }.should raise_error(ArgumentError)
979
+
980
+ lambda { Barometer::Service.currently_sunny_by_icon?(@measurement.current) }.should_not raise_error(ArgumentError)
981
+ end
982
+
983
+ it "returns nil if no icon" do
984
+ @measurement.current.icon?.should be_false
985
+ Barometer::Service.currently_sunny_by_icon?(@measurement.current).should be_nil
986
+ end
987
+
988
+ it "returns true if matching icon code" do
989
+ module Barometer; class Service; def self.sunny_icon_codes
990
+ ["sunny"]
991
+ end; end; end
992
+ @measurement.current.icon = "sunny"
993
+ @measurement.current.icon?.should be_true
994
+ Barometer::Service.currently_sunny_by_icon?(@measurement.current).should be_true
995
+ end
996
+
997
+ it "returns false if NO matching icon code" do
998
+ module Barometer; class Service; def self.sunny_icon_codes
999
+ ["sunny"]
1000
+ end; end; end
1001
+ @measurement.current.icon = "rain"
1002
+ @measurement.current.icon?.should be_true
1003
+ Barometer::Service.currently_sunny_by_icon?(@measurement.current).should be_false
1004
+ end
1005
+
1006
+ end
1007
+
1008
+ end
1009
+
1010
+ describe "forecasted_sunny?" do
1011
+
1012
+ before(:each) do
1013
+ # the function being tested was monkey patched in an earlier test
1014
+ # so the original file must be reloaded
1015
+ load 'lib/barometer/services/service.rb'
1016
+
1017
+ @measurement = Barometer::Measurement.new
1018
+ end
1019
+
1020
+ it "requires a measurement object" do
1021
+ lambda { Barometer::Service.forecasted_sunny? }.should raise_error(ArgumentError)
1022
+ lambda { Barometer::Service.forecasted_sunny?("a") }.should raise_error(ArgumentError)
1023
+ lambda { Barometer::Service.forecasted_sunny?(@measurement) }.should_not raise_error(ArgumentError)
1024
+ end
1025
+
1026
+ it "requires utc_time as a Time object" do
1027
+ lambda { Barometer::Service.forecasted_sunny?(@measurement,"string") }.should raise_error(ArgumentError)
1028
+ lambda { Barometer::Service.forecasted_sunny?(@measurement,Time.now.utc) }.should_not raise_error(ArgumentError)
1029
+ end
1030
+
1031
+ it "returns nil when value unavailable" do
1032
+ measurement = Barometer::Measurement.new
1033
+ Barometer::Service.forecasted_sunny?(measurement).should be_nil
1034
+ measurement.forecast = [Barometer::ForecastMeasurement.new]
1035
+ measurement.forecast.size.should == 1
1036
+ Barometer::Service.forecasted_sunny?(measurement).should be_nil
1037
+ end
1038
+
1039
+ it "returns false if night time" do
1040
+ @measurement.forecast = [Barometer::ForecastMeasurement.new]
1041
+ @measurement.forecast.size.should == 1
1042
+ @measurement.forecast[0].date = Date.today
1043
+ module Barometer; class Service; def self.forecasted_day?(a=nil, b=nil)
1044
+ true
1045
+ end; end; end
1046
+ module Barometer; class Service; def self.forecasted_sunny_by_icon?(a=nil, b=nil)
1047
+ true
1048
+ end; end; end
1049
+ Barometer::Service.forecasted_sunny?(@measurement).should be_true
1050
+ module Barometer; class Service; def self.forecasted_day?(a=nil, b=nil)
1051
+ false
1052
+ end; end; end
1053
+ Barometer::Service.forecasted_sunny?(@measurement).should be_false
1054
+ end
1055
+
1056
+ describe "forecasted_sunny_by_icon?" do
1057
+
1058
+ before(:each) do
1059
+ @measurement.forecast = [Barometer::ForecastMeasurement.new]
1060
+ @measurement.forecast.first.date = Date.today
1061
+ @measurement.forecast.size.should == 1
1062
+ end
1063
+
1064
+ it "requires a Barometer::Measurement object" do
1065
+ lambda { Barometer::Service.forecasted_sunny_by_icon?(nil) }.should raise_error(ArgumentError)
1066
+ lambda { Barometer::Service.forecasted_sunny_by_icon?("invlaid") }.should raise_error(ArgumentError)
1067
+
1068
+ lambda { Barometer::Service.forecasted_sunny_by_icon?(@measurement.forecast.first) }.should_not raise_error(ArgumentError)
1069
+ end
1070
+
1071
+ it "returns nil if no icon" do
1072
+ @measurement.forecast.first.icon?.should be_false
1073
+ Barometer::Service.forecasted_sunny_by_icon?(@measurement.forecast.first).should be_nil
1074
+ end
1075
+
1076
+ it "returns true if matching icon code" do
1077
+ module Barometer; class Service; def self.sunny_icon_codes
1078
+ ["sunny"]
1079
+ end; end; end
1080
+ @measurement.forecast.first.icon = "sunny"
1081
+ @measurement.forecast.first.icon?.should be_true
1082
+ Barometer::Service.forecasted_sunny_by_icon?(@measurement.forecast.first).should be_true
1083
+ end
1084
+
1085
+ it "returns false if NO matching icon code" do
1086
+ module Barometer; class Service; def self.sunny_icon_codes
1087
+ ["sunny"]
1088
+ end; end; end
1089
+ @measurement.forecast.first.icon = "rain"
1090
+ @measurement.forecast.first.icon?.should be_true
1091
+ Barometer::Service.forecasted_sunny_by_icon?(@measurement.forecast.first).should be_false
1092
+ end
1093
+
1094
+ after(:each) do
1095
+ # the function being tested was monkey patched in an earlier test
1096
+ # so the original file must be reloaded
1097
+ load 'lib/barometer/services/service.rb'
1098
+ end
1099
+
1100
+ end
1101
+
1102
+ end
1103
+
1104
+ end
1105
+
1106
+ end