aixm 0.3.8 → 0.3.10

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 (115) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +33 -3
  5. data/README.md +166 -56
  6. data/exe/ckmid +14 -0
  7. data/exe/mkmid +14 -0
  8. data/lib/aixm.rb +16 -6
  9. data/lib/aixm/association.rb +369 -0
  10. data/lib/aixm/classes.rb +43 -0
  11. data/lib/aixm/component/fato.rb +45 -53
  12. data/lib/aixm/component/frequency.rb +11 -12
  13. data/lib/aixm/component/geometry.rb +36 -38
  14. data/lib/aixm/component/geometry/arc.rb +2 -2
  15. data/lib/aixm/component/geometry/border.rb +6 -3
  16. data/lib/aixm/component/geometry/circle.rb +8 -2
  17. data/lib/aixm/component/geometry/point.rb +8 -2
  18. data/lib/aixm/component/helipad.rb +30 -38
  19. data/lib/aixm/component/layer.rb +28 -19
  20. data/lib/aixm/component/lighting.rb +12 -13
  21. data/lib/aixm/component/runway.rb +44 -48
  22. data/lib/aixm/{feature → component}/service.rb +37 -36
  23. data/lib/aixm/component/surface.rb +3 -3
  24. data/lib/aixm/component/timetable.rb +2 -2
  25. data/lib/aixm/component/{vertical_limits.rb → vertical_limit.rb} +12 -6
  26. data/lib/aixm/config.rb +2 -1
  27. data/lib/aixm/document.rb +27 -50
  28. data/lib/aixm/executables.rb +85 -0
  29. data/lib/aixm/feature.rb +13 -3
  30. data/lib/aixm/feature/address.rb +12 -13
  31. data/lib/aixm/feature/airport.rb +103 -128
  32. data/lib/aixm/feature/airspace.rb +44 -17
  33. data/lib/aixm/feature/navigational_aid.rb +7 -9
  34. data/lib/aixm/feature/navigational_aid/designated_point.rb +13 -15
  35. data/lib/aixm/feature/navigational_aid/dme.rb +11 -12
  36. data/lib/aixm/feature/navigational_aid/marker.rb +7 -3
  37. data/lib/aixm/feature/navigational_aid/ndb.rb +7 -3
  38. data/lib/aixm/feature/navigational_aid/tacan.rb +7 -3
  39. data/lib/aixm/feature/navigational_aid/vor.rb +23 -15
  40. data/lib/aixm/feature/obstacle.rb +29 -43
  41. data/lib/aixm/feature/obstacle_group.rb +37 -34
  42. data/lib/aixm/feature/organisation.rb +21 -5
  43. data/lib/aixm/feature/unit.rb +36 -46
  44. data/lib/aixm/memoize.rb +89 -0
  45. data/lib/aixm/object.rb +9 -0
  46. data/lib/aixm/payload_hash.rb +114 -0
  47. data/lib/aixm/refinements.rb +29 -76
  48. data/lib/aixm/shortcuts.rb +5 -42
  49. data/lib/aixm/version.rb +1 -1
  50. data/lib/aixm/xy.rb +1 -1
  51. data/schemas/ofmx/0/OFMX-Features.xsd +152 -20
  52. data/schemas/ofmx/0/OFMX-Snapshot.xsd +0 -5
  53. metadata +107 -156
  54. metadata.gz.sig +2 -0
  55. data/.github/workflows/test.yml +0 -26
  56. data/.gitignore +0 -6
  57. data/.ruby-version +0 -1
  58. data/.yardopts +0 -3
  59. data/Guardfile +0 -8
  60. data/aixm.gemspec +0 -35
  61. data/gems.rb +0 -3
  62. data/lib/aixm/component.rb +0 -6
  63. data/rakefile.rb +0 -36
  64. data/spec/factory.rb +0 -559
  65. data/spec/lib/aixm/a_spec.rb +0 -203
  66. data/spec/lib/aixm/component/fato_spec.rb +0 -267
  67. data/spec/lib/aixm/component/frequency_spec.rb +0 -74
  68. data/spec/lib/aixm/component/geometry/arc_spec.rb +0 -73
  69. data/spec/lib/aixm/component/geometry/border_spec.rb +0 -38
  70. data/spec/lib/aixm/component/geometry/circle_spec.rb +0 -68
  71. data/spec/lib/aixm/component/geometry/point_spec.rb +0 -37
  72. data/spec/lib/aixm/component/geometry_spec.rb +0 -316
  73. data/spec/lib/aixm/component/helipad_spec.rb +0 -193
  74. data/spec/lib/aixm/component/layer_spec.rb +0 -135
  75. data/spec/lib/aixm/component/lighting_spec.rb +0 -94
  76. data/spec/lib/aixm/component/runway_spec.rb +0 -479
  77. data/spec/lib/aixm/component/surface_spec.rb +0 -124
  78. data/spec/lib/aixm/component/timetable_spec.rb +0 -47
  79. data/spec/lib/aixm/component/vertical_limits_spec.rb +0 -94
  80. data/spec/lib/aixm/config_spec.rb +0 -41
  81. data/spec/lib/aixm/d_spec.rb +0 -150
  82. data/spec/lib/aixm/document_spec.rb +0 -1884
  83. data/spec/lib/aixm/errors_spec.rb +0 -14
  84. data/spec/lib/aixm/f_spec.rb +0 -85
  85. data/spec/lib/aixm/feature/address_spec.rb +0 -60
  86. data/spec/lib/aixm/feature/airport_spec.rb +0 -776
  87. data/spec/lib/aixm/feature/airspace_spec.rb +0 -394
  88. data/spec/lib/aixm/feature/navigational_aid/designated_point_spec.rb +0 -103
  89. data/spec/lib/aixm/feature/navigational_aid/dme_spec.rb +0 -98
  90. data/spec/lib/aixm/feature/navigational_aid/marker_spec.rb +0 -85
  91. data/spec/lib/aixm/feature/navigational_aid/ndb_spec.rb +0 -95
  92. data/spec/lib/aixm/feature/navigational_aid/tacan_spec.rb +0 -94
  93. data/spec/lib/aixm/feature/navigational_aid/vor_spec.rb +0 -251
  94. data/spec/lib/aixm/feature/navigational_aid_spec.rb +0 -52
  95. data/spec/lib/aixm/feature/obstacle_group_spec.rb +0 -330
  96. data/spec/lib/aixm/feature/obstacle_spec.rb +0 -284
  97. data/spec/lib/aixm/feature/organisation_spec.rb +0 -83
  98. data/spec/lib/aixm/feature/service_spec.rb +0 -59
  99. data/spec/lib/aixm/feature/unit_spec.rb +0 -238
  100. data/spec/lib/aixm/feature_spec.rb +0 -38
  101. data/spec/lib/aixm/p_spec.rb +0 -189
  102. data/spec/lib/aixm/refinements_spec.rb +0 -430
  103. data/spec/lib/aixm/version_spec.rb +0 -7
  104. data/spec/lib/aixm/w_spec.rb +0 -150
  105. data/spec/lib/aixm/xy_spec.rb +0 -180
  106. data/spec/lib/aixm/z_spec.rb +0 -94
  107. data/spec/macros/marking.rb +0 -12
  108. data/spec/macros/organisation.rb +0 -11
  109. data/spec/macros/remarks.rb +0 -12
  110. data/spec/macros/timetable.rb +0 -11
  111. data/spec/macros/xy.rb +0 -11
  112. data/spec/macros/z_qnh.rb +0 -11
  113. data/spec/sounds/failure.mp3 +0 -0
  114. data/spec/sounds/success.mp3 +0 -0
  115. data/spec/spec_helper.rb +0 -62
