metar-parser 1.1.8 → 1.2.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.
@@ -1,33 +1,22 @@
1
- # encoding: utf-8
2
- load File.expand_path( '../spec_helper.rb', File.dirname(__FILE__) )
1
+ require "spec_helper"
3
2
 
4
3
  describe Metar::Pressure do
5
-
6
4
  context '.parse' do
7
-
8
5
  it 'interprets the Q prefix as hectopascals' do
9
- Metar::Pressure.parse( 'Q1300' ).value.
10
- should be_within( 0.01 ).of( 1.3 )
6
+ expect(Metar::Pressure.parse( 'Q1300' ).value).to be_within( 0.01 ).of( 1.3 )
11
7
  end
12
8
 
13
9
  it 'interprets the A prefix as inches of mercury' do
14
- Metar::Pressure.parse( 'A1234' ).value.
15
- should be_within( 0.01 ).of( 0.42 )
10
+ expect(Metar::Pressure.parse( 'A1234' ).value).to be_within( 0.01 ).of( 0.42 )
16
11
  end
17
12
 
18
13
  it 'require 4 digits' do
19
- Metar::Pressure.parse( 'Q12345' ).
20
- should be_nil
21
- Metar::Pressure.parse( 'A123' ).
22
- should be_nil
14
+ expect(Metar::Pressure.parse( 'Q12345' )).to be_nil
15
+ expect(Metar::Pressure.parse( 'A123' )).to be_nil
23
16
  end
24
17
 
25
18
  it 'returns nil for nil' do
26
- Metar::Pressure.parse( nil ).
27
- should be_nil
19
+ expect(Metar::Pressure.parse( nil )).to be_nil
28
20
  end
29
-
30
21
  end
31
-
32
22
  end
33
-
@@ -3,6 +3,7 @@ require 'spec_helper'
3
3
 
4
4
  require 'net/ftp'
5
5
  require 'time'
6
+ require 'timecop'
6
7
 
7
8
  module MetarRawTestHelper
8
9
  def raw_metar
@@ -14,17 +15,88 @@ describe Metar::Raw::Data do
14
15
  include MetarRawTestHelper
15
16
 
16
17
  context 'initialization' do
17
- let(:call_time) { Time.parse('2012-07-29 16:35') }
18
+ let(:time) { Time.parse('2012-07-29 16:35') }
18
19
 
19
- it 'should parse data, if supplied' do
20
- now = call_time
21
- Time.stub(:now) { now }
20
+ subject { described_class.new(raw_metar, time) }
22
21
 
