barometer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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