3 class BoundingBoxTest < ActiveSupport::TestCase
5 @size_error_message = "The maximum bbox size is 0.25, and your request was too large. Either request a smaller area, or use planet.osm"
6 @malformed_error_message = "The parameter bbox must be of the form min_lon,min_lat,max_lon,max_lat"
7 @lon_order_error_message = "The minimum longitude must be less than the maximum longitude, but it wasn't"
8 @lat_order_error_message = "The minimum latitude must be less than the maximum latitude, but it wasn't"
9 @bbox_out_of_limits_error_message = "The latitudes must be between -90.0 and 90.0, and longitudes between -180.0 and 180.0"
10 @nil_error_message = "Should not contain nil"
12 @bbox_from_nils = BoundingBox.new(nil, nil, nil, nil)
13 @bbox_expand = BoundingBox.new(0, 0, 0, 0)
14 @bbox_expand_ten = BoundingBox.new(10, 10, 10, 10)
15 @bbox_expand_minus_two = BoundingBox.new(-2, -2, -2, -2)
16 @bbox_from_string = BoundingBox.from_s("1,2,3,4")
22 @bad_positive_boundary_bbox = %w[181,91,0,0 0,0,181,91]
23 @bad_negative_boundary_bbox = %w[-181,-91,0,0 0,0,-181,-91]
24 @bad_big_bbox = %w[-0.1,-0.1,1.1,1.1 10,10,11,11]
25 @bad_malformed_bbox = %w[-0.1 hello 10N2W10.1N2.1W]
26 @bad_lat_mixed_bbox = %w[0,0.1,0.1,0 -0.1,80,0.1,70 0.24,54.34,0.25,54.33]
27 @bad_lon_mixed_bbox = %w[80,-0.1,70,0.1 54.34,0.24,54.33,0.25]
28 @bad_limit_bbox = %w[-180.1,-90,180,90 -180,-90.1,180,90 -180,-90,180.1,90 -180,-90,180,90.1]
29 @good_bbox = %w[-0.1,-0.1,0.1,0.1 51.1,-0.1,51.2,0 -0.1,%20-0.1,%200.1,%200.1
30 -0.1edcd,-0.1d,0.1,0.1 -0.1E,-0.1E,0.1S,0.1N S0.1,W0.1,N0.1,E0.1]
32 @expand_min_lon_array = %w[2,10,10,10 1,10,10,10 0,10,10,10 -1,10,10,10 -2,10,10,10 -8,10,10,10]
33 @expand_min_lat_array = %w[10,2,10,10 10,1,10,10 10,0,10,10 10,-1,10,10 10,-2,10,10 10,-8,10,10]
34 @expand_max_lon_array = %w[-2,-2,-1,-2 -2,-2,0,-2 -2,-2,1,-2 -2,-2,2,-2]
35 @expand_max_lat_array = %w[-2,-2,-2,-1 -2,-2,-2,0 -2,-2,-2,1 -2,-2,-2,2]
36 @expand_min_lon_margin_response = [[2, 10, 10, 10], [-7, 10, 10, 10], [-7, 10, 10, 10], [-7, 10, 10, 10], [-7, 10, 10, 10], [-25, 10, 10, 10]]
37 @expand_min_lat_margin_response = [[10, 2, 10, 10], [10, -7, 10, 10], [10, -7, 10, 10], [10, -7, 10, 10], [10, -7, 10, 10], [10, -25, 10, 10]]
38 @expand_max_lon_margin_response = [[-2, -2, -1, -2], [-2, -2, 1, -2], [-2, -2, 1, -2], [-2, -2, 5, -2]]
39 @expand_max_lat_margin_response = [[-2, -2, -2, -1], [-2, -2, -2, 1], [-2, -2, -2, 1], [-2, -2, -2, 5]]
42 def test_good_bbox_from_string
43 @good_bbox.each do |string|
44 bbox = BoundingBox.from_s(string)
45 array = string.split(",").collect(&:to_f)
46 check_bbox(bbox, array)
50 def test_bbox_from_s_malformed
51 @bad_malformed_bbox.each do |bbox_string|
52 bbox = BoundingBox.from_s(bbox_string)
57 def test_good_bbox_from_params
58 @good_bbox.each do |string|
59 bbox = BoundingBox.from_bbox_params(:bbox => string)
60 array = string.split(",").collect(&:to_f)
61 check_bbox(bbox, array)
65 def test_good_bbox_from_lon_lat_params
66 @good_bbox.each do |string|
67 array = string.split(",")
68 bbox = BoundingBox.from_lon_lat_params(:minlon => array[0], :minlat => array[1], :maxlon => array[2], :maxlat => array[3])
69 check_bbox(bbox, array.collect(&:to_f))
73 def test_bbox_from_params_malformed
74 @bad_malformed_bbox.each do |bbox_string|
75 exception = assert_raise(OSM::APIBadUserInput) { BoundingBox.from_bbox_params(:bbox => bbox_string) }
76 assert_equal(@malformed_error_message, exception.message)
80 def test_good_bbox_from_new
81 @good_bbox.each do |string|
82 array = string.split(",")
83 bbox = BoundingBox.new(array[0], array[1], array[2], array[3])
84 check_bbox(bbox, array.collect(&:to_f))
88 def test_creation_from_new_with_nils
89 check_bbox(@bbox_from_nils, [nil, nil, nil, nil])
92 def test_expand_min_lon_boundary
93 @bbox_expand.expand!(BoundingBox.new(-1810000000, 0, 0, 0))
94 check_expand(@bbox_expand, "-1800000000,0,0,0")
97 def test_expand_min_lat_boundary
98 @bbox_expand.expand!(BoundingBox.new(0, -910000000, 0, 0))
99 check_expand(@bbox_expand, "0,-900000000,0,0")
102 def test_expand_max_lon_boundary
103 @bbox_expand.expand!(BoundingBox.new(0, 0, 1810000000, 0))
104 check_expand(@bbox_expand, "0,0,1800000000,0")
107 def test_expand_max_lat_boundary
108 @bbox_expand.expand!(BoundingBox.new(0, 0, 0, 910000000))
109 check_expand(@bbox_expand, "0,0,0,900000000")
112 def test_expand_min_lon_without_margin
113 @expand_min_lon_array.each { |array_string| check_expand(@bbox_expand_ten, array_string) }
116 def test_expand_min_lon_with_margin
117 @expand_min_lon_array.each_with_index do |array_string, index|
118 check_expand(@bbox_expand_ten, array_string, 1, @expand_min_lon_margin_response[index])
122 def test_expand_min_lat_without_margin
123 @expand_min_lat_array.each { |array_string| check_expand(@bbox_expand_ten, array_string) }
126 def test_expand_min_lat_with_margin
127 @expand_min_lat_array.each_with_index do |array_string, index|
128 check_expand(@bbox_expand_ten, array_string, 1, @expand_min_lat_margin_response[index])
132 def test_expand_max_lon_without_margin
133 @expand_max_lon_array.each { |array_string| check_expand(@bbox_expand_minus_two, array_string) }
136 def test_expand_max_lon_with_margin
137 @expand_max_lon_array.each_with_index do |array_string, index|
138 check_expand(@bbox_expand_minus_two, array_string, 1, @expand_max_lon_margin_response[index])
142 def test_expand_max_lat_without_margin
143 @expand_max_lat_array.each { |array_string| check_expand(@bbox_expand_minus_two, array_string) }
146 def test_expand_max_lat_with_margin
147 @expand_max_lat_array.each_with_index do |array_string, index|
148 check_expand(@bbox_expand_minus_two, array_string, 1, @expand_max_lat_margin_response[index])
152 def test_good_bbox_boundaries
153 @good_bbox.each do |bbox_string|
154 assert_nothing_raised { BoundingBox.from_s(bbox_string).check_boundaries }
158 def test_from_params_with_positive_out_of_boundary
159 @bad_positive_boundary_bbox.each do |bbox_string|
160 bbox = BoundingBox.from_bbox_params(:bbox => bbox_string)
162 assert_equal 180, [array[0], array[2]].max
163 assert_equal 90, [array[1], array[3]].max
167 def test_from_params_with_negative_out_of_boundary
168 @bad_negative_boundary_bbox.each do |bbox_string|
169 bbox = BoundingBox.from_bbox_params(:bbox => bbox_string)
171 assert_equal(-180, [array[0], array[2]].min)
172 assert_equal(-90, [array[1], array[3]].min)
176 def test_boundaries_mixed_lon
177 @bad_lon_mixed_bbox.each do |bbox_string|
178 exception = assert_raise(OSM::APIBadBoundingBox) { BoundingBox.from_s(bbox_string).check_boundaries }
179 assert_equal(@lon_order_error_message, exception.message)
183 def test_boundaries_mixed_lat
184 @bad_lat_mixed_bbox.each do |bbox_string|
185 exception = assert_raise(OSM::APIBadBoundingBox) { BoundingBox.from_s(bbox_string).check_boundaries }
186 assert_equal(@lat_order_error_message, exception.message)
190 def test_boundaries_out_of_limits
191 @bad_limit_bbox.each do |bbox_string|
192 exception = assert_raise(OSM::APIBadBoundingBox) { BoundingBox.from_s(bbox_string).check_boundaries }
193 assert_equal(@bbox_out_of_limits_error_message, exception.message)
197 def test_good_bbox_size
198 @good_bbox.each do |bbox_string|
199 assert_nothing_raised { BoundingBox.from_s(bbox_string).check_size }
204 @bad_big_bbox.each do |bbox_string|
206 assert_nothing_raised { bbox = BoundingBox.from_bbox_params(:bbox => bbox_string).check_boundaries }
207 exception = assert_raise(OSM::APIBadBoundingBox) { bbox.check_size }
208 assert_equal(@size_error_message, exception.message)
212 def test_good_bbox_area
213 @good_bbox.each do |string|
214 bbox = BoundingBox.from_s(string)
215 array = string.split(",")
216 assert_equal ((array[2].to_f - array[0].to_f) * (array[3].to_f - array[1].to_f)), bbox.area
220 def test_nil_bbox_area
221 assert_equal 0, @bbox_from_nils.area
225 assert_not @bbox_from_nils.complete?, "should contain a nil"
226 assert_predicate @bbox_from_string, :complete?, "should not contain a nil"
230 @good_bbox.each do |bbox_string|
231 array = bbox_string.split(",")
232 assert_equal ((array[0].to_f + array[2].to_f) / 2.0), BoundingBox.from_s(bbox_string).centre_lon
237 @good_bbox.each do |bbox_string|
238 array = bbox_string.split(",")
239 assert_equal ((array[1].to_f + array[3].to_f) / 2.0), BoundingBox.from_s(bbox_string).centre_lat
244 @good_bbox.each do |bbox_string|
245 array = bbox_string.split(",")
246 assert_equal (array[2].to_f - array[0].to_f), BoundingBox.from_s(bbox_string).width
251 @good_bbox.each do |bbox_string|
252 array = bbox_string.split(",")
253 assert_equal (array[3].to_f - array[1].to_f), BoundingBox.from_s(bbox_string).height
257 def test_slippy_width
258 assert_in_delta 5.68888888888889, @bbox_from_string.slippy_width(2), 0.000000000000001
261 def test_slippy_height
262 assert_in_delta 5.69698684268433, @bbox_from_string.slippy_height(2), 0.000000000000001
265 def test_add_bounds_to_no_underscore
266 bounds = @bbox_from_string.add_bounds_to({})
267 assert_equal 4, bounds.size
268 assert_equal format("%<lon>.7f", :lon => @min_lon), bounds["minlon"]
269 assert_equal format("%<lat>.7f", :lat => @min_lat), bounds["minlat"]
270 assert_equal format("%<lon>.7f", :lon => @max_lon), bounds["maxlon"]
271 assert_equal format("%<lat>.7f", :lat => @max_lat), bounds["maxlat"]
274 def test_add_bounds_to_with_underscore
275 bounds = @bbox_from_string.add_bounds_to({}, "_")
276 assert_equal 4, bounds.size
277 assert_equal format("%<lon>.7f", :lon => @min_lon), bounds["min_lon"]
278 assert_equal format("%<lat>.7f", :lat => @min_lat), bounds["min_lat"]
279 assert_equal format("%<lon>.7f", :lon => @max_lon), bounds["max_lon"]
280 assert_equal format("%<lat>.7f", :lat => @max_lat), bounds["max_lat"]
284 bbox = @bbox_from_string.to_scaled
285 assert_equal @min_lon * GeoRecord::SCALE, bbox.min_lon
286 assert_equal @min_lat * GeoRecord::SCALE, bbox.min_lat
287 assert_equal @max_lon * GeoRecord::SCALE, bbox.max_lon
288 assert_equal @max_lat * GeoRecord::SCALE, bbox.max_lat
292 scale = GeoRecord::SCALE
293 bbox = BoundingBox.new(1.0 * scale, 2.0 * scale, 3.0 * scale, 4.0 * scale).to_unscaled
294 check_bbox(bbox, [@min_lon, @min_lat, @max_lon, @max_lat])
298 assert_equal [1.0, 2.0, 3.0, 4.0], @bbox_from_string.to_a
302 assert_equal "#{@min_lon},#{@min_lat},#{@max_lon},#{@max_lat}", @bbox_from_string.to_s
307 def check_expand(bbox, array_string, margin = 0, result = nil)
308 array = array_string.split(",").collect(&:to_f)
310 bbox.expand!(BoundingBox.new(array[0], array[1], array[2], array[3]), margin)
311 check_bbox(bbox, result)
314 def check_bbox(bbox, result)
315 assert_equal_allowing_nil result[0], bbox.min_lon, "min_lon"
316 assert_equal_allowing_nil result[1], bbox.min_lat, "min_lat"
317 assert_equal_allowing_nil result[2], bbox.max_lon, "max_lon"
318 assert_equal_allowing_nil result[3], bbox.max_lat, "max_lat"