23
- raw = Metar::Raw::Data.new(raw_metar)
24
-
25
- expect(raw.metar).to eq(raw_metar)
26
- expect(raw.cccc).to eq('ESSB')
27
- expect(raw.time).to eq(call_time)
22
+ it "accepts a METAR string" do
23
+ expect(subject.metar).to eq(raw_metar)
24
+ end
25
+
26
+ it "accepts a reading time" do
27
+ expect(subject.time).to eq(time)
28
+ end
29
+
30
+ context "when called without a time parameter" do
31
+ it "warns that the usage is deprecated" do
32
+ expect { described_class.new(raw_metar) }.to output(/deprecated/).to_stderr
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ describe Metar::Raw::Metar do
39
+ context "time" do
40
+ let(:call_time) { Time.parse("2016-04-01 16:35") }
41
+ let(:raw_metar) { "OPPS 312359Z 23006KT 4000 HZ SCT040 SCT100 17/12 Q1011" }
42
+
43
+ subject { described_class.new(raw_metar) }
44
+
45
+ before { Timecop.freeze(call_time) }
46
+ after { Timecop.return }
47
+
48
+ it "is the last day with the day of month from the METAR datetime" do
49
+ expect(subject.time.year).to eq(2016)
50
+ expect(subject.time.month).to eq(3)
51
+ expect(subject.time.day).to eq(31)
52
+ end
53
+
54
+ context "when the current day of month is greater than the METAR's day of month" do
55
+ let(:call_time) { Time.parse("2016-04-11 16:35") }
56
+ let(:raw_metar) { "OPPS 092359Z 23006KT 4000 HZ SCT040 SCT100 17/12 Q1011" }
57
+
58
+ it "uses the date from the current month" do
59
+ expect(subject.time.year).to eq(2016)
60
+ expect(subject.time.month).to eq(4)
61
+ expect(subject.time.day).to eq(9)
62
+ end
63
+ end
64
+
65
+ context "when the previous month did not have the day of the month" do
66
+ let(:call_time) { Time.parse("2016-05-01 16:35") }
67
+
68
+ it "skips back to a previous month" do
69
+ expect(subject.time.year).to eq(2016)
70
+ expect(subject.time.month).to eq(3)
71
+ expect(subject.time.day).to eq(31)
72
+ end
73
+ end
74
+
75
+ context "when the datetime doesn't have 6 numerals" do
76
+ let(:raw_metar) { "OPPS 3123Z 23006KT 4000 HZ SCT040 SCT100 17/12 Q1011" }
77
+
78
+ it "throws an error" do
79
+ expect { subject.time }.
80
+ to raise_error(RuntimeError, /6 digit/)
81
+ end
82
+ end
83
+
84
+ context "when the day of month in the datetime is > 31" do
85
+ let(:raw_metar) { "OPPS 332359Z 23006KT 4000 HZ SCT040 SCT100 17/12 Q1011" }
86
+
87
+ it "throws an error" do
88
+ expect { subject.time }.
89
+ to raise_error(RuntimeError, /at most 31/)
90
+ end
91
+ end
92
+
93
+ context "when the day of month in the datetime is 0" do
94
+ let(:raw_metar) { "OPPS 002359Z 23006KT 4000 HZ SCT040 SCT100 17/12 Q1011" }
95
+
96
+ it "throws an error" do
97
+ expect { subject.time }.
98
+ to raise_error(RuntimeError, /greater than 0/)
99
+ end
28
100
  end
29
101
  end
30
102
  end
@@ -32,13 +104,16 @@ end
32
104
  describe Metar::Raw::Noaa do
33
105
  include MetarRawTestHelper
34
106
 
35
- let(:ftp) { double('ftp', :login => nil, :chdir => nil, :passive= => nil, :retrbinary => nil) }
107
+ let(:cccc) { "ESSB" }
108
+ let(:ftp) do
109
+ double(Net::FTP, login: nil, chdir: nil, :passive= => nil, retrbinary: nil)
110
+ end
36
111
 
37
112
  before do
38
- Net::FTP.stub(:new).and_return(ftp)
113
+ allow(Net::FTP).to receive(:new) { ftp }
39
114
  end
40
115
 
41
- after :each do
116
+ after do
42
117
  Metar::Raw::Noaa.send(:class_variable_set, '@@connection', nil)
43
118
  end
44
119
 
@@ -75,7 +150,7 @@ describe Metar::Raw::Noaa do
75
150
  Metar::Raw::Noaa.connect
76
151
 
77
152
  expect(Net::FTP).to have_received(:new)
78
- expect(ftp).to have_received(:login).with()
153
+ expect(ftp).to have_received(:login).with(no_args)
79
154
  expect(ftp).to have_received(:chdir).with('data/observations/metar/stations')
80
155
  expect(ftp).to have_received(:passive=).with(true)
81
156
  end
@@ -143,37 +218,20 @@ describe Metar::Raw::Noaa do
143
218
  end
144
219
  end
145
220
 
146
- context 'initialization' do
147
- it 'should accept CCCC codes' do
148
- raw = Metar::Raw::Noaa.new('XXXX')
149
-
150
- expect(raw.cccc).to eq('XXXX')
151
- end
152
-
153
- it 'should accept Stations' do
154
- station = double('Metar::Station', :cccc => 'YYYY')
155
- raw = Metar::Raw::Noaa.new(station)
156
-
157
- expect(raw.cccc).to eq('YYYY')
158
- end
159
- end
160
-
161
- context 'lazy loading' do
162
- let(:noaa_metar) do
163
- raw_time = "2010/02/15 10:20"
164
- "#{raw_time}\n#{raw_metar}"
165
- end
221
+ context "fetching" do
222
+ let(:noaa_metar) { "#{raw_time}\n#{raw_metar}" }
223
+ let(:raw_time) { "2010/02/15 10:20" }
166
224
 
