aixm 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +1 -2
- data/CHANGELOG.md +20 -0
- data/README.md +7 -2
- data/aixm.gemspec +2 -3
- data/lib/aixm.rb +6 -2
- data/lib/aixm/a.rb +151 -0
- data/lib/aixm/component/frequency.rb +2 -2
- data/lib/aixm/component/geometry.rb +4 -0
- data/lib/aixm/component/geometry/point.rb +0 -4
- data/lib/aixm/component/helipad.rb +8 -22
- data/lib/aixm/component/runway.rb +36 -36
- data/lib/aixm/component/surface.rb +121 -0
- data/lib/aixm/component/timetable.rb +1 -0
- data/lib/aixm/constants.rb +40 -0
- data/lib/aixm/d.rb +5 -0
- data/lib/aixm/document.rb +2 -2
- data/lib/aixm/f.rb +6 -0
- data/lib/aixm/feature/address.rb +100 -0
- data/lib/aixm/feature/airport.rb +26 -7
- data/lib/aixm/feature/airspace.rb +10 -1
- data/lib/aixm/feature/navigational_aid.rb +1 -1
- data/lib/aixm/feature/navigational_aid/designated_point.rb +20 -5
- data/lib/aixm/feature/navigational_aid/dme.rb +2 -2
- data/lib/aixm/{component → feature}/service.rb +67 -16
- data/lib/aixm/feature/unit.rb +40 -6
- data/lib/aixm/refinements.rb +63 -6
- data/lib/aixm/shortcuts.rb +12 -4
- data/lib/aixm/version.rb +1 -1
- data/lib/aixm/xy.rb +6 -1
- data/lib/aixm/z.rb +6 -0
- data/schemas/ofmx/0/OFMX-DataTypes.xsd +5 -2
- data/schemas/ofmx/0/OFMX-Features.xsd +2 -0
- data/spec/factory.rb +32 -10
- data/spec/lib/aixm/a_spec.rb +203 -0
- data/spec/lib/aixm/component/helipad_spec.rb +11 -17
- data/spec/lib/aixm/component/runway_spec.rb +46 -32
- data/spec/lib/aixm/component/surface_spec.rb +88 -0
- data/spec/lib/aixm/d_spec.rb +10 -0
- data/spec/lib/aixm/document_spec.rb +104 -32
- data/spec/lib/aixm/f_spec.rb +10 -0
- data/spec/lib/aixm/feature/address_spec.rb +55 -0
- data/spec/lib/aixm/feature/airport_spec.rb +73 -3
- data/spec/lib/aixm/feature/navigational_aid/designated_point_spec.rb +43 -6
- data/spec/lib/aixm/feature/navigational_aid/dme_spec.rb +2 -2
- data/spec/lib/aixm/feature/navigational_aid/marker_spec.rb +2 -2
- data/spec/lib/aixm/feature/navigational_aid/ndb_spec.rb +2 -2
- data/spec/lib/aixm/feature/navigational_aid/tacan_spec.rb +2 -2
- data/spec/lib/aixm/feature/navigational_aid/vor_spec.rb +6 -6
- data/spec/lib/aixm/{component → feature}/service_spec.rb +12 -14
- data/spec/lib/aixm/feature/unit_spec.rb +7 -4
- data/spec/lib/aixm/refinements_spec.rb +100 -15
- data/spec/lib/aixm/z_spec.rb +10 -0
- metadata +17 -25
- data/lib/aixm/h.rb +0 -87
- data/spec/lib/aixm/h_spec.rb +0 -113
@@ -71,6 +71,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
71
71
|
</xsd:annotation>
|
72
72
|
</xsd:element>
|
73
73
|
</xsd:sequence>
|
74
|
+
<xsd:attribute ref="source"/>
|
74
75
|
</xsd:complexType>
|
75
76
|
<xsd:complexType name="AerodromeHeliportAddressUidType">
|
76
77
|
<xsd:annotation>
|
@@ -4083,6 +4084,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4083
4084
|
</xsd:annotation>
|
4084
4085
|
</xsd:element>
|
4085
4086
|
</xsd:sequence>
|
4087
|
+
<xsd:attribute ref="source"/>
|
4086
4088
|
</xsd:complexType>
|
4087
4089
|
<xsd:complexType name="IlsUidType">
|
4088
4090
|
<xsd:annotation>
|
data/spec/factory.rb
CHANGED
@@ -20,12 +20,22 @@ module AIXM
|
|
20
20
|
AIXM.f(123.35, :mhz)
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
AIXM.
|
23
|
+
def a
|
24
|
+
AIXM.a('34L')
|
25
25
|
end
|
26
26
|
|
27
27
|
# Components
|
28
28
|
|
29
|
+
def address
|
30
|
+
AIXM.address(
|
31
|
+
source: 'LF|GEN|0.0 FACTORY|0|0',
|
32
|
+
type: :radio_frequency,
|
33
|
+
address: "123.35"
|
34
|
+
).tap do |address|
|
35
|
+
address.remarks = "A/A (callsign PUJAUT)"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
29
39
|
def timetable
|
30
40
|
AIXM.timetable(
|
31
41
|
code: :sunrise_to_sunset
|
@@ -119,8 +129,9 @@ module AIXM
|
|
119
129
|
name: 'DESIGNATED POINT NAVAID',
|
120
130
|
xy: AIXM.xy(lat: %q(47°51'33"N), long: %q(007°33'36"E)),
|
121
131
|
z: AIXM.z(500, :qnh),
|
122
|
-
type: :
|
132
|
+
type: :vfr_reporting_point
|
123
133
|
).tap do |designated_point|
|
134
|
+
designated_point.airport = airport
|
124
135
|
designated_point.timetable = AIXM::H24
|
125
136
|
designated_point.remarks = 'designated point navaid'
|
126
137
|
end
|
@@ -264,14 +275,14 @@ module AIXM
|
|
264
275
|
class: :icao
|
265
276
|
).tap do |unit|
|
266
277
|
unit.airport = airport
|
267
|
-
unit.remarks = '
|
278
|
+
unit.remarks = 'FR only'
|
268
279
|
unit.add_service(service)
|
269
280
|
end
|
270
281
|
end
|
271
282
|
|
272
283
|
def service
|
273
284
|
AIXM.service(
|
274
|
-
|
285
|
+
source: 'LF|GEN|0.0 FACTORY|0|0',
|
275
286
|
type: :approach_control_service
|
276
287
|
).tap do |service|
|
277
288
|
service.timetable = AIXM::H24
|
@@ -316,6 +327,7 @@ module AIXM
|
|
316
327
|
reservation_required.timetable = AIXM::H24
|
317
328
|
reservation_required.remarks = "reservation remarks"
|
318
329
|
end
|
330
|
+
airport.add_address(address)
|
319
331
|
end
|
320
332
|
end
|
321
333
|
|
@@ -323,18 +335,24 @@ module AIXM
|
|
323
335
|
AIXM.runway(name: '16L/34R').tap do |runway|
|
324
336
|
runway.length = AIXM.d(650, :m)
|
325
337
|
runway.width = AIXM.d(80, :m)
|
326
|
-
runway.composition = :
|
338
|
+
runway.surface.composition = :asphalt
|
339
|
+
runway.surface.preparation = :paved
|
340
|
+
runway.surface.condition = :good
|
341
|
+
runway.surface.pcn = "59/F/A/W/T"
|
342
|
+
runway.surface.remarks = "Paved shoulder on 2.5m on each side of the RWY."
|
327
343
|
runway.status = :closed
|
328
344
|
runway.remarks = "Markings eroded"
|
329
345
|
runway.forth.xy = AIXM.xy(lat: %q(44°00'07.63"N), long: %q(004°45'07.81"E))
|
330
346
|
runway.forth.z = AIXM.z(145, :qnh)
|
331
347
|
runway.forth.displaced_threshold = AIXM.xy(lat: %q(44°00'03.54"N), long: %q(004°45'09.30"E))
|
332
|
-
runway.forth.geographic_orientation = 165
|
348
|
+
runway.forth.geographic_orientation = AIXM.a(165)
|
349
|
+
runway.forth.vfr_pattern = :left_or_right
|
333
350
|
runway.forth.remarks = "forth remarks"
|
334
351
|
runway.back.xy = AIXM.xy(lat: %q(43°59'25.31"N), long: %q(004°45'23.24"E))
|
335
|
-
runway.
|
352
|
+
runway.back.z = AIXM.z(147, :qnh)
|
336
353
|
runway.back.displaced_threshold = AIXM.xy(lat: %q(43°59'31.84"N), long: %q(004°45'20.85"E))
|
337
|
-
runway.back.geographic_orientation = 345
|
354
|
+
runway.back.geographic_orientation = AIXM.a(345)
|
355
|
+
runway.back.vfr_pattern = :left
|
338
356
|
runway.back.remarks = "back remarks"
|
339
357
|
end
|
340
358
|
end
|
@@ -345,7 +363,11 @@ module AIXM
|
|
345
363
|
helipad.z = AIXM.z(141, :qnh)
|
346
364
|
helipad.length = AIXM.d(20, :m)
|
347
365
|
helipad.width = AIXM.d(20, :m)
|
348
|
-
helipad.composition = :
|
366
|
+
helipad.surface.composition = :concrete
|
367
|
+
helipad.surface.preparation = :paved
|
368
|
+
helipad.surface.condition = :fair
|
369
|
+
helipad.surface.pcn = "30/F/A/W/U"
|
370
|
+
helipad.surface.remarks = "Cracks near the center."
|
349
371
|
helipad.status = :other
|
350
372
|
helipad.remarks = "Authorizaton by AD operator required"
|
351
373
|
end
|
@@ -0,0 +1,203 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
|
3
|
+
describe AIXM::A do
|
4
|
+
let :subject_2 do
|
5
|
+
AIXM.a('0')
|
6
|
+
end
|
7
|
+
|
8
|
+
let :subject_3 do
|
9
|
+
AIXM.a(0)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe :initialize do
|
13
|
+
it "fails on invalid values" do
|
14
|
+
-> { AIXM.a('foobar') }.must_raise ArgumentError
|
15
|
+
end
|
16
|
+
|
17
|
+
it "parses String as angle with precision=2" do
|
18
|
+
AIXM.a('34L').tap do |h|
|
19
|
+
h.deg.must_equal 340
|
20
|
+
h.precision.must_equal 2
|
21
|
+
h.suffix.must_equal :L
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it "parses Numeric as angle with precision=3" do
|
26
|
+
AIXM.a(12).tap do |h|
|
27
|
+
h.deg.must_equal 12
|
28
|
+
h.precision.must_equal 3
|
29
|
+
h.suffix.must_be :nil?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe :to_s do
|
35
|
+
context "precision=2" do
|
36
|
+
it "rounds and zero-pad deg to length 2 and concats suffix" do
|
37
|
+
AIXM.a('05').to_s.must_equal '05'
|
38
|
+
AIXM.a('05').tap { |a| a.suffix = :L }.to_s.must_equal '05L'
|
39
|
+
AIXM.a('05').tap { |a| a.deg = 0 }.to_s.must_equal '36'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "precition=3" do
|
44
|
+
it "rounds and zero-pad deg to length 3" do
|
45
|
+
AIXM.a(5).to_s.must_equal '005'
|
46
|
+
AIXM.a(5).tap { |a| a.deg = 0 }.to_s.must_equal '000'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe :deg= do
|
52
|
+
it "fails on invalid values" do
|
53
|
+
[:foobar, '1', -1, 361].wont_be_written_to subject_2, :deg
|
54
|
+
[:foobar, '1', -1, 361].wont_be_written_to subject_3, :deg
|
55
|
+
end
|
56
|
+
|
57
|
+
context "precision=2" do
|
58
|
+
it "rounds to 10 degree steps" do
|
59
|
+
subject_2.tap { |s| s.deg = 0 }.deg.must_equal 0
|
60
|
+
subject_2.tap { |s| s.deg = 5 }.deg.must_equal 10
|
61
|
+
subject_2.tap { |s| s.deg = 154 }.deg.must_equal 150
|
62
|
+
subject_2.tap { |s| s.deg = 359 }.deg.must_equal 0
|
63
|
+
subject_2.tap { |s| s.deg = 360 }.deg.must_equal 0
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "precision=3" do
|
68
|
+
it "accepts 1 degree steps" do
|
69
|
+
subject_3.tap { |s| s.deg = 0 }.deg.must_equal 0
|
70
|
+
subject_3.tap { |s| s.deg = 5 }.deg.must_equal 5
|
71
|
+
subject_3.tap { |s| s.deg = 154 }.deg.must_equal 154
|
72
|
+
subject_3.tap { |s| s.deg = 359 }.deg.must_equal 359
|
73
|
+
subject_3.tap { |s| s.deg = 360 }.deg.must_equal 0
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe :suffix= do
|
79
|
+
context "precision=2" do
|
80
|
+
it "fails on invalid values" do
|
81
|
+
[123, 'r'].wont_be_written_to subject_2, :suffix
|
82
|
+
end
|
83
|
+
|
84
|
+
it "accepts nil value" do
|
85
|
+
[nil].must_be_written_to subject_2, :suffix
|
86
|
+
end
|
87
|
+
|
88
|
+
it "symbolizes valid values" do
|
89
|
+
subject_2.tap { |s| s.suffix = 'Z' }.suffix.must_equal :Z
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context "precision=3" do
|
94
|
+
it "always fails" do
|
95
|
+
-> { subject_3.tap { |s| s.suffix = 'Z' } }.must_raise RuntimeError
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe :invert do
|
101
|
+
it "must calculate inverse deg correctly" do
|
102
|
+
{ 0 => 180, 90 => 270, 179 => 359, 180 => 0, 270 => 90, 359 => 179, 360 => 180 }.each do |from, to|
|
103
|
+
AIXM.a(from).invert.deg.must_equal to
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
it "must invert left/right suffix" do
|
108
|
+
AIXM.a('34L').invert.suffix.must_equal :R
|
109
|
+
end
|
110
|
+
|
111
|
+
it "must leave other suffixes untouched" do
|
112
|
+
AIXM.a('35X').invert.suffix.must_equal :X
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe :inverse_of? do
|
117
|
+
it "must return true for inverse pairs" do
|
118
|
+
AIXM.a('34L').inverse_of?(AIXM.a('16R')).must_equal true
|
119
|
+
end
|
120
|
+
|
121
|
+
it "must return false for non-inverse pairs" do
|
122
|
+
AIXM.a('34L').inverse_of?(AIXM.a('12L')).must_equal false
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe :+ do
|
127
|
+
context "precision=2" do
|
128
|
+
it "adds degrees as Integer" do
|
129
|
+
(subject_2 + 14).must_equal AIXM.a('01')
|
130
|
+
(subject_2 + 16).must_equal AIXM.a('02')
|
131
|
+
(subject_2 + 370).must_equal AIXM.a('01')
|
132
|
+
(AIXM.a('05L') + 20).must_equal AIXM.a('07L')
|
133
|
+
end
|
134
|
+
|
135
|
+
it "adds another angle" do
|
136
|
+
(AIXM.a('10') + AIXM.a('08')).must_equal AIXM.a('18')
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context "precision=3" do
|
141
|
+
it "adds degrees as Integer" do
|
142
|
+
(subject_3 + 15).must_equal AIXM.a(15)
|
143
|
+
(subject_3 + 370).must_equal AIXM.a(10)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe :- do
|
149
|
+
context "precision=2" do
|
150
|
+
it "subtracts degrees as Integer" do
|
151
|
+
(subject_2 - 14).must_equal AIXM.a('35')
|
152
|
+
(subject_2 - 16).must_equal AIXM.a('34')
|
153
|
+
(AIXM.a('05') - 20).must_equal AIXM.a('03')
|
154
|
+
(AIXM.a('05L') - 20).must_equal AIXM.a('03L')
|
155
|
+
end
|
156
|
+
|
157
|
+
it "subtracts another angle" do
|
158
|
+
(AIXM.a('10') - AIXM.a('08')).must_equal AIXM.a('02')
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context "precision=3" do
|
163
|
+
it "subtracts degrees as Integer" do
|
164
|
+
(subject_3 - 15).must_equal AIXM.a(345)
|
165
|
+
(AIXM.a(55) - 20).must_equal AIXM.a(35)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe :== do
|
171
|
+
it "recognizes angles with identical deg and suffix as equal" do
|
172
|
+
AIXM.a('34L').must_equal AIXM.a('34L')
|
173
|
+
end
|
174
|
+
|
175
|
+
it "recognizes angles with different deg or suffix as unequal" do
|
176
|
+
AIXM.a('34L').wont_equal AIXM.a('35L')
|
177
|
+
AIXM.a('34L').wont_equal AIXM.a('34R')
|
178
|
+
end
|
179
|
+
|
180
|
+
it "recognizes angles with different precision as unequal" do
|
181
|
+
AIXM.a('34').wont_equal AIXM.a(340)
|
182
|
+
end
|
183
|
+
|
184
|
+
it "recognizes objects of different class as unequal" do
|
185
|
+
subject_2.wont_equal :oggy
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
describe :hash do
|
190
|
+
it "returns an integer" do
|
191
|
+
subject_2.hash.must_be_instance_of Integer
|
192
|
+
end
|
193
|
+
|
194
|
+
it "returns different hashes for different precisions" do
|
195
|
+
subject_2.hash.wont_equal subject_3.hash
|
196
|
+
end
|
197
|
+
|
198
|
+
it "allows for the use of instances as hash keys" do
|
199
|
+
dupe = subject_2.dup
|
200
|
+
{ subject_2 => true }[dupe].must_equal true
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
@@ -47,21 +47,6 @@ describe AIXM::Component::Helipad do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
describe :composition= do
|
51
|
-
it "fails on invalid values" do
|
52
|
-
[:foobar, 123].wont_be_written_to subject, :composition
|
53
|
-
end
|
54
|
-
|
55
|
-
it "accepts nil value" do
|
56
|
-
[nil].must_be_written_to subject, :composition
|
57
|
-
end
|
58
|
-
|
59
|
-
it "looks up valid values" do
|
60
|
-
subject.tap { |s| s.composition = :macadam }.composition.must_equal :macadam
|
61
|
-
subject.tap { |s| s.composition = :GRADE }.composition.must_equal :graded_earth
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
50
|
describe :status= do
|
66
51
|
it "fails on invalid values" do
|
67
52
|
[:foobar, 123].wont_be_written_to subject, :status
|
@@ -100,7 +85,15 @@ describe AIXM::Component::Helipad do
|
|
100
85
|
<valLen>20</valLen>
|
101
86
|
<valWid>20</valWid>
|
102
87
|
<uomDim>M</uomDim>
|
103
|
-
<codeComposition>
|
88
|
+
<codeComposition>CONC</codeComposition>
|
89
|
+
<codePreparation>PAVED</codePreparation>
|
90
|
+
<codeCondSfc>FAIR</codeCondSfc>
|
91
|
+
<valPcnClass>30</valPcnClass>
|
92
|
+
<codePcnPavementType>F</codePcnPavementType>
|
93
|
+
<codePcnPavementSubgrade>A</codePcnPavementSubgrade>
|
94
|
+
<codePcnMaxTirePressure>W</codePcnMaxTirePressure>
|
95
|
+
<codePcnEvalMethod>U</codePcnEvalMethod>
|
96
|
+
<txtPcnNote>Cracks near the center.</txtPcnNote>
|
104
97
|
<codeSts>OTHER</codeSts>
|
105
98
|
<txtRmk>Authorizaton by AD operator required</txtRmk>
|
106
99
|
</Tla>
|
@@ -109,7 +102,8 @@ describe AIXM::Component::Helipad do
|
|
109
102
|
|
110
103
|
it "builds correct minimal OFMX" do
|
111
104
|
AIXM.ofmx!
|
112
|
-
|
105
|
+
%i(z length width status remarks).each { |a| subject.send(:"#{a}=", nil) }
|
106
|
+
%i(composition preparation condition pcn remarks).each { |a| subject.surface.send(:"#{a}=", nil) }
|
113
107
|
subject.to_xml.must_equal <<~END
|
114
108
|
<Tla>
|
115
109
|
<TlaUid>
|
@@ -7,13 +7,13 @@ describe AIXM::Component::Runway do
|
|
7
7
|
|
8
8
|
describe :initialize do
|
9
9
|
it "sets defaults for bidirectional runways" do
|
10
|
-
subject.forth.name.must_equal AIXM.
|
11
|
-
subject.back.name.must_equal AIXM.
|
10
|
+
subject.forth.name.must_equal AIXM.a('16L')
|
11
|
+
subject.back.name.must_equal AIXM.a('34R')
|
12
12
|
end
|
13
13
|
|
14
14
|
it "sets defaults for unidirectional runways" do
|
15
15
|
subject = AIXM::Component::Runway.new(name: '30')
|
16
|
-
subject.forth.name.must_equal AIXM.
|
16
|
+
subject.forth.name.must_equal AIXM.a('30')
|
17
17
|
subject.back.must_be_nil
|
18
18
|
end
|
19
19
|
|
@@ -52,21 +52,6 @@ describe AIXM::Component::Runway do
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
-
describe :composition= do
|
56
|
-
it "fails on invalid values" do
|
57
|
-
[:foobar, 123].wont_be_written_to subject, :composition
|
58
|
-
end
|
59
|
-
|
60
|
-
it "accepts nil value" do
|
61
|
-
[nil].must_be_written_to subject, :composition
|
62
|
-
end
|
63
|
-
|
64
|
-
it "looks up valid values" do
|
65
|
-
subject.tap { |s| s.composition = :macadam }.composition.must_equal :macadam
|
66
|
-
subject.tap { |s| s.composition = :GRADE }.composition.must_equal :graded_earth
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
55
|
describe :status= do
|
71
56
|
it "fails on invalid values" do
|
72
57
|
[:foobar, 123].wont_be_written_to subject, :status
|
@@ -100,7 +85,15 @@ describe AIXM::Component::Runway do
|
|
100
85
|
<valLen>650</valLen>
|
101
86
|
<valWid>80</valWid>
|
102
87
|
<uomDimRwy>M</uomDimRwy>
|
103
|
-
<codeComposition>
|
88
|
+
<codeComposition>ASPH</codeComposition>
|
89
|
+
<codePreparation>PAVED</codePreparation>
|
90
|
+
<codeCondSfc>GOOD</codeCondSfc>
|
91
|
+
<valPcnClass>59</valPcnClass>
|
92
|
+
<codePcnPavementType>F</codePcnPavementType>
|
93
|
+
<codePcnPavementSubgrade>A</codePcnPavementSubgrade>
|
94
|
+
<codePcnMaxTirePressure>W</codePcnMaxTirePressure>
|
95
|
+
<codePcnEvalMethod>T</codePcnEvalMethod>
|
96
|
+
<txtPcnNote>Paved shoulder on 2.5m on each side of the RWY.</txtPcnNote>
|
104
97
|
<codeSts>CLSD</codeSts>
|
105
98
|
<txtRmk>Markings eroded</txtRmk>
|
106
99
|
</Rwy>
|
@@ -118,8 +111,9 @@ describe AIXM::Component::Runway do
|
|
118
111
|
<geoLong>004.75216944E</geoLong>
|
119
112
|
<valTrueBrg>165</valTrueBrg>
|
120
113
|
<valMagBrg>166</valMagBrg>
|
121
|
-
<valElevTdz>
|
114
|
+
<valElevTdz>145</valElevTdz>
|
122
115
|
<uomElevTdz>FT</uomElevTdz>
|
116
|
+
<codeVfrPattern>E</codeVfrPattern>
|
123
117
|
<txtRmk>forth remarks</txtRmk>
|
124
118
|
</Rdn>
|
125
119
|
<Rdd>
|
@@ -154,6 +148,9 @@ describe AIXM::Component::Runway do
|
|
154
148
|
<geoLong>004.75645556E</geoLong>
|
155
149
|
<valTrueBrg>345</valTrueBrg>
|
156
150
|
<valMagBrg>346</valMagBrg>
|
151
|
+
<valElevTdz>147</valElevTdz>
|
152
|
+
<uomElevTdz>FT</uomElevTdz>
|
153
|
+
<codeVfrPattern>L</codeVfrPattern>
|
157
154
|
<txtRmk>back remarks</txtRmk>
|
158
155
|
</Rdn>
|
159
156
|
<Rdd>
|
@@ -179,7 +176,8 @@ describe AIXM::Component::Runway do
|
|
179
176
|
|
180
177
|
it "builds correct minimal OFMX" do
|
181
178
|
AIXM.ofmx!
|
182
|
-
%i(length width
|
179
|
+
%i(length width status remarks).each { |a| subject.send(:"#{a}=", nil) }
|
180
|
+
%i(composition preparation condition pcn remarks).each { |a| subject.surface.send(:"#{a}=", nil) }
|
183
181
|
subject.to_xml.must_equal <<~END
|
184
182
|
<Rwy>
|
185
183
|
<RwyUid>
|
@@ -203,8 +201,9 @@ describe AIXM::Component::Runway do
|
|
203
201
|
<geoLong>004.75216944E</geoLong>
|
204
202
|
<valTrueBrg>165</valTrueBrg>
|
205
203
|
<valMagBrg>166</valMagBrg>
|
206
|
-
<valElevTdz>
|
204
|
+
<valElevTdz>145</valElevTdz>
|
207
205
|
<uomElevTdz>FT</uomElevTdz>
|
206
|
+
<codeVfrPattern>E</codeVfrPattern>
|
208
207
|
<txtRmk>forth remarks</txtRmk>
|
209
208
|
</Rdn>
|
210
209
|
<Rdd>
|
@@ -239,6 +238,9 @@ describe AIXM::Component::Runway do
|
|
239
238
|
<geoLong>004.75645556E</geoLong>
|
240
239
|
<valTrueBrg>345</valTrueBrg>
|
241
240
|
<valMagBrg>346</valMagBrg>
|
241
|
+
<valElevTdz>147</valElevTdz>
|
242
|
+
<uomElevTdz>FT</uomElevTdz>
|
243
|
+
<codeVfrPattern>L</codeVfrPattern>
|
242
244
|
<txtRmk>back remarks</txtRmk>
|
243
245
|
</Rdn>
|
244
246
|
<Rdd>
|
@@ -277,18 +279,14 @@ describe AIXM::Component::Runway::Direction do
|
|
277
279
|
|
278
280
|
it "overwrites preset name" do
|
279
281
|
subject.name.to_s.must_equal '16L'
|
280
|
-
subject.name = AIXM.
|
282
|
+
subject.name = AIXM.a('34L')
|
281
283
|
subject.name.to_s.must_equal '34L'
|
282
284
|
end
|
283
285
|
end
|
284
286
|
|
285
287
|
describe :geographic_orientation= do
|
286
288
|
it "fails on invalid values" do
|
287
|
-
[:foobar, -1,
|
288
|
-
end
|
289
|
-
|
290
|
-
it "converts valid Numeric values to integer" do
|
291
|
-
subject.tap { |s| s.geographic_orientation = 100.5 }.geographic_orientation.must_equal 100
|
289
|
+
[:foobar, -1, 10].wont_be_written_to subject, :geographic_orientation
|
292
290
|
end
|
293
291
|
end
|
294
292
|
|
@@ -320,14 +318,29 @@ describe AIXM::Component::Runway::Direction do
|
|
320
318
|
end
|
321
319
|
end
|
322
320
|
|
321
|
+
describe :vfr_pattern= do
|
322
|
+
it "fails on invalid values" do
|
323
|
+
[:foobar, 123].wont_be_written_to subject, :vfr_pattern
|
324
|
+
end
|
325
|
+
|
326
|
+
it "accepts nil value" do
|
327
|
+
[nil].must_be_written_to subject, :vfr_pattern
|
328
|
+
end
|
329
|
+
|
330
|
+
it "looks up valid values" do
|
331
|
+
subject.tap { |s| s.vfr_pattern = :left }.vfr_pattern.must_equal :left
|
332
|
+
subject.tap { |s| s.vfr_pattern = :E }.vfr_pattern.must_equal :left_or_right
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
323
336
|
describe :remarks= do
|
324
337
|
macro :remarks
|
325
338
|
end
|
326
339
|
|
327
340
|
describe :magnetic_orientation do
|
328
341
|
it "is calculated correctly" do
|
329
|
-
subject.geographic_orientation = 16
|
330
|
-
subject.magnetic_orientation.must_equal 17
|
342
|
+
subject.geographic_orientation = AIXM.a(16)
|
343
|
+
subject.magnetic_orientation.must_equal AIXM.a(17)
|
331
344
|
end
|
332
345
|
end
|
333
346
|
|
@@ -349,8 +362,9 @@ describe AIXM::Component::Runway::Direction do
|
|
349
362
|
<geoLong>004.75216944E</geoLong>
|
350
363
|
<valTrueBrg>165</valTrueBrg>
|
351
364
|
<valMagBrg>166</valMagBrg>
|
352
|
-
<valElevTdz>
|
365
|
+
<valElevTdz>145</valElevTdz>
|
353
366
|
<uomElevTdz>FT</uomElevTdz>
|
367
|
+
<codeVfrPattern>E</codeVfrPattern>
|
354
368
|
<txtRmk>forth remarks</txtRmk>
|
355
369
|
</Rdn>
|
356
370
|
<Rdd>
|
@@ -376,7 +390,7 @@ describe AIXM::Component::Runway::Direction do
|
|
376
390
|
|
377
391
|
it "builds correct minimal OFMX" do
|
378
392
|
AIXM.ofmx!
|
379
|
-
%i(geographic_orientation z displaced_threshold remarks).each { |a| subject.send(:"#{a}=", nil) }
|
393
|
+
%i(geographic_orientation z displaced_threshold vfr_pattern remarks).each { |a| subject.send(:"#{a}=", nil) }
|
380
394
|
subject.to_xml.must_equal <<~END
|
381
395
|
<Rdn>
|
382
396
|
<RdnUid>
|