metar-parser 1.1.8 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
-