167
225
  before do
168
- Metar::Raw::Noaa.stub(:fetch => noaa_metar)
226
+ allow(ftp).to receive(:retrbinary).and_yield(noaa_metar)
169
227
  end
170
228
 
171
- subject { Metar::Raw::Noaa.new('ESSB') }
229
+ subject { Metar::Raw::Noaa.new(cccc) }
172
230
 
173
- it 'should fetch data on demand' do
231
+ it "queries for the station's data" do
174
232
  subject.metar
175
233
 
176
- expect(Metar::Raw::Noaa).to have_received(:fetch).with('ESSB')
234
+ expect(ftp).to have_received(:retrbinary).with("RETR #{cccc}.TXT", 1024)
177
235
  end
178
236
 
179
237
  it 'sets data to the returned value' do
@@ -181,6 +239,27 @@ describe Metar::Raw::Noaa do
181
239
 
182
240
  expect(subject.data).to eq(noaa_metar)
183
241
  end
242
+
243
+ context "times" do
244
+ let(:cccc) { "OPPS" }
245
+ let(:raw_time) { "2016/03/31 23:59" }
246
+ let(:raw_metar) { "OPPS 312359Z 23006KT 4000 HZ SCT040 SCT100 17/12 Q1011" }
247
+
248
+ specify "are parsed as UTC" do
249
+ expect(subject.time.zone).to eq("UTC")
250
+ end
251
+
252
+ context "across month rollover" do
253
+ let(:after_midnight) { Time.parse("2016/04/01 00:02:11 UTC") }
254
+
255
+ specify "have correct date" do
256
+ Timecop.freeze(after_midnight) do
257
+ expect(subject.time.day).to eq(31)
258
+ expect(subject.time.month).to eq(3)
259
+ expect(subject.time.year).to eq(2016)
260
+ end
261
+ end
262
+ end
263
+ end
184
264
  end
185
265
  end
186
-
@@ -1,20 +1,16 @@
1
- # encoding: utf-8
2
- load File.expand_path( '../spec_helper.rb', File.dirname(__FILE__) )
1
+ require "spec_helper"
3
2
 
4
3
  describe Metar::Remark do
5
-
6
4
  context '.parse' do
7
-
8
- it 'should delegate to subclasses' do
9
- Metar::Remark.parse('21012'). should be_a(Metar::TemperatureExtreme)
5
+ it 'delegate to subclasses' do
6
+ expect(Metar::Remark.parse('21012')).to be_a(Metar::TemperatureExtreme)
10
7
  end
11
8
 
12
- it 'should return nil for unrecognised' do
13
- Metar::Remark.parse('FOO'). should be_nil
9
+ it 'returns nil for unrecognised' do
10
+ expect(Metar::Remark.parse('FOO')).to be_nil
14
11
  end
15
12
 
16
13
  context '6-hour maximum or minimum' do
17
-
18
14
  [
19
15
  ['positive maximum', '10046', [:maximum, 4.6]],
20
16
  ['negative maximum', '11012', [:maximum, -1.2]],
@@ -22,8 +18,7 @@ describe Metar::Remark do
22
18
  ['negative minimum', '21012', [:minimum, -1.2]],
23
19
  ].each do |docstring, raw, expected|
24
20
  example docstring do
25
- Metar::Remark.parse(raw).
26
- should be_temperature_extreme(*expected)
21
+ expect(Metar::Remark.parse(raw)).to be_temperature_extreme(*expected)
27
22
  end
28
23
  end
29
24
 
@@ -34,8 +29,8 @@ describe Metar::Remark do
34
29
  it 'returns minimum and maximum' do
35
30
  max, min = Metar::Remark.parse('400461006')
36
31
 
