aixm 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/CHANGELOG.md +9 -0
- data/lib/aixm/component/layer.rb +3 -1
- data/lib/aixm/component/runway.rb +11 -10
- data/lib/aixm/config.rb +1 -1
- data/lib/aixm/d.rb +19 -4
- data/lib/aixm/f.rb +12 -4
- data/lib/aixm/feature.rb +1 -1
- data/lib/aixm/h.rb +87 -0
- data/lib/aixm/refinements.rb +1 -1
- data/lib/aixm/shortcuts.rb +1 -0
- data/lib/aixm/version.rb +1 -1
- data/lib/aixm/xy.rb +16 -7
- data/lib/aixm/z.rb +13 -5
- data/lib/aixm.rb +1 -0
- data/spec/factory.rb +4 -0
- data/spec/lib/aixm/component/runway_spec.rb +15 -7
- data/spec/lib/aixm/d_spec.rb +36 -26
- data/spec/lib/aixm/document_spec.rb +1 -1
- data/spec/lib/aixm/f_spec.rb +23 -13
- data/spec/lib/aixm/h_spec.rb +113 -0
- data/spec/lib/aixm/xy_spec.rb +21 -10
- data/spec/lib/aixm/z_spec.rb +31 -20
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4e0b32c04cba8526128ce56c60abf4343b7ac8f2e8a3e8252e1046ce3ccbfe3
|
4
|
+
data.tar.gz: c88875a5a1921f90a1d4055302469c1608ae610bce5b513c9a3e2d50ed32f842
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0f11994c12259bee9a013b92162ed14f763206855adfb5f0d25fc45807a885da5b330010c1c7768590cd3cca19c260976c68674b0354091b2ef64288a70914e
|
7
|
+
data.tar.gz: 800ef3ea1d7e298281454957f3471e06452d9a23a4333c0f978c24590cd9fc140b21948d7588a07a896995731897810bffc317ae610e39822b6e27e51554cb10
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/lib/aixm/component/layer.rb
CHANGED
@@ -106,9 +106,11 @@ module AIXM
|
|
106
106
|
|
107
107
|
# @return [String]
|
108
108
|
def inspect
|
109
|
-
%Q(#<#{
|
109
|
+
%Q(#<#{original_class} class=#{@klass.inspect}>)
|
110
110
|
end
|
111
111
|
|
112
|
+
alias_method :original_class, :class
|
113
|
+
|
112
114
|
# @!attribute class
|
113
115
|
# @return [Symbol] class of layer (see {CLASSES})
|
114
116
|
def class
|
@@ -21,7 +21,7 @@ module AIXM
|
|
21
21
|
# runway.composition = COMPOSITIONS or nil
|
22
22
|
# runway.status = STATUSES or nil
|
23
23
|
# runway.remarks = String or nil
|
24
|
-
# runway.forth.name =
|
24
|
+
# runway.forth.name = AIXM.h # preset based on the runway name
|
25
25
|
# runway.forth.geographic_orientation = Integer or nil # degrees
|
26
26
|
# runway.forth.xy = AIXM.xy
|
27
27
|
# runway.forth.z = AIXM.z or nil
|
@@ -31,15 +31,15 @@ module AIXM
|
|
31
31
|
# @example Bidirectional runway
|
32
32
|
# runway = AIXM.runway(name: '16L/34R')
|
33
33
|
# runway.name # => '16L/34R'
|
34
|
-
# runway.forth.name = '16L'
|
34
|
+
# runway.forth.name.to_s = '16L'
|
35
35
|
# runway.forth.geographic_orientation = 165
|
36
|
-
# runway.back.name = '34R'
|
36
|
+
# runway.back.name.to_s = '34R'
|
37
37
|
# runway.back.geographic_orientation = 345
|
38
38
|
#
|
39
39
|
# @example Unidirectional runway:
|
40
40
|
# runway = AIXM.runway(name: '16L')
|
41
41
|
# runway.name # => '16L'
|
42
|
-
# runway.forth.name = '16L'
|
42
|
+
# runway.forth.name.to_s = '16L'
|
43
43
|
# runway.forth.geographic_orientation = 165
|
44
44
|
# runway.back = nil
|
45
45
|
#
|
@@ -97,8 +97,9 @@ module AIXM
|
|
97
97
|
def initialize(name:)
|
98
98
|
self.name = name
|
99
99
|
@name.split('/').tap do |forth, back|
|
100
|
-
@forth = Direction.new(runway: self, name: forth)
|
101
|
-
@back = Direction.new(runway: self, name: back) if back
|
100
|
+
@forth = Direction.new(runway: self, name: AIXM.h(forth))
|
101
|
+
@back = Direction.new(runway: self, name: AIXM.h(back)) if back
|
102
|
+
fail(ArgumentError, "invalid name") unless !@back || @back.name.inverse_of?(@forth.name)
|
102
103
|
end
|
103
104
|
end
|
104
105
|
|
@@ -183,7 +184,7 @@ module AIXM
|
|
183
184
|
# @return [AIXM::Component::Runway] runway the runway direction is further describing
|
184
185
|
attr_reader :runway
|
185
186
|
|
186
|
-
# @return [
|
187
|
+
# @return [AIXM::H] partial name of runway (e.g. "12" or "16L")
|
187
188
|
attr_reader :name
|
188
189
|
|
189
190
|
# @return [Integer, nil] geographic orientation (true bearing) in degrees
|
@@ -219,15 +220,15 @@ module AIXM
|
|
219
220
|
private :runway
|
220
221
|
|
221
222
|
def name=(value)
|
222
|
-
fail(ArgumentError, "invalid name") unless value.is_a?
|
223
|
-
@name = value
|
223
|
+
fail(ArgumentError, "invalid name") unless value.is_a? AIXM::H
|
224
|
+
@name = value
|
224
225
|
end
|
225
226
|
|
226
227
|
def geographic_orientation=(value)
|
227
228
|
return @geographic_orientation = nil if value.nil?
|
228
229
|
fail(ArgumentError, "invalid geographic orientation") unless value.is_a? Numeric
|
229
230
|
@geographic_orientation = value.to_i
|
230
|
-
fail(ArgumentError, "invalid geographic orientation") unless (
|
231
|
+
fail(ArgumentError, "invalid geographic orientation") unless (1..360).include? @geographic_orientation
|
231
232
|
end
|
232
233
|
|
233
234
|
def xy=(value)
|
data/lib/aixm/config.rb
CHANGED
@@ -9,7 +9,7 @@ module AIXM
|
|
9
9
|
},
|
10
10
|
ofmx: {
|
11
11
|
version: '0',
|
12
|
-
namespace: 'http://openflightmaps.org/
|
12
|
+
namespace: 'http://schema.openflightmaps.org/0/OFMX-Snapshot.xsd',
|
13
13
|
xsd: Pathname(__dir__).join('..', '..', 'schemas', 'ofmx', '0', 'OFMX-Snapshot.xsd'),
|
14
14
|
root: 'OFMX-Snapshot'
|
15
15
|
}
|
data/lib/aixm/d.rb
CHANGED
@@ -47,10 +47,6 @@ module AIXM
|
|
47
47
|
fail(ArgumentError, "invalid unit") unless UNITS.has_key? @unit
|
48
48
|
end
|
49
49
|
|
50
|
-
def <=>(other)
|
51
|
-
to_m.dist <=> other.to_m.dist
|
52
|
-
end
|
53
|
-
|
54
50
|
# @!method to_ft
|
55
51
|
# @!method to_km
|
56
52
|
# @!method to_m
|
@@ -62,5 +58,24 @@ module AIXM
|
|
62
58
|
self.class.new((dist * UNITS[unit][target_unit]).round(8), target_unit)
|
63
59
|
end
|
64
60
|
end
|
61
|
+
|
62
|
+
# @see Object#<=>
|
63
|
+
# @return [Integer]
|
64
|
+
def <=>(other)
|
65
|
+
to_m.dist <=> other.to_m.dist
|
66
|
+
end
|
67
|
+
|
68
|
+
# @see Object#==
|
69
|
+
# @return [Boolean]
|
70
|
+
def ==(other)
|
71
|
+
self.class === other && (self <=> other).zero?
|
72
|
+
end
|
73
|
+
alias_method :eql?, :==
|
74
|
+
|
75
|
+
# @see Object#hash
|
76
|
+
# @return [Integer]
|
77
|
+
def hash
|
78
|
+
to_s.hash
|
79
|
+
end
|
65
80
|
end
|
66
81
|
end
|
data/lib/aixm/f.rb
CHANGED
@@ -40,14 +40,22 @@ module AIXM
|
|
40
40
|
fail(ArgumentError, "invalid unit") unless UNITS.include? @unit
|
41
41
|
end
|
42
42
|
|
43
|
+
# @return [Boolean] whether this frequency is part of a frequency band
|
44
|
+
def between?(lower_freq, upper_freq, unit)
|
45
|
+
freq.between?(lower_freq, upper_freq) && self.unit == unit
|
46
|
+
end
|
47
|
+
|
48
|
+
# @see Object#==
|
43
49
|
# @return [Boolean]
|
44
50
|
def ==(other)
|
45
|
-
|
51
|
+
self.class === other && freq == other.freq && unit == other.unit
|
46
52
|
end
|
53
|
+
alias_method :eql?, :==
|
47
54
|
|
48
|
-
# @
|
49
|
-
|
50
|
-
|
55
|
+
# @see Object#hash
|
56
|
+
# @return [Integer]
|
57
|
+
def hash
|
58
|
+
to_s.hash
|
51
59
|
end
|
52
60
|
|
53
61
|
end
|
data/lib/aixm/feature.rb
CHANGED
data/lib/aixm/h.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
using AIXM::Refinements
|
2
|
+
|
3
|
+
module AIXM
|
4
|
+
|
5
|
+
# Heading of an aircraft or runway
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# AIXM.h(12)
|
9
|
+
# AIXM.h('12')
|
10
|
+
# AIXM.h('34L')
|
11
|
+
# AIXM.h('05X')
|
12
|
+
class H
|
13
|
+
SUFFIX_INVERSIONS = {
|
14
|
+
R: :L,
|
15
|
+
L: :R
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
# @return [Integer] heading
|
19
|
+
attr_reader :deg
|
20
|
+
|
21
|
+
# @return [Symbol, nil] suffix
|
22
|
+
attr_reader :suffix
|
23
|
+
|
24
|
+
def initialize(deg_and_suffix)
|
25
|
+
fail(ArgumentError, "invalid heading") unless deg_and_suffix.to_s =~ /\A(\d+)([A-Z]+)?\z/
|
26
|
+
self.deg, self.suffix = $1.to_i, $2
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [String]
|
30
|
+
def inspect
|
31
|
+
%Q(#<#{self.class} #{to_s}>)
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [String] human readable representation (e.g. "05" or "34L")
|
35
|
+
def to_s
|
36
|
+
[('%02d' % deg), suffix].map(&:to_s).join
|
37
|
+
end
|
38
|
+
|
39
|
+
def deg=(value)
|
40
|
+
fail(ArgumentError, "invalid deg") unless value.between?(1, 36)
|
41
|
+
@deg = value
|
42
|
+
end
|
43
|
+
|
44
|
+
def suffix=(value)
|
45
|
+
fail(ArgumentError, "invalid suffix") unless value.nil? || value.to_s =~ /\A[A-Z]+\z/
|
46
|
+
@suffix = value&.to_s&.to_sym
|
47
|
+
end
|
48
|
+
|
49
|
+
# Invert a heading by 180 degrees
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
# AIXM.h('12').invert # => AIXM.h(30)
|
53
|
+
# AIXM.h('34L').invert # => AIXM.h(16, 'R')
|
54
|
+
# AIXM.h('33X').invert # => AIXM.h(17, 'bravo')
|
55
|
+
#
|
56
|
+
# @return [AIXM::H] inverted heading
|
57
|
+
def invert
|
58
|
+
AIXM.h([(((deg + 17) % 36) + 1), SUFFIX_INVERSIONS.fetch(suffix, suffix)].join)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Check whether +other+ heading is the inverse
|
62
|
+
#
|
63
|
+
# @example
|
64
|
+
# AIXM.h('12').inverse_of? AIXM.h('30') # => true
|
65
|
+
# AIXM.h('34L').inverse_of? AIXM.h('16R') # => true
|
66
|
+
# AIXM.h('16R').inverse_of? AIXM.h('16L') # => false
|
67
|
+
#
|
68
|
+
# @return [AIXM::H] inverted heading
|
69
|
+
def inverse_of?(other)
|
70
|
+
invert == other
|
71
|
+
end
|
72
|
+
|
73
|
+
# @see Object#==
|
74
|
+
# @return [Boolean]
|
75
|
+
def ==(other)
|
76
|
+
self.class === other && deg == other.deg && suffix == other.suffix
|
77
|
+
end
|
78
|
+
alias_method :eql?, :==
|
79
|
+
|
80
|
+
# @see Object#hash
|
81
|
+
# @return [Integer]
|
82
|
+
def hash
|
83
|
+
to_s.hash
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
data/lib/aixm/refinements.rb
CHANGED
data/lib/aixm/shortcuts.rb
CHANGED
data/lib/aixm/version.rb
CHANGED
data/lib/aixm/xy.rb
CHANGED
@@ -6,12 +6,13 @@ module AIXM
|
|
6
6
|
#
|
7
7
|
# ===Recognized notations:
|
8
8
|
# * DD - examples: 12.12345678 (north or east), -12.12345678 (south or west)
|
9
|
-
# * DMS - examples: 11°22'33.44"N, 1112233.44W
|
9
|
+
# * DMS - examples: 11°22'33.44"N, 1112233.44W,
|
10
10
|
#
|
11
11
|
# @example All of the below are equivalent
|
12
|
+
# AIXM.xy(lat: 11.375955555555556, long: -111.37595555555555)
|
12
13
|
# AIXM.xy(lat: %q(11°22'33.44"), long: %q(-111°22'33.44"))
|
14
|
+
# AIXM.xy(lat: %q(11°22'33.44N"), long: %q(111°22'33.44W"))
|
13
15
|
# AIXM.xy(lat: '112233.44N', long: '1112233.44W')
|
14
|
-
# AIXM.xy(lat: 11.375955555555556, long: -111.37595555555555)
|
15
16
|
#
|
16
17
|
# @see https://github.com/openflightmaps/ofmx/wiki/Coordinates
|
17
18
|
class XY
|
@@ -63,11 +64,6 @@ module AIXM
|
|
63
64
|
end
|
64
65
|
end
|
65
66
|
|
66
|
-
# @return [Boolean]
|
67
|
-
def ==(other)
|
68
|
-
other.is_a?(self.class) && lat == other.lat && long == other.long
|
69
|
-
end
|
70
|
-
|
71
67
|
# @return [AIXM::D] distance as calculated by use of the Haversine formula
|
72
68
|
def distance(other)
|
73
69
|
if self == other
|
@@ -84,6 +80,19 @@ module AIXM
|
|
84
80
|
end
|
85
81
|
end
|
86
82
|
|
83
|
+
# @see Object#==
|
84
|
+
# @return [Boolean]
|
85
|
+
def ==(other)
|
86
|
+
self.class === other && lat == other.lat && long == other.long
|
87
|
+
end
|
88
|
+
alias_method :eql?, :==
|
89
|
+
|
90
|
+
# @see Object#hash
|
91
|
+
# @return [Integer]
|
92
|
+
def hash
|
93
|
+
to_s.hash
|
94
|
+
end
|
95
|
+
|
87
96
|
private
|
88
97
|
|
89
98
|
def float_for(value)
|
data/lib/aixm/z.rb
CHANGED
@@ -46,11 +46,6 @@ module AIXM
|
|
46
46
|
fail(ArgumentError, "invalid code") unless CODES.include? @code
|
47
47
|
end
|
48
48
|
|
49
|
-
# @return [Boolean]
|
50
|
-
def ==(other)
|
51
|
-
other.is_a?(self.class) && alt == other.alt && code == other.code
|
52
|
-
end
|
53
|
-
|
54
49
|
# @example
|
55
50
|
# z = AIXM.z(123, :qnh)
|
56
51
|
# z.qnh? # => true
|
@@ -74,6 +69,19 @@ module AIXM
|
|
74
69
|
qne? ? :fl : :ft
|
75
70
|
end
|
76
71
|
|
72
|
+
# @see Object#==
|
73
|
+
# @return [Boolean]
|
74
|
+
def ==(other)
|
75
|
+
self.class === other && alt == other.alt && code == other.code
|
76
|
+
end
|
77
|
+
alias_method :eql?, :==
|
78
|
+
|
79
|
+
# @see Object#hash
|
80
|
+
# @return [Integer]
|
81
|
+
def hash
|
82
|
+
to_s.hash
|
83
|
+
end
|
84
|
+
|
77
85
|
end
|
78
86
|
|
79
87
|
end
|
data/lib/aixm.rb
CHANGED
data/spec/factory.rb
CHANGED
@@ -7,15 +7,19 @@ 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 '16L'
|
11
|
-
subject.back.name.must_equal '34R'
|
10
|
+
subject.forth.name.must_equal AIXM.h('16L')
|
11
|
+
subject.back.name.must_equal AIXM.h('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 '30'
|
16
|
+
subject.forth.name.must_equal AIXM.h('30')
|
17
17
|
subject.back.must_be_nil
|
18
18
|
end
|
19
|
+
|
20
|
+
it "fails on non-inverse bidirectional runways" do
|
21
|
+
-> { AIXM.runway(name: '16L/14R') }.must_raise ArgumentError
|
22
|
+
end
|
19
23
|
end
|
20
24
|
|
21
25
|
describe :name= do
|
@@ -267,16 +271,20 @@ describe AIXM::Component::Runway::Direction do
|
|
267
271
|
end
|
268
272
|
|
269
273
|
describe :name= do
|
274
|
+
it "fails on invalid values" do
|
275
|
+
[nil, :foobar, '16R'].wont_be_written_to subject, :name
|
276
|
+
end
|
277
|
+
|
270
278
|
it "overwrites preset name" do
|
271
|
-
subject.name.must_equal '16L'
|
272
|
-
subject.name = '
|
273
|
-
subject.name.must_equal '
|
279
|
+
subject.name.to_s.must_equal '16L'
|
280
|
+
subject.name = AIXM.h('34L')
|
281
|
+
subject.name.to_s.must_equal '34L'
|
274
282
|
end
|
275
283
|
end
|
276
284
|
|
277
285
|
describe :geographic_orientation= do
|
278
286
|
it "fails on invalid values" do
|
279
|
-
[:foobar, -1,
|
287
|
+
[:foobar, -1, 0, 361].wont_be_written_to subject, :geographic_orientation
|
280
288
|
end
|
281
289
|
|
282
290
|
it "converts valid Numeric values to integer" do
|
data/spec/lib/aixm/d_spec.rb
CHANGED
@@ -25,32 +25,6 @@ describe AIXM::D do
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
describe :<=> do
|
29
|
-
it "recognizes objects with identical unit and distance as equal" do
|
30
|
-
a = AIXM.d(123, :m)
|
31
|
-
b = AIXM.d(123.0, 'M')
|
32
|
-
a.must_equal b
|
33
|
-
end
|
34
|
-
|
35
|
-
it "recognizes objects with different units and converted distance as equal" do
|
36
|
-
a = AIXM.d(123, :m)
|
37
|
-
b = AIXM.d(403.54330709, 'FT')
|
38
|
-
a.must_equal b
|
39
|
-
end
|
40
|
-
|
41
|
-
it "recognizes objects with different units and identical distance as unequal" do
|
42
|
-
a = AIXM.d(123, :m)
|
43
|
-
b = AIXM.d(123, :ft)
|
44
|
-
a.wont_equal b
|
45
|
-
end
|
46
|
-
|
47
|
-
it "recognizes objects of different class as unequal" do
|
48
|
-
a = AIXM.d(123, :m)
|
49
|
-
b = :oggy
|
50
|
-
a.wont_equal b
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
28
|
describe :to_ft do
|
55
29
|
it "leaves feet untouched" do
|
56
30
|
subject = AIXM.d(2, :ft)
|
@@ -127,4 +101,40 @@ describe AIXM::D do
|
|
127
101
|
end
|
128
102
|
end
|
129
103
|
|
104
|
+
describe :<=> do
|
105
|
+
it "recognizes objects with identical unit and distance as equal" do
|
106
|
+
a = AIXM.d(123, :m)
|
107
|
+
b = AIXM.d(123.0, 'M')
|
108
|
+
a.must_equal b
|
109
|
+
end
|
110
|
+
|
111
|
+
it "recognizes objects with different units and converted distance as equal" do
|
112
|
+
a = AIXM.d(123, :m)
|
113
|
+
b = AIXM.d(403.54330709, 'FT')
|
114
|
+
a.must_equal b
|
115
|
+
end
|
116
|
+
|
117
|
+
it "recognizes objects with different units and identical distance as unequal" do
|
118
|
+
a = AIXM.d(123, :m)
|
119
|
+
b = AIXM.d(123, :ft)
|
120
|
+
a.wont_equal b
|
121
|
+
end
|
122
|
+
|
123
|
+
it "recognizes objects of different class as unequal" do
|
124
|
+
a = AIXM.d(123, :m)
|
125
|
+
b = :oggy
|
126
|
+
a.wont_equal b
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe :hash do
|
131
|
+
it "returns an integer" do
|
132
|
+
subject.hash.must_be_instance_of Integer
|
133
|
+
end
|
134
|
+
|
135
|
+
it "allows for the use of instances as hash keys" do
|
136
|
+
dupe = subject.dup
|
137
|
+
{ subject => true }[dupe].must_equal true
|
138
|
+
end
|
139
|
+
end
|
130
140
|
end
|
@@ -727,7 +727,7 @@ describe AIXM::Document do
|
|
727
727
|
it "builds correct OFMX" do
|
728
728
|
subject.to_xml.must_equal <<~"END"
|
729
729
|
<?xml version="1.0" encoding="UTF-8"?>
|
730
|
-
<OFMX-Snapshot xmlns:xsi="http://openflightmaps.org/
|
730
|
+
<OFMX-Snapshot xmlns:xsi="http://schema.openflightmaps.org/0/OFMX-Snapshot.xsd" version="0" origin="rubygem aixm-#{AIXM::VERSION}" region="LF" namespace="00000000-0000-0000-0000-000000000000" created="2018-01-01T12:00:00+01:00" effective="2018-01-01T12:00:00+01:00">
|
731
731
|
<!-- Organisation: FRANCE -->
|
732
732
|
<Org source="LF|GEN|0.0 FACTORY|0|0">
|
733
733
|
<OrgUid>
|
data/spec/lib/aixm/f_spec.rb
CHANGED
@@ -25,6 +25,23 @@ describe AIXM::F do
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
describe :between? do
|
29
|
+
subject do
|
30
|
+
AIXM.f(100, :mhz)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "detect frequencies within a frequency band" do
|
34
|
+
subject.between?(90, 110, :mhz).must_equal true
|
35
|
+
subject.between?(90, 100, :mhz).must_equal true
|
36
|
+
subject.between?(100.0, 100.1, :mhz).must_equal true
|
37
|
+
end
|
38
|
+
|
39
|
+
it "detect frequencies outside of a frequency band" do
|
40
|
+
subject.between?(90, 110, :khz).must_equal false
|
41
|
+
subject.between?(90, 95, :mhz).must_equal false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
28
45
|
describe :== do
|
29
46
|
it "recognizes objects with identical frequency and unit as equal" do
|
30
47
|
a = AIXM.f(123.0, :mhz)
|
@@ -45,21 +62,14 @@ describe AIXM::F do
|
|
45
62
|
end
|
46
63
|
end
|
47
64
|
|
48
|
-
describe :
|
49
|
-
|
50
|
-
|
65
|
+
describe :hash do
|
66
|
+
it "returns an integer" do
|
67
|
+
subject.hash.must_be_instance_of Integer
|
51
68
|
end
|
52
69
|
|
53
|
-
it "
|
54
|
-
|
55
|
-
subject
|
56
|
-
subject.between?(100.0, 100.1, :mhz).must_equal true
|
57
|
-
end
|
58
|
-
|
59
|
-
it "detect frequencies outside of a frequency band" do
|
60
|
-
subject.between?(90, 110, :khz).must_equal false
|
61
|
-
subject.between?(90, 95, :mhz).must_equal false
|
70
|
+
it "allows for the use of instances as hash keys" do
|
71
|
+
dupe = subject.dup
|
72
|
+
{ subject => true }[dupe].must_equal true
|
62
73
|
end
|
63
74
|
end
|
64
|
-
|
65
75
|
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
|
3
|
+
describe AIXM::H do
|
4
|
+
subject do
|
5
|
+
AIXM::Factory.h
|
6
|
+
end
|
7
|
+
|
8
|
+
describe :initialize do
|
9
|
+
it "fails on invalid values" do
|
10
|
+
-> { AIXM.h('foobar') }.must_raise ArgumentError
|
11
|
+
end
|
12
|
+
|
13
|
+
it "parses valid values" do
|
14
|
+
AIXM.h('34L').tap do |h|
|
15
|
+
h.deg.must_equal 34
|
16
|
+
h.suffix.must_equal :L
|
17
|
+
end
|
18
|
+
AIXM.h(12).tap do |h|
|
19
|
+
h.deg.must_equal 12
|
20
|
+
h.suffix.must_be :nil?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe :to_s do
|
26
|
+
it "pads deg with zero and concats suffix" do
|
27
|
+
AIXM.h(5).to_s.must_equal '05'
|
28
|
+
AIXM.h('5L').to_s.must_equal '05L'
|
29
|
+
AIXM.h('16L').to_s.must_equal '16L'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe :deg= do
|
34
|
+
it "fails on invalid values" do
|
35
|
+
[:foobar, '1', 0, 37].wont_be_written_to subject, :deg
|
36
|
+
end
|
37
|
+
|
38
|
+
it "accepts valid values" do
|
39
|
+
(1..36).to_a.must_be_written_to subject, :deg
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe :suffix= do
|
44
|
+
it "fails on invalid values" do
|
45
|
+
[123, 'r'].wont_be_written_to subject, :suffix
|
46
|
+
end
|
47
|
+
|
48
|
+
it "accepts nil value" do
|
49
|
+
[nil].must_be_written_to subject, :suffix
|
50
|
+
end
|
51
|
+
|
52
|
+
it "symbolizes valid values" do
|
53
|
+
subject.tap { |s| s.suffix = 'Z' }.suffix.must_equal :Z
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe :invert do
|
58
|
+
it "must calculate inverse deg correctly" do
|
59
|
+
{
|
60
|
+
1 => 19, 2 => 20, 3 => 21, 4 => 22, 5 => 23, 6 => 24, 7 => 25, 8 => 26, 9 => 27,
|
61
|
+
10 => 28, 11 => 29, 12 => 30, 13 => 31, 14 => 32, 15 => 33, 16 => 34, 17 => 35, 18 => 36,
|
62
|
+
19 => 1, 20 => 2, 21 => 3, 22 => 4, 23 => 5, 24 => 6, 25 => 7, 26 => 8, 27 => 9,
|
63
|
+
28 => 10, 29 => 11, 30 => 12, 31 => 13, 32 => 14, 33 => 15, 34 => 16, 35 => 17, 36 => 18
|
64
|
+
}.each do |from, to|
|
65
|
+
AIXM.h(from).invert.deg.must_equal to
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it "must invert left/right suffix" do
|
70
|
+
AIXM.h('34L').invert.suffix.must_equal :R
|
71
|
+
end
|
72
|
+
|
73
|
+
it "must leave other suffixes untouched" do
|
74
|
+
AIXM.h('35X').invert.suffix.must_equal :X
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe :inverse_of? do
|
79
|
+
it "must return true for inverse pairs" do
|
80
|
+
AIXM.h('34L').inverse_of?(AIXM.h('16R')).must_equal true
|
81
|
+
end
|
82
|
+
|
83
|
+
it "must return false for non-inverse pairs" do
|
84
|
+
AIXM.h('34L').inverse_of?(AIXM.h('12L')).must_equal false
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe :== do
|
89
|
+
it "recognizes objects with identical deg and suffix as equal" do
|
90
|
+
AIXM.h('34L').must_equal AIXM.h('34L')
|
91
|
+
end
|
92
|
+
|
93
|
+
it "recognizes objects with different deg or suffix as unequal" do
|
94
|
+
AIXM.h('34L').wont_equal AIXM.h('35L')
|
95
|
+
AIXM.h('34L').wont_equal AIXM.h('34R')
|
96
|
+
end
|
97
|
+
|
98
|
+
it "recognizes objects of different class as unequal" do
|
99
|
+
subject.wont_equal :oggy
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe :hash do
|
104
|
+
it "returns an integer" do
|
105
|
+
subject.hash.must_be_instance_of Integer
|
106
|
+
end
|
107
|
+
|
108
|
+
it "allows for the use of instances as hash keys" do
|
109
|
+
dupe = subject.dup
|
110
|
+
{ subject => true }[dupe].must_equal true
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
data/spec/lib/aixm/xy_spec.rb
CHANGED
@@ -111,6 +111,21 @@ describe AIXM::XY do
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
+
describe :distance do
|
115
|
+
subject do
|
116
|
+
AIXM.xy(lat: %q(44°00'07.63"N), long: %q(004°45'07.81"E))
|
117
|
+
end
|
118
|
+
|
119
|
+
it "calculates the distance between the same point as zero" do
|
120
|
+
subject.distance(subject).must_equal AIXM.d(0, :m)
|
121
|
+
end
|
122
|
+
|
123
|
+
it "calculates the distance between two points correctly" do
|
124
|
+
other = AIXM.xy(lat: %q(43°59'25.31"N), long: %q(004°45'23.24"E))
|
125
|
+
subject.distance(other).must_equal AIXM.d(1351, :m)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
114
129
|
describe :== do
|
115
130
|
it "recognizes objects with identical latitude and longitude as equal" do
|
116
131
|
a = AIXM.xy(lat: "112233N", long: "0223344E")
|
@@ -131,18 +146,14 @@ describe AIXM::XY do
|
|
131
146
|
end
|
132
147
|
end
|
133
148
|
|
134
|
-
describe :
|
135
|
-
|
136
|
-
|
137
|
-
end
|
138
|
-
|
139
|
-
it "calculates the distance between the same point as zero" do
|
140
|
-
subject.distance(subject).must_equal AIXM.d(0, :m)
|
149
|
+
describe :hash do
|
150
|
+
it "returns an integer" do
|
151
|
+
subject.hash.must_be_instance_of Integer
|
141
152
|
end
|
142
153
|
|
143
|
-
it "
|
144
|
-
|
145
|
-
subject.
|
154
|
+
it "allows for the use of instances as hash keys" do
|
155
|
+
dupe = subject.dup
|
156
|
+
{ subject => true }[dupe].must_equal true
|
146
157
|
end
|
147
158
|
end
|
148
159
|
end
|
data/spec/lib/aixm/z_spec.rb
CHANGED
@@ -25,26 +25,6 @@ describe AIXM::Z do
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
describe :== do
|
29
|
-
it "recognizes objects with identical altitude and Q code as equal" do
|
30
|
-
a = AIXM.z(111, :qnh)
|
31
|
-
b = AIXM.z(111, :qnh)
|
32
|
-
a.must_equal b
|
33
|
-
end
|
34
|
-
|
35
|
-
it "recognizes objects with different altitude or Q code as unequal" do
|
36
|
-
a = AIXM.z(111, :qnh)
|
37
|
-
b = AIXM.z(222, :qnh)
|
38
|
-
a.wont_equal b
|
39
|
-
end
|
40
|
-
|
41
|
-
it "recognizes objects of different class as unequal" do
|
42
|
-
a = AIXM.z(111, :qnh)
|
43
|
-
b = :oggy
|
44
|
-
a.wont_equal b
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
28
|
describe :qfe? do
|
49
29
|
it "recognizes same Q code" do
|
50
30
|
AIXM.z(111, :qfe).must_be :qfe?
|
@@ -70,4 +50,35 @@ describe AIXM::Z do
|
|
70
50
|
AIXM.z(0, :qne).unit.must_equal :fl
|
71
51
|
end
|
72
52
|
end
|
53
|
+
|
54
|
+
describe :== do
|
55
|
+
it "recognizes objects with identical altitude and Q code as equal" do
|
56
|
+
a = AIXM.z(111, :qnh)
|
57
|
+
b = AIXM.z(111, :qnh)
|
58
|
+
a.must_equal b
|
59
|
+
end
|
60
|
+
|
61
|
+
it "recognizes objects with different altitude or Q code as unequal" do
|
62
|
+
a = AIXM.z(111, :qnh)
|
63
|
+
b = AIXM.z(222, :qnh)
|
64
|
+
a.wont_equal b
|
65
|
+
end
|
66
|
+
|
67
|
+
it "recognizes objects of different class as unequal" do
|
68
|
+
a = AIXM.z(111, :qnh)
|
69
|
+
b = :oggy
|
70
|
+
a.wont_equal b
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe :hash do
|
75
|
+
it "returns an integer" do
|
76
|
+
subject.hash.must_be_instance_of Integer
|
77
|
+
end
|
78
|
+
|
79
|
+
it "allows for the use of instances as hash keys" do
|
80
|
+
dupe = subject.dup
|
81
|
+
{ subject => true }[dupe].must_equal true
|
82
|
+
end
|
83
|
+
end
|
73
84
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aixm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sven Schwyn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -201,6 +201,7 @@ files:
|
|
201
201
|
- lib/aixm/feature/obstacle_group.rb
|
202
202
|
- lib/aixm/feature/organisation.rb
|
203
203
|
- lib/aixm/feature/unit.rb
|
204
|
+
- lib/aixm/h.rb
|
204
205
|
- lib/aixm/refinements.rb
|
205
206
|
- lib/aixm/shortcuts.rb
|
206
207
|
- lib/aixm/version.rb
|
@@ -246,6 +247,7 @@ files:
|
|
246
247
|
- spec/lib/aixm/feature/organisation_spec.rb
|
247
248
|
- spec/lib/aixm/feature/unit_spec.rb
|
248
249
|
- spec/lib/aixm/feature_spec.rb
|
250
|
+
- spec/lib/aixm/h_spec.rb
|
249
251
|
- spec/lib/aixm/refinements_spec.rb
|
250
252
|
- spec/lib/aixm/version_spec.rb
|
251
253
|
- spec/lib/aixm/xy_spec.rb
|
@@ -315,6 +317,7 @@ test_files:
|
|
315
317
|
- spec/lib/aixm/feature/organisation_spec.rb
|
316
318
|
- spec/lib/aixm/feature/unit_spec.rb
|
317
319
|
- spec/lib/aixm/feature_spec.rb
|
320
|
+
- spec/lib/aixm/h_spec.rb
|
318
321
|
- spec/lib/aixm/refinements_spec.rb
|
319
322
|
- spec/lib/aixm/version_spec.rb
|
320
323
|
- spec/lib/aixm/xy_spec.rb
|