@@ -1,394 +0,0 @@
1
- require_relative '../../../spec_helper'
2
-
3
- describe AIXM::Feature::Airspace do
4
-
5
- context "only required attributes set" do
6
- subject do
7
- AIXM.airspace(type: "TMA", name: "Test TMA")
8
- end
9
-
10
- describe :initialize do
11
- it "sets defaults" do
12
- _(subject.id).must_equal 'C55466EC'
13
- _(subject.layers).must_equal []
14
- _(subject.geometry).must_be_instance_of AIXM::Component::Geometry
15
- end
16
- end
17
-
18
- describe :id= do
19
- it "fails on invalid values" do
20
- _([:foobar, 123]).wont_be_written_to subject, :id
21
- end
22
-
23
- it "falls back to id derived from digest of type, local_type and name" do
24
- _(subject.tap { |s| s.id = nil }.id).must_equal 'C55466EC'
25
- end
26
-
27
- it "upcases value" do
28
- _(subject.tap { |s| s.id = 'löl' }.id).must_equal 'LOEL'
29
- end
30
- end
31
-
32
- describe :type= do
33
- it "fails on invalid values" do
34
- _([nil, :foobar, 123]).wont_be_written_to subject, :type
35
- end
36
-
37
- it "looks up valid values" do
38
- _(subject.tap { |s| s.type = :danger_area }.type).must_equal :danger_area
39
- _(subject.tap { |s| s.type = :P }.type).must_equal :prohibited_area
40
- end
41
- end
42
-
43
- describe :local_type= do
44
- it "fails on invalid values" do
45
- _([:foobar, 123]).wont_be_written_to subject, :local_type
46
- end
47
-
48
- it "accepts nil value" do
49
- _([nil]).must_be_written_to subject, :local_type
50
- end
51
-
52
- it "upcases value" do
53
- _(subject.tap { |s| s.local_type = 'löl' }.local_type).must_equal 'LOEL'
54
- end
55
- end
56
-
57
- describe :name= do
58
- it "fails on invalid values" do
59
- _([:foobar, 123]).wont_be_written_to subject, :name
60
- end
61
-
62
- it "accepts nil value" do
63
- _([nil]).must_be_written_to subject, :name
64
- end
65
-
66
- it "upcases value" do
67
- _(subject.tap { |s| s.name = 'löl' }.name).must_equal 'LOEL'
68
- end
69
- end
70
-
71
- describe :to_uid do
72
- it "builds with arbitrary tag" do
73
- _(subject.to_uid).must_match(/<AseUid>/)
74
- _(subject.to_uid(as: :FooBar)).must_match(/<FooBar>/)
75
- end
76
- end
77
-
78
- describe :to_xml do
79
- it "fails to build AIXM since geometry is not closed" do
80
- subject.layers << AIXM::Factory.layer
81
- _{ subject.to_xml }.must_raise AIXM::GeometryError
82
- end
83
-
84
- it "fails to build AIXM since layers are not defined" do
85
- subject.geometry = AIXM::Factory.circle_geometry
86
- _{ subject.to_xml }.must_raise AIXM::LayerError
87
- end
88
- end
89
- end
90
-
91
- context "only required attributes, geometry and layers set" do
92
- subject do
93
- AIXM.airspace(type: "TMA", name: "Test TMA").tap do |airspace|
94
- airspace.geometry = AIXM::Factory.circle_geometry
95
- airspace.layers << AIXM::Factory.layer
96
- end
97
- end
98
-
99
- describe :to_xml do
100
- it "builds correct AIXM without id" do
101
- _(subject.to_xml).must_match(%r{<codeId>C55466EC</codeId>})
102
- end
103
-
104
- it "builds correct AIXM without short name" do
105
- _(subject.to_xml).wont_match(/<txtLocalType>/)
106
- end
107
-
108
- it "builds correct AIXM with identical name and short name" do
109
- _(subject.to_xml).wont_match(/<txtLocalType>/)
110
- end
111
- end
112
- end
113
-
114
- context "with one layer" do
115
- subject do
116
- AIXM::Factory.polygon_airspace
117
- end
118
-
119
- describe :to_xml do
120
- it "builds correct complete OFMX" do
121
- AIXM.ofmx!
122
- _(subject.to_xml).must_equal <<~"END"
123
- <!-- Airspace: [D] POLYGON AIRSPACE -->
124
- <Ase source="LF|GEN|0.0 FACTORY|0|0">
125
- <AseUid>
126
- <codeType>D</codeType>
127
- <codeId>PA</codeId>
128
- </AseUid>
129
- <txtLocalType>POLYGON</txtLocalType>
130
- <txtName>POLYGON AIRSPACE</txtName>
131
- <codeClass>C</codeClass>
132
- <codeLocInd>XXXX</codeLocInd>
133
- <codeActivity>TFC-AD</codeActivity>
134
- <codeDistVerUpper>STD</codeDistVerUpper>
135
- <valDistVerUpper>65</valDistVerUpper>
136
- <uomDistVerUpper>FL</uomDistVerUpper>
137
- <codeDistVerLower>STD</codeDistVerLower>
138
- <valDistVerLower>45</valDistVerLower>
139
- <uomDistVerLower>FL</uomDistVerLower>
140
- <codeDistVerMax>ALT</codeDistVerMax>
141
- <valDistVerMax>6000</valDistVerMax>
142
- <uomDistVerMax>FT</uomDistVerMax>
143
- <codeDistVerMnm>HEI</codeDistVerMnm>
144
- <valDistVerMnm>3000</valDistVerMnm>
145
- <uomDistVerMnm>FT</uomDistVerMnm>
146
- <Att>
147
- <codeWorkHr>H24</codeWorkHr>
148
- </Att>
149
- <codeSelAvbl>Y</codeSelAvbl>
150
- <txtRmk>airspace layer</txtRmk>
151
- </Ase>
152
- <Abd>
153
- <AbdUid>
154
- <AseUid>
155
- <codeType>D</codeType>
156
- <codeId>PA</codeId>
157
- </AseUid>
158
- </AbdUid>
159
- <Avx>
160
- <codeType>CWA</codeType>
161
- <geoLat>47.85916667N</geoLat>
162
- <geoLong>007.56000000E</geoLong>
163
- <codeDatum>WGE</codeDatum>
164
- <geoLatArc>47.90416667N</geoLatArc>
165
- <geoLongArc>007.56333333E</geoLongArc>
166
- </Avx>
167
- <Avx>
168
- <GbrUid>
169
- <txtName>FRANCE_GERMANY</txtName>
170
- </GbrUid>
171
- <codeType>FNT</codeType>
172
- <geoLat>47.94361111N</geoLat>
173
- <geoLong>007.59583333E</geoLong>
174
- <codeDatum>WGE</codeDatum>
175
- </Avx>
176
- <Avx>
177
- <codeType>GRC</codeType>
178
- <geoLat>47.85916667N</geoLat>
179
- <geoLong>007.56000000E</geoLong>
180
- <codeDatum>WGE</codeDatum>
181
- </Avx>
182
- </Abd>
183
- END
184
- end
185
-
186
- it "builds correct minimal OFMX" do
187
- AIXM.ofmx!
188
- subject.local_type = subject.name = nil
189
- _(subject.to_xml).must_equal <<~"END"
190
- <!-- Airspace: [D] UNNAMED -->
191
- <Ase source="LF|GEN|0.0 FACTORY|0|0">
192
- <AseUid>
193
- <codeType>D</codeType>
194
- <codeId>PA</codeId>
195
- </AseUid>
196
- <codeClass>C</codeClass>
197
- <codeLocInd>XXXX</codeLocInd>
198
- <codeActivity>TFC-AD</codeActivity>
199
- <codeDistVerUpper>STD</codeDistVerUpper>
200
- <valDistVerUpper>65</valDistVerUpper>
201
- <uomDistVerUpper>FL</uomDistVerUpper>
202
- <codeDistVerLower>STD</codeDistVerLower>
203
- <valDistVerLower>45</valDistVerLower>
204
- <uomDistVerLower>FL</uomDistVerLower>
205
- <codeDistVerMax>ALT</codeDistVerMax>
206
- <valDistVerMax>6000</valDistVerMax>
207
- <uomDistVerMax>FT</uomDistVerMax>
208
- <codeDistVerMnm>HEI</codeDistVerMnm>
209
- <valDistVerMnm>3000</valDistVerMnm>
210
- <uomDistVerMnm>FT</uomDistVerMnm>
211
- <Att>
212
- <codeWorkHr>H24</codeWorkHr>
213
- </Att>
214
- <codeSelAvbl>Y</codeSelAvbl>
215
- <txtRmk>airspace layer</txtRmk>
216
- </Ase>
217
- <Abd>
218
- <AbdUid>
219
- <AseUid>
220
- <codeType>D</codeType>
221
- <codeId>PA</codeId>
222
- </AseUid>
223
- </AbdUid>
224
- <Avx>
225
- <codeType>CWA</codeType>
226
- <geoLat>47.85916667N</geoLat>
227
- <geoLong>007.56000000E</geoLong>
228
- <codeDatum>WGE</codeDatum>
229
- <geoLatArc>47.90416667N</geoLatArc>
230
- <geoLongArc>007.56333333E</geoLongArc>
231
- </Avx>
232
- <Avx>
233
- <GbrUid>
234
- <txtName>FRANCE_GERMANY</txtName>
235
- </GbrUid>
236
- <codeType>FNT</codeType>
237
- <geoLat>47.94361111N</geoLat>
238
- <geoLong>007.59583333E</geoLong>
239
- <codeDatum>WGE</codeDatum>
240
- </Avx>
241
- <Avx>
242
- <codeType>GRC</codeType>
243
- <geoLat>47.85916667N</geoLat>
244
- <geoLong>007.56000000E</geoLong>
245
- <codeDatum>WGE</codeDatum>
246
- </Avx>
247
- </Abd>
248
- END
249
- end
250
- end
251
-
252
- it "builds OFMX with mid" do
253
- AIXM.ofmx!
254
- AIXM.config.mid_region = 'LF'
255
- _(subject.to_xml).must_match /<AseUid mid="8894c821-b486-8128-48f2-a47c2e9f4c13">/
256
- # _(subject.to_xml).must_match /<AbdUid mid="">/
257
- end
258
- end
259
-
260
- context "with two layers" do
261
- subject do
262
- AIXM::Factory.polygon_airspace.tap do |airspace|
263
- airspace.layers << AIXM::Factory.layer
264
- end
265
- end
266
-
267
- describe :to_xml do
268
- it "builds correct OFMX" do
269
- AIXM.ofmx!
270
- _(subject.to_xml).must_equal <<~"END"
271
- <!-- Airspace: [D] POLYGON AIRSPACE -->
272
- <Ase source="LF|GEN|0.0 FACTORY|0|0">
273
- <AseUid>
274
- <codeType>D</codeType>
275
- <codeId>PA</codeId>
276
- </AseUid>
277
- <txtLocalType>POLYGON</txtLocalType>
278
- <txtName>POLYGON AIRSPACE</txtName>
279
- </Ase>
280
- <Abd>
281
- <AbdUid>
282
- <AseUid>
283
- <codeType>D</codeType>
284
- <codeId>PA</codeId>
285
- </AseUid>
286
- </AbdUid>
287
- <Avx>
288
- <codeType>CWA</codeType>
289
- <geoLat>47.85916667N</geoLat>
290
- <geoLong>007.56000000E</geoLong>
291
- <codeDatum>WGE</codeDatum>
292
- <geoLatArc>47.90416667N</geoLatArc>
293
- <geoLongArc>007.56333333E</geoLongArc>
294
- </Avx>
295
- <Avx>
296
- <GbrUid>
297
- <txtName>FRANCE_GERMANY</txtName>
298
- </GbrUid>
299
- <codeType>FNT</codeType>
300
- <geoLat>47.94361111N</geoLat>
301
- <geoLong>007.59583333E</geoLong>
302
- <codeDatum>WGE</codeDatum>
303
- </Avx>
304
- <Avx>
305
- <codeType>GRC</codeType>
306
- <geoLat>47.85916667N</geoLat>
307
- <geoLong>007.56000000E</geoLong>
308
- <codeDatum>WGE</codeDatum>
309
- </Avx>
310
- </Abd>
311
- <Ase>
312
- <AseUid>
313
- <codeType>CLASS</codeType>
314
- <codeId>B794588D</codeId>
315
- </AseUid>
316
- <txtName>POLYGON AIRSPACE LAYER 1</txtName>
317
- <codeClass>C</codeClass>
318
- <codeLocInd>XXXX</codeLocInd>
319
- <codeActivity>TFC-AD</codeActivity>
320
- <codeDistVerUpper>STD</codeDistVerUpper>
321
- <valDistVerUpper>65</valDistVerUpper>
322
- <uomDistVerUpper>FL</uomDistVerUpper>
323
- <codeDistVerLower>STD</codeDistVerLower>
324
- <valDistVerLower>45</valDistVerLower>
325
- <uomDistVerLower>FL</uomDistVerLower>
326
- <codeDistVerMax>ALT</codeDistVerMax>
327
- <valDistVerMax>6000</valDistVerMax>
328
- <uomDistVerMax>FT</uomDistVerMax>
329
- <codeDistVerMnm>HEI</codeDistVerMnm>
330
- <valDistVerMnm>3000</valDistVerMnm>
331
- <uomDistVerMnm>FT</uomDistVerMnm>
332
- <Att>
333
- <codeWorkHr>H24</codeWorkHr>
334
- </Att>
335
- <codeSelAvbl>Y</codeSelAvbl>
336
- <txtRmk>airspace layer</txtRmk>
337
- </Ase>
338
- <Adg>
339
- <AdgUid>
340
- <AseUid>
341
- <codeType>CLASS</codeType>
342
- <codeId>B794588D</codeId>
343
- </AseUid>
344
- </AdgUid>
345
- <AseUidSameExtent>
346
- <codeType>D</codeType>
347
- <codeId>PA</codeId>
348
- </AseUidSameExtent>
349
- </Adg>
350
- <Ase>
351
- <AseUid>
352
- <codeType>CLASS</codeType>
353
- <codeId>64589EAF</codeId>
354
- </AseUid>
355
- <txtName>POLYGON AIRSPACE LAYER 2</txtName>
356
- <codeClass>C</codeClass>
357
- <codeLocInd>XXXX</codeLocInd>
358
- <codeActivity>TFC-AD</codeActivity>
359
- <codeDistVerUpper>STD</codeDistVerUpper>
360
- <valDistVerUpper>65</valDistVerUpper>
361
- <uomDistVerUpper>FL</uomDistVerUpper>
362
- <codeDistVerLower>STD</codeDistVerLower>
363
- <valDistVerLower>45</valDistVerLower>
364
- <uomDistVerLower>FL</uomDistVerLower>
365
- <codeDistVerMax>ALT</codeDistVerMax>
366
- <valDistVerMax>6000</valDistVerMax>
367
- <uomDistVerMax>FT</uomDistVerMax>
368
- <codeDistVerMnm>HEI</codeDistVerMnm>
369
- <valDistVerMnm>3000</valDistVerMnm>
370
- <uomDistVerMnm>FT</uomDistVerMnm>
371
- <Att>
372
- <codeWorkHr>H24</codeWorkHr>
373
- </Att>
374
- <codeSelAvbl>Y</codeSelAvbl>
375
- <txtRmk>airspace layer</txtRmk>
376
- </Ase>
377
- <Adg>
378
- <AdgUid>
379
- <AseUid>
380
- <codeType>CLASS</codeType>
381
- <codeId>64589EAF</codeId>
382
- </AseUid>
383
- </AdgUid>
384
- <AseUidSameExtent>
385
- <codeType>D</codeType>
386
- <codeId>PA</codeId>
387
- </AseUidSameExtent>
388
- </Adg>
389
- END
390
- end
391
- end
392
- end
393
-
394
- end
@@ -1,103 +0,0 @@
1
- require_relative '../../../../spec_helper'
2
-
3
- describe AIXM::Feature::NavigationalAid::DesignatedPoint do
4
- subject do
5
- AIXM::Factory.designated_point
6
- end
7
-
8
- describe :type= do
9
- it "fails on invalid values" do
10
- _([nil, :foobar, 123]).wont_be_written_to subject, :type
11
- end
12
-
13
- it "looks up valid values" do
14
- _(subject.tap { |s| s.type = :icao }.type).must_equal :icao
15
- _(subject.tap { |s| s.type = :'VFR-RP' }.type).must_equal :vfr_reporting_point
16
- end
17
- end
18
-
19
- describe :airport= do
20
- it "fails on invalid values" do
21
- _([:foobar, 123]).wont_be_written_to subject, :airport
22
- end
23
-
24
- it "accepts valid values" do
25
- _([nil, AIXM::Factory.airport]).must_be_written_to subject, :airport
26
- end
27
- end
28
-
29
- describe :kind do
30
- it "must return class/type combo" do
31
- _(subject.kind).must_equal "DesignatedPoint:VFR-RP"
32
- end
33
- end
34
-
35
- describe :to_xml do
36
- it "builds correct complete OFMX" do
37
- AIXM.ofmx!
38
- _(subject.to_xml).must_equal <<~END
39
- <!-- NavigationalAid: [DesignatedPoint:VFR-RP] DDD / DESIGNATED POINT NAVAID -->
40
- <Dpn source="LF|GEN|0.0 FACTORY|0|0">
41
- <DpnUid>
42
- <codeId>DDD</codeId>
43
- <geoLat>47.85916667N</geoLat>
44
- <geoLong>007.56000000E</geoLong>
45
- </DpnUid>
46
- <AhpUidAssoc>
47
- <codeId>LFNT</codeId>
48
- </AhpUidAssoc>
49
- <codeDatum>WGE</codeDatum>
50
- <codeType>VFR-RP</codeType>
51
- <txtName>DESIGNATED POINT NAVAID</txtName>
52
- <txtRmk>designated point navaid</txtRmk>
53
- </Dpn>
54
- END
55
- end
56
-
57
- it "builds correct minimal OFMX" do
58
- AIXM.ofmx!
59
- subject.name = subject.remarks = nil
60
- _(subject.to_xml).must_equal <<~END
61
- <!-- NavigationalAid: [DesignatedPoint:VFR-RP] DDD -->
62
- <Dpn source="LF|GEN|0.0 FACTORY|0|0">
63
- <DpnUid>
64
- <codeId>DDD</codeId>
65
- <geoLat>47.85916667N</geoLat>
66
- <geoLong>007.56000000E</geoLong>
67
- </DpnUid>
68
- <AhpUidAssoc>
69
- <codeId>LFNT</codeId>
70
- </AhpUidAssoc>
71
- <codeDatum>WGE</codeDatum>
72
- <codeType>VFR-RP</codeType>
73
- </Dpn>
74
- END
75
- end
76
-
77
- it "builds OFMX with mid" do
78
- AIXM.ofmx!
79
- AIXM.config.mid_region = 'LF'
80
- _(subject.to_xml).must_match /<DpnUid mid="b2977fe4-c591-0e72-8a5f-2e30d80f92d6">/
81
- end
82
-
83
- it "builds correct complete AIXM" do
84
- _(subject.to_xml).must_equal <<~END
85
- <!-- NavigationalAid: [DesignatedPoint:VFR-RP] DDD / DESIGNATED POINT NAVAID -->
86
- <Dpn>
87
- <DpnUid>
88
- <codeId>DDD</codeId>
89
- <geoLat>475133.00N</geoLat>
90
- <geoLong>0073336.00E</geoLong>
91
- </DpnUid>
92
- <AhpUidAssoc>
93
- <codeId>LFNT</codeId>
94
- </AhpUidAssoc>
95
- <codeDatum>WGE</codeDatum>
96
- <codeType>OTHER</codeType>
97
- <txtName>DESIGNATED POINT NAVAID</txtName>
98
- <txtRmk>designated point navaid</txtRmk>
99
- </Dpn>
100
- END
101
- end
102
- end
103
- end