37
- max. should be_temperature_extreme(:maximum, 4.6)
38
- min. should be_temperature_extreme(:minimum, -0.6)
32
+ expect(max).to be_temperature_extreme(:maximum, 4.6)
33
+ expect(min).to be_temperature_extreme(:minimum, -0.6)
39
34
  end
40
35
 
41
36
  end
@@ -45,9 +40,9 @@ describe Metar::Remark do
45
40
  it 'steady_then_decreasing' do
46
41
  pt = Metar::Remark.parse('58033')
47
42
 
48
- pt. should be_a(Metar::PressureTendency)
49
- pt.character. should == :steady_then_decreasing
50
- pt.value. should == 3.3
43
+ expect(pt).to be_a(Metar::PressureTendency)
44
+ expect(pt.character).to eq(:steady_then_decreasing)
45
+ expect(pt.value).to eq(3.3)
51
46
  end
52
47
 
53
48
  end
@@ -57,9 +52,9 @@ describe Metar::Remark do
57
52
  it '60009' do
58
53
  pr = Metar::Remark.parse('60009')
59
54
 
60
- pr. should be_a(Metar::Precipitation)
61
- pr.period. should == 3
62
- pr.amount.value. should == 0.002286
55
+ expect(pr).to be_a(Metar::Precipitation)
56
+ expect(pr.period).to eq(3)
57
+ expect(pr.amount.value).to eq(0.002286)
63
58
  end
64
59
 
65
60
  end
@@ -69,9 +64,9 @@ describe Metar::Remark do
69
64
  it '70015' do
70
65
  pr = Metar::Remark.parse('70015')
71
66
 
72
- pr. should be_a(Metar::Precipitation)
73
- pr.period. should == 24
74
- pr.amount.value. should == 0.003810
67
+ expect(pr).to be_a(Metar::Precipitation)
68
+ expect(pr.period).to eq(24)
69
+ expect(pr.amount.value).to eq(0.003810)
75
70
  end
76
71
 
77
72
  end
@@ -85,8 +80,8 @@ describe Metar::Remark do
85
80
  example docstring do
86
81
  aut = Metar::Remark.parse(raw)
87
82
 
88
- aut. should be_a(expected[0])
89
- aut.type. should == expected[1]
83
+ expect(aut).to be_a(expected[0])
84
+ expect(aut.type).to eq(expected[1])
90
85
  end
91
86
  end
92
87
 
@@ -97,8 +92,8 @@ describe Metar::Remark do
97
92
  it 'SLP125' do
98
93
  slp = Metar::Remark.parse('SLP125')
99
94
 
100
- slp. should be_a(Metar::SeaLevelPressure)
101
- slp.pressure.value. should == 0.0125
95
+ expect(slp).to be_a(Metar::SeaLevelPressure)
96
+ expect(slp.pressure.value).to eq(0.0125)
102
97
  end
103
98
 
104
99
  end
@@ -108,9 +103,9 @@ describe Metar::Remark do
108
103
  it 'T00640036' do
109
104
  htm = Metar::Remark.parse('T00641036')
110
105
 
111
- htm. should be_a(Metar::HourlyTemperaturAndDewPoint)
112
- htm.temperature.value. should == 6.4
113
- htm.dew_point.value. should == -3.6
106
+ expect(htm).to be_a(Metar::HourlyTemperaturAndDewPoint)
107
+ expect(htm.temperature.value).to eq(6.4)
108
+ expect(htm.dew_point.value).to eq(-3.6)
114
109
  end
115
110
 
116
111
  end
@@ -134,37 +129,37 @@ describe Metar::Lightning do
134
129
  chunks = section.split(' ')
135
130
  r = Metar::Lightning.parse_chunks(chunks)
136
131
 
137
- r. should be_a(Metar::Lightning)
138
- r.type. should == expected[0]
132
+ expect(r).to be_a(Metar::Lightning)
133
+ expect(r.type).to eq(expected[0])
139
134
  if expected[1]
140
- r.distance.value. should == expected[1]
135
+ expect(r.distance.value).to eq(expected[1])
141
136
  else
142
- r.distance. should be_nil
137
+ expect(r.distance).to be_nil
143
138
  end
144
- r.directions. should == expected[2]
139
+ expect(r.directions).to eq(expected[2])
145
140
  end
146
141
  end
147
142
 
148
- it 'should remove parsed chunks' do
143
+ it 'removes parsed chunks' do
149
144
  chunks = ['LTG', 'DSNT', 'SE', 'FOO']
150
145
 
151
146
  r = Metar::Lightning.parse_chunks(chunks)
152
147
 
153
- chunks. should == ['FOO']
148
+ expect(chunks).to eq(['FOO'])
154
149
  end
155
150
 
156
- it 'should fail if the first chunk is not LTGnnn' do
151
+ it 'fails if the first chunk is not LTGnnn' do
157
152
  expect do
158
153
  Metar::Lightning.parse_chunks(['FOO'])
159
154
  end. to raise_error(RuntimeError, /not lightning/)
160
155
  end
161
156
 
162
- it 'should not fail if all chunks are parsed' do
157
+ it "doesn't not fail if all chunks are parsed" do
163
158
  chunks = ['LTG', 'DSNT', 'SE']
164
159
 
165
160
  r = Metar::Lightning.parse_chunks(chunks)
166
161
 
167
- chunks. should == []
162
+ expect(chunks).to eq([])
168
163
  end
169
164
 
170
165
  end
@@ -1,44 +1,32 @@
1
1
  # encoding: utf-8
2
- load File.expand_path( '../spec_helper.rb', File.dirname(__FILE__) )
2
+ require "spec_helper"
3
3
 
4
4
  describe Metar::Report do
5
-
6
- context 'initialization' do
7
-
8
- it 'loads the Station' do
9
- station = stub( 'station' )
10
- parser = stub( 'parser', :station_code => 'SSSS' )
11
-
12
- Metar::Station. should_receive( :find_by_cccc ).
13
- with( 'SSSS' ).
14
- and_return( station )
15
-
16
- Metar::Report.new( parser )
17
- end
18
-
19
- end
20
-
21
5
  context 'attributes' do
22
-
23
- before :each do
24
- @locale = I18n.locale
25
- @station_code = 'SSSS'
26
- @metar_date = '2008/05/06'
27
- @metar_time = '10:56'
28
- @metar_datetime = "#{@metar_date} #{@metar_time}"
29
- @station = stub( 'station', :name => 'Airport 1',
30
- :country => 'Wwwwww' )
31
- @parser = stub( 'parser', :station_code => @station_code,
32
- :date => Date.parse( @metar_date ),
33
- :time => Time.parse( @metar_datetime ),
34
- :observer => :real )
35
- Metar::Station.stub( :find_by_cccc ).with( @station_code ).and_return( @station )
6
+ let(:parser) do
7
+ double(
8
+ Metar::Parser,
9
+ :station_code => station_code,
10
+ :date => Date.parse(metar_date),
11
+ :time => Time.parse(metar_datetime),
12
+ :observer => :real
13
+ )
14
+ end
15
+ let(:station_code) { "SSSS" }
16
+ let(:locale) { I18n.locale }
17
+ let(:metar_date) { "2008/05/06" }
18
+ let(:metar_time) { "10:56" }
19
+ let(:metar_datetime) { "#{metar_date} #{metar_time}" }
20
+ let(:station) { double(Metar::Station, :name => 'Airport 1', :country => 'Wwwwww') }
21
+
22
+ before do
23
+ allow(Metar::Station).to receive(:find_by_cccc).with(station_code) { station }
36
24
  end
37
25
 
38
- subject { Metar::Report.new( @parser ) }
26
+ subject { described_class.new(parser) }
39
27
 
40
28
  after :each do
41
- I18n.locale = @locale
29
+ I18n.locale = locale
42
30
  end
43
31
 
44
32
  context '#date' do
@@ -48,30 +36,42 @@ describe Metar::Report do
48
36
  end
49
37
 
50
38
  context '#time' do
51
- specify { subject.time. should == @metar_time }
39
+ it "is equal to the METAR time" do
40
+ expect(subject.time).to eq(metar_time)
41
+ end
52
42
 
53
43
  it 'zero-pads single figure minutes' do
54
- @parser.stub(:time => Time.parse('10:02'))
44
+ allow(parser).to receive(:time) { Time.parse('10:02') }
55
45
 
56
46
  expect(subject.time).to eq('10:02')
57
47
  end
58
48
  end
59
49
 
60
50
  context '#observer' do
61
- specify { subject.observer. should == 'real' }
51
+ it "returns the observer" do
52
+ expect(subject.observer).to eq('real')
53
+ end
62
54
  end
63
55
 
64
- specify { subject.station_name.
65
- should == 'Airport 1' }
56
+ context "#station_name" do
57
+ it "returns the name" do
58
+ expect(subject.station_name).to eq('Airport 1')
59
+ end
60
+ end
66
61
 
67
- specify { subject.station_country.
68
- should == 'Wwwwww' }
62
+ context "#station_country" do
63
+ it "returns the country" do
64
+ expect(subject.station_country).to eq('Wwwwww')
65
+ end
66
+ end
69
67
 
70
- specify { subject.station_code.
71
- should == @station_code }
68
+ context "#station_code" do
69
+ it "returns the station code" do
70
+ expect(subject.station_code).to eq(station_code)
71
+ end
72
+ end
72
73
 
73
74
  context 'proxied from parser' do
74
-
75
75
  context 'singly' do
76
76
  [
77
77
  :wind,
@@ -84,94 +84,86 @@ describe Metar::Report do
84
84
  :sea_level_pressure,
85
85
  ].each do | attribute |
86
86
  example attribute do
87
- @attr = stub( attribute.to_s )
88
- @parser.stub!( attribute => @attr )
87
+ allow(parser).to receive(attribute) { attribute.to_s }
89
88
 
90
- @attr. should_receive( :to_s )
91
-
92
- subject.send( attribute )
89
+ expect(subject.send(attribute)).to eq(attribute.to_s)
93
90
  end
94
91
  end
95
92
 
96
- context '#sky_summary' do
97
-
98
- it 'returns the summary' do
99
- @skies1 = stub('sky_conditions')
100
- @parser.stub!( :sky_conditions => [@skies1] )
93
+ context "#sky_summary" do
94
+ let(:conditions1) { double(:to_summary => "skies1") }
101
95
 
102
- @skies1. should_receive( :to_summary ).
103
- and_return( 'skies1' )
96
+ it "returns the summary" do
97
+ allow(parser).to receive(:sky_conditions) { [conditions1] }
104
98
 
105
- subject.sky_summary. should == 'skies1'
99
+ expect(subject.sky_summary).to eq("skies1")
106
100
  end
107
101
 
108
- it 'clear skies when missing' do
109
- @parser.stub!( :sky_conditions => [] )
102
+ it "clear skies when missing" do
103
+ allow(parser).to receive(:sky_conditions) { [] }
110
104
 
111
- subject.sky_summary. should == 'clear skies'
105
+ expect(subject.sky_summary).to eq("clear skies")
112
106
  end
113
107
 
114
- it 'uses the last, if there is more than 1' do
115
- @skies1 = stub('sky_conditions1' )
116
- @skies2 = stub('sky_conditions2' )
117
- @parser.stub!( :sky_conditions => [ @skies1, @skies2 ] )
108
+ it "uses the last, if there is more than 1" do
109
+ @skies1 = double("sky_conditions1")
110
+ @skies2 = double("sky_conditions2", :to_summary => "skies2")
111
+ allow(parser).to receive(:sky_conditions) { [@skies1, @skies2] }
118
112
 
119
- @skies2. should_receive( :to_summary ).
120
- and_return( 'skies2' )
121
-
122
- subject.sky_summary. should == 'skies2'
113
+ expect(subject.sky_summary).to eq("skies2")
123
114
  end
124
115
  end
125
116
  end
126
117
 
127
- context 'joined' do
128
-
129
- it '#runway_visible_range' do
130
- @rvr1 = stub( 'rvr1', :to_s => 'rvr1' )
131
- @rvr2 = stub( 'rvr2', :to_s => 'rvr2' )
132
- @parser.stub!( :runway_visible_range => [ @rvr1, @rvr2 ] )
118
+ context "joined" do
119
+ it "#runway_visible_range" do
120
+ @rvr1 = double("rvr1", :to_s => "rvr1")
121
+ @rvr2 = double("rvr2", :to_s => "rvr2")
122
+ allow(parser).to receive(:runway_visible_range) { [@rvr1, @rvr2] }
133
123
 
134
- subject.runway_visible_range.
135
- should == 'rvr1, rvr2'
124
+ expect(subject.runway_visible_range).to eq("rvr1, rvr2")
136
125
  end
137
126
 
138
- it '#present_weather' do
139
- @parser.stub!( :present_weather => [ 'pw1', 'pw2' ] )
127
+ it "#present_weather" do
128
+ allow(parser).to receive(:present_weather) { ["pw1", "pw2"] }
140
129
 
141
- subject.present_weather.should == 'pw1, pw2'
130
+ expect(subject.present_weather).to eq("pw1, pw2")
142
131
  end
143
132
 
144
- it '#remarks' do
145
- @parser.stub!( :remarks => [ 'rem1', 'rem2' ] )
133
+ it "#remarks" do
134
+ allow(parser).to receive(:remarks) { ["rem1", "rem2"] }
146
135
 
147
- subject.remarks. should == 'rem1, rem2'
136
+ expect(subject.remarks).to eq("rem1, rem2")
148
137
  end
149
138
 
150
139
  it '#sky_conditions' do
151
- sky1 = stub( 'sky1', :to_s => 'sky1' )
152
- sky2 = stub( 'sky2', :to_s => 'sky2' )
153
- @parser.stub!( :sky_conditions => [ sky1, sky2 ] )
140
+ sky1 = double('sky1', :to_s => 'sky1')
141
+ sky2 = double('sky2', :to_s => 'sky2')
142
+ allow(parser).to receive(:sky_conditions) { [sky1, sky2] }
154
143
 
155
- subject.sky_conditions. should == 'sky1, sky2'
144
+ expect(subject.sky_conditions).to eq("sky1, sky2")
156
145
  end
157
-
158
146
  end
159
-
160
147
  end
161
148
 
162
- it '#to_s' do
163
- sky1 = stub( 'sky1', :to_summary => 'sky1' )
164
- sky2 = stub( 'sky2', :to_summary => 'sky2' )
165
- @parser.stub!( :wind => 'wind',
166
- :visibility => 'visibility',
167
- :minimum_visibility => 'min visibility',
168
- :present_weather => ['pw'],
169
- :sky_conditions => [ sky1, sky2 ],
170
- :temperature => 'temp' )
171
- expected = <<EOT
149
+ context '#to_s' do
150
+ let(:sky1) { double('sky1', :to_summary => 'sky1') }
151
+ let(:sky2) { double('sky2', :to_summary => 'sky2') }
152
+
153
+ before do
154
+ allow(parser).to receive(:wind) { "wind" }
155
+ allow(parser).to receive(:visibility) { "visibility" }
156
+ allow(parser).to receive(:minimum_visibility) { "min visibility" }
157
+ allow(parser).to receive(:present_weather) { ["pw"] }
158
+ allow(parser).to receive(:sky_conditions) { [sky1, sky2] }
159
+ allow(parser).to receive(:temperature) { "temp" }
160
+ end
161
+
162
+ it "returns the full report" do
163
+ expected = <<EOT
172
164
  name: Airport 1
173
165
  country: Wwwwww
174
- time: #{@metar_time}
166
+ time: #{metar_time}
175
167
  wind: wind
176
168
  visibility: visibility
177
169
  minimum visibility: min visibility
@@ -179,10 +171,8 @@ weather: pw
179
171
  sky: sky2
180
172
  temperature: temp
181
173
  EOT
182
- subject.to_s. should == expected
174
+ expect(subject.to_s).to eq(expected)
175
+ end
183
176
  end
184
-
185
177
  end
186
-
187
178
  end
188
-