ffi-geos 1.2.2 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +49 -0
  3. data/.rubocop.yml +5117 -4
  4. data/FUNDING.yml +2 -0
  5. data/Gemfile +9 -16
  6. data/Guardfile +3 -4
  7. data/MIT-LICENSE +1 -1
  8. data/README.rdoc +2 -20
  9. data/Rakefile +3 -2
  10. data/ffi-geos.gemspec +7 -2
  11. data/lib/ffi-geos/buffer_params.rb +1 -1
  12. data/lib/ffi-geos/coordinate_sequence.rb +179 -177
  13. data/lib/ffi-geos/geometry.rb +118 -31
  14. data/lib/ffi-geos/geometry_collection.rb +26 -12
  15. data/lib/ffi-geos/interrupt.rb +11 -14
  16. data/lib/ffi-geos/line_string.rb +64 -49
  17. data/lib/ffi-geos/multi_line_string.rb +1 -1
  18. data/lib/ffi-geos/point.rb +18 -18
  19. data/lib/ffi-geos/polygon.rb +44 -30
  20. data/lib/ffi-geos/prepared_geometry.rb +1 -1
  21. data/lib/ffi-geos/strtree.rb +28 -30
  22. data/lib/ffi-geos/tools.rb +1 -1
  23. data/lib/ffi-geos/utils.rb +16 -23
  24. data/lib/ffi-geos/version.rb +1 -1
  25. data/lib/ffi-geos/wkb_reader.rb +1 -1
  26. data/lib/ffi-geos/wkb_writer.rb +4 -5
  27. data/lib/ffi-geos/wkt_reader.rb +1 -1
  28. data/lib/ffi-geos/wkt_writer.rb +7 -13
  29. data/lib/ffi-geos.rb +134 -48
  30. data/sonar-project.properties +16 -0
  31. data/test/coordinate_sequence_tests.rb +148 -126
  32. data/test/geometry_collection_tests.rb +41 -67
  33. data/test/geometry_tests.rb +341 -40
  34. data/test/interrupt_tests.rb +7 -7
  35. data/test/line_string_tests.rb +23 -15
  36. data/test/point_tests.rb +5 -5
  37. data/test/polygon_tests.rb +6 -7
  38. data/test/prepared_geometry_tests.rb +8 -8
  39. data/test/strtree_tests.rb +13 -12
  40. data/test/test_helper.rb +74 -56
  41. data/test/utils_tests.rb +69 -59
  42. data/test/wkb_reader_tests.rb +9 -9
  43. data/test/wkb_writer_tests.rb +14 -12
  44. data/test/wkt_reader_tests.rb +0 -1
  45. data/test/wkt_writer_tests.rb +2 -5
  46. metadata +12 -10
  47. data/.travis.yml +0 -21
@@ -39,7 +39,7 @@ class InterruptTests < Minitest::Test
39
39
 
40
40
  begin
41
41
  buffer = geom.buffer(1, 8)
42
- rescue => e
42
+ rescue StandardError => e
43
43
  # no-op
44
44
  ensure
45
45
  assert_match(/^InterruptedException/, e.message)
@@ -62,7 +62,7 @@ class InterruptTests < Minitest::Test
62
62
 
63
63
  begin
64
64
  buffer = geom.buffer(1, 8)
65
- rescue => e
65
+ rescue StandardError => e
66
66
  # no-op
67
67
  ensure
68
68
  assert_match(/^InterruptedException/, e.message)
@@ -87,7 +87,7 @@ class InterruptTests < Minitest::Test
87
87
 
88
88
  begin
89
89
  buffer = geom.buffer(1, 8)
90
- rescue => e
90
+ rescue StandardError => e
91
91
  # no-op
92
92
  ensure
93
93
  assert_match(/^InterruptedException/, e.message)
@@ -114,7 +114,7 @@ class InterruptTests < Minitest::Test
114
114
  prc_1 = proc {
115
115
  interrupt_called
116
116
  called << :prc_1
117
- prev.call if prev
117
+ prev&.call
118
118
  }
119
119
 
120
120
  Geos::Interrupt.register(prc_0)
@@ -122,13 +122,13 @@ class InterruptTests < Minitest::Test
122
122
 
123
123
  begin
124
124
  buffer = geom.buffer(1, 8)
125
- rescue => e
125
+ rescue StandardError => e
126
126
  # no-op
127
127
  ensure
128
128
  assert_match(/^InterruptedException/, e.message)
129
129
  assert_nil(buffer)
130
130
  assert_interrupt_called(1)
131
- assert_equal([ :prc_1, :prc_0 ], called)
131
+ assert_equal([:prc_1, :prc_0], called)
132
132
  end
133
133
  end
134
134
  end
@@ -160,7 +160,7 @@ class InterruptTests < Minitest::Test
160
160
 
161
161
  begin
162
162
  buffer = geom.buffer(1, 8)
163
- rescue => e
163
+ rescue StandardError => e
164
164
  assert_match(/^InterruptedException/, e.message)
165
165
  assert_nil(buffer)
166
166
  end
@@ -80,7 +80,11 @@ class LineStringTests < Minitest::Test
80
80
  # straight right
81
81
  simple_tester(
82
82
  :offset_curve,
83
- 'LINESTRING (10 -2, 0 -2)',
83
+ if Geos::GEOS_NICE_VERSION >= '031100'
84
+ 'LINESTRING (0 -2, 10 -2)'
85
+ else
86
+ 'LINESTRING (10 -2, 0 -2)'
87
+ end,
84
88
  'LINESTRING (0 0, 10 0)',
85
89
  -2,
86
90
  quad_segs: 0,
@@ -91,7 +95,11 @@ class LineStringTests < Minitest::Test
91
95
  # outside curve
92
96
  simple_tester(
93
97
  :offset_curve,
94
- 'LINESTRING (12 10, 12 0, 10 -2, 0 -2)',
98
+ if Geos::GEOS_NICE_VERSION >= '031100'
99
+ 'LINESTRING (0 -2, 10 -2, 12 0, 12 10)'
100
+ else
101
+ 'LINESTRING (12 10, 12 0, 10 -2, 0 -2)'
102
+ end,
95
103
  'LINESTRING (0 0, 10 0, 10 10)',
96
104
  -2,
97
105
  quad_segs: 1,
@@ -250,8 +258,8 @@ class LineStringTests < Minitest::Test
250
258
 
251
259
  wkt = 'LINESTRING (0 0, 10 10)'
252
260
 
253
- affine_tester(:rotate, 'LINESTRING (30 10, 20 20)', wkt, Math::PI / 2, [ 10.0, 20.0 ])
254
- affine_tester(:rotate, 'LINESTRING (-3 1, 7 -9)', wkt, -Math::PI / 2, [ -1.0, 2.0 ])
261
+ affine_tester(:rotate, 'LINESTRING (30 10, 20 20)', wkt, Math::PI / 2, [10.0, 20.0])
262
+ affine_tester(:rotate, 'LINESTRING (-3 1, 7 -9)', wkt, -Math::PI / 2, [-1.0, 2.0])
255
263
  affine_tester(:rotate, 'LINESTRING (2 2, -8 -8)', wkt, Math::PI, read('POINT(1 1)'))
256
264
  affine_tester(:rotate, 'LINESTRING (0.5 -0.5, -9.5 9.5)', wkt, Math::PI / 2, read('LINESTRING(0 0, 1 0)'))
257
265
  end
@@ -264,7 +272,7 @@ class LineStringTests < Minitest::Test
264
272
 
265
273
  affine_tester(:rotate_x, 'LINESTRING Z (1 -1 -1, 10 -10 -10)', wkt, Math::PI)
266
274
  affine_tester(:rotate_x, 'LINESTRING Z (1 -1 1, 10 -10 10)', wkt, Math::PI / 2)
267
- affine_tester(:rotate_x, 'LINESTRING Z (1 1 -1, 10 10 -10)', wkt, Math::PI + Math::PI / 2)
275
+ affine_tester(:rotate_x, 'LINESTRING Z (1 1 -1, 10 10 -10)', wkt, Math::PI + (Math::PI / 2))
268
276
  affine_tester(:rotate_x, wkt, wkt, Math::PI * 2)
269
277
  end
270
278
 
@@ -276,7 +284,7 @@ class LineStringTests < Minitest::Test
276
284
 
277
285
  affine_tester(:rotate_y, 'LINESTRING Z (-1 1 -1, -10 10 -10)', wkt, Math::PI)
278
286
  affine_tester(:rotate_y, 'LINESTRING Z (1 1 -1, 10 10 -10)', wkt, Math::PI / 2)
279
- affine_tester(:rotate_y, 'LINESTRING Z (-1 1 1, -10 10 10)', wkt, Math::PI + Math::PI / 2)
287
+ affine_tester(:rotate_y, 'LINESTRING Z (-1 1 1, -10 10 10)', wkt, Math::PI + (Math::PI / 2))
280
288
  affine_tester(:rotate_y, wkt, wkt, Math::PI * 2)
281
289
  end
282
290
 
@@ -287,7 +295,7 @@ class LineStringTests < Minitest::Test
287
295
 
288
296
  affine_tester(:rotate_z, 'LINESTRING (-1 -1, -10 -10)', wkt, Math::PI)
289
297
  affine_tester(:rotate_z, 'LINESTRING (-1 1, -10 10)', wkt, Math::PI / 2)
290
- affine_tester(:rotate_z, 'LINESTRING (1 -1, 10 -10)', wkt, Math::PI + Math::PI / 2)
298
+ affine_tester(:rotate_z, 'LINESTRING (1 -1, 10 -10)', wkt, Math::PI + (Math::PI / 2))
291
299
  affine_tester(:rotate_z, wkt, wkt, Math::PI * 2)
292
300
  end
293
301
 
@@ -300,11 +308,11 @@ class LineStringTests < Minitest::Test
300
308
  end
301
309
 
302
310
  def test_scale_hash
303
- affine_tester(:scale, 'LINESTRING (5 5, 50 50)', 'LINESTRING (1 1, 10 10)', :x => 5, :y => 5)
304
- affine_tester(:scale, 'LINESTRING (3 2, 30 20)', 'LINESTRING (1 1, 10 10)', :x => 3, :y => 2)
311
+ affine_tester(:scale, 'LINESTRING (5 5, 50 50)', 'LINESTRING (1 1, 10 10)', x: 5, y: 5)
312
+ affine_tester(:scale, 'LINESTRING (3 2, 30 20)', 'LINESTRING (1 1, 10 10)', x: 3, y: 2)
305
313
 
306
314
  writer.output_dimensions = 3
307
- affine_tester(:scale, 'LINESTRING Z (40 40 40, 80 80 80)', 'LINESTRING Z (10 20 -5, 20 40 -10)', :x => 4, :y => 2, :z => -8)
315
+ affine_tester(:scale, 'LINESTRING Z (40 40 40, 80 80 80)', 'LINESTRING Z (10 20 -5, 20 40 -10)', x: 4, y: 2, z: -8)
308
316
  end
309
317
 
310
318
  def test_trans_scale
@@ -326,11 +334,11 @@ class LineStringTests < Minitest::Test
326
334
  end
327
335
 
328
336
  def test_trans_scale_hash
329
- affine_tester(:trans_scale, 'LINESTRING (2 2, 11 11)', 'LINESTRING (1 1, 10 10)', :delta_x => 1, :delta_y => 1, :x_factor => 1, :y_factor => 1)
337
+ affine_tester(:trans_scale, 'LINESTRING (2 2, 11 11)', 'LINESTRING (1 1, 10 10)', delta_x: 1, delta_y: 1, x_factor: 1, y_factor: 1)
330
338
 
331
339
  writer.output_dimensions = 3
332
- affine_tester(:trans_scale, 'LINESTRING Z (15 28 1, 60 91 10)', 'LINESTRING Z (1 1 1, 10 10 10)', :delta_x => 2, :delta_y => 3, :x_factor => 5, :y_factor => 7)
333
- affine_tester(:trans_scale, 'LINESTRING Z (3 1 1, 12 10 10)', 'LINESTRING Z (1 1 1, 10 10 10)', :delta_x => 2, :z_factor => 2)
340
+ affine_tester(:trans_scale, 'LINESTRING Z (15 28 1, 60 91 10)', 'LINESTRING Z (1 1 1, 10 10 10)', delta_x: 2, delta_y: 3, x_factor: 5, y_factor: 7)
341
+ affine_tester(:trans_scale, 'LINESTRING Z (3 1 1, 12 10 10)', 'LINESTRING Z (1 1 1, 10 10 10)', delta_x: 2, z_factor: 2)
334
342
  end
335
343
 
336
344
  def test_translate
@@ -341,10 +349,10 @@ class LineStringTests < Minitest::Test
341
349
  end
342
350
 
343
351
  def test_translate_hash
344
- affine_tester(:translate, 'LINESTRING (5 12, 15 22)', 'LINESTRING (0 0, 10 10)', :x => 5, :y => 12)
352
+ affine_tester(:translate, 'LINESTRING (5 12, 15 22)', 'LINESTRING (0 0, 10 10)', x: 5, y: 12)
345
353
 
346
354
  writer.output_dimensions = 3
347
- affine_tester(:translate, 'LINESTRING Z (-3 -7 3, 7 3 13)', 'LINESTRING Z (0 0 0, 10 10 10)', :x => -3, :y => -7, :z => 3)
355
+ affine_tester(:translate, 'LINESTRING Z (-3 -7 3, 7 3 13)', 'LINESTRING Z (0 0 0, 10 10 10)', x: -3, y: -7, z: 3)
348
356
  end
349
357
 
350
358
  def test_line_interpolate_point
data/test/point_tests.rb CHANGED
@@ -163,8 +163,8 @@ class PointTests < Minitest::Test
163
163
 
164
164
  wkt = 'POINT (1 1)'
165
165
 
166
- affine_tester(:rotate, 'POINT (29 11)', wkt, Math::PI / 2, [ 10.0, 20.0 ])
167
- affine_tester(:rotate, 'POINT (-2 0)', wkt, -Math::PI / 2, [ -1.0, 2.0 ])
166
+ affine_tester(:rotate, 'POINT (29 11)', wkt, Math::PI / 2, [10.0, 20.0])
167
+ affine_tester(:rotate, 'POINT (-2 0)', wkt, -Math::PI / 2, [-1.0, 2.0])
168
168
  affine_tester(:rotate, 'POINT (19 1)', wkt, Math::PI / 2, read('POINT(10 10)'))
169
169
  affine_tester(:rotate, 'POINT (-0.5 0.5)', wkt, Math::PI / 2, read('LINESTRING(0 0, 1 0)'))
170
170
  end
@@ -177,7 +177,7 @@ class PointTests < Minitest::Test
177
177
 
178
178
  affine_tester(:rotate_x, 'POINT Z (1 -1 -1)', wkt, Math::PI)
179
179
  affine_tester(:rotate_x, 'POINT Z (1 -1 1)', wkt, Math::PI / 2)
180
- affine_tester(:rotate_x, 'POINT Z (1 1 -1)', wkt, Math::PI + Math::PI / 2)
180
+ affine_tester(:rotate_x, 'POINT Z (1 1 -1)', wkt, Math::PI + (Math::PI / 2))
181
181
  affine_tester(:rotate_x, wkt, wkt, Math::PI * 2)
182
182
  end
183
183
 
@@ -189,7 +189,7 @@ class PointTests < Minitest::Test
189
189
 
190
190
  affine_tester(:rotate_y, 'POINT Z (-1 1 -1)', wkt, Math::PI)
191
191
  affine_tester(:rotate_y, 'POINT Z (1 1 -1)', wkt, Math::PI / 2)
192
- affine_tester(:rotate_y, 'POINT Z (-1 1 1)', wkt, Math::PI + Math::PI / 2)
192
+ affine_tester(:rotate_y, 'POINT Z (-1 1 1)', wkt, Math::PI + (Math::PI / 2))
193
193
  affine_tester(:rotate_y, wkt, wkt, Math::PI * 2)
194
194
  end
195
195
 
@@ -200,7 +200,7 @@ class PointTests < Minitest::Test
200
200
 
201
201
  affine_tester(:rotate_z, 'POINT (-1 -1)', wkt, Math::PI)
202
202
  affine_tester(:rotate_z, 'POINT (-1 1)', wkt, Math::PI / 2)
203
- affine_tester(:rotate_z, 'POINT (1 -1)', wkt, Math::PI + Math::PI / 2)
203
+ affine_tester(:rotate_z, 'POINT (1 -1)', wkt, Math::PI + (Math::PI / 2))
204
204
  affine_tester(:rotate_z, wkt, wkt, Math::PI * 2)
205
205
  end
206
206
 
@@ -79,8 +79,7 @@ class PolygonTests < Minitest::Test
79
79
 
80
80
  def test_snap_to_grid_with_illegal_result
81
81
  assert_raises(Geos::InvalidGeometryError) do
82
- read('POLYGON ((1 1, 10 10, 10 10, 1 1))').
83
- snap_to_grid
82
+ read('POLYGON ((1 1, 10 10, 10 10, 1 1))').snap_to_grid
84
83
  end
85
84
  end
86
85
 
@@ -110,13 +109,13 @@ class PolygonTests < Minitest::Test
110
109
  'POLYGON ((30 10, 30 15, 25 15, 25 10, 30 10))',
111
110
  wkt,
112
111
  Math::PI / 2,
113
- [ 10.0, 20.0 ])
112
+ [10.0, 20.0])
114
113
 
115
114
  affine_tester(:rotate,
116
115
  'POLYGON ((-3 1, -3 -4, 2 -4, 2 1, -3 1))',
117
116
  wkt,
118
117
  -Math::PI / 2,
119
- [ -1.0, 2.0 ])
118
+ [-1.0, 2.0])
120
119
 
121
120
  affine_tester(:rotate,
122
121
  'POLYGON ((2 2, -3 2, -3 -3, 2 -3, 2 2))',
@@ -148,7 +147,7 @@ class PolygonTests < Minitest::Test
148
147
  affine_tester(:rotate_x,
149
148
  'POLYGON Z ((0 0 0, 5 0 0, 5 0 -5, 0 0 -5, 0 0 0))',
150
149
  wkt,
151
- Math::PI + Math::PI / 2)
150
+ Math::PI + (Math::PI / 2))
152
151
 
153
152
  affine_tester(:rotate_x,
154
153
  wkt,
@@ -174,7 +173,7 @@ class PolygonTests < Minitest::Test
174
173
  affine_tester(:rotate_y,
175
174
  'POLYGON Z ((0 0 0, 0 0 5, 0 5 5, 0 5 0, 0 0 0))',
176
175
  wkt,
177
- Math::PI + Math::PI / 2)
176
+ Math::PI + (Math::PI / 2))
178
177
 
179
178
  affine_tester(:rotate_y,
180
179
  wkt,
@@ -196,7 +195,7 @@ class PolygonTests < Minitest::Test
196
195
  affine_tester(:rotate_z,
197
196
  'POLYGON ((0 0, 0 -5, 5 -5, 5 0, 0 0))',
198
197
  'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
199
- Math::PI + Math::PI / 2)
198
+ Math::PI + (Math::PI / 2))
200
199
 
201
200
  affine_tester(:rotate_z,
202
201
  'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
@@ -17,14 +17,14 @@ class PreparedGeometryTests < Minitest::Test
17
17
 
18
18
  def relationship_tester(method, *expected)
19
19
  [
20
- [ POINT_A, POINT_A ],
21
- [ POINT_A, LINESTRING_A ],
22
- [ POINT_B, LINESTRING_A ],
23
- [ LINESTRING_B, LINESTRING_A ],
24
- [ LINESTRING_C, LINESTRING_A ],
25
- [ LINESTRING_D, LINESTRING_A ],
26
- [ POLYGON_A, POLYGON_B ],
27
- [ POLYGON_A, POINT_C ]
20
+ [POINT_A, POINT_A],
21
+ [POINT_A, LINESTRING_A],
22
+ [POINT_B, LINESTRING_A],
23
+ [LINESTRING_B, LINESTRING_A],
24
+ [LINESTRING_C, LINESTRING_A],
25
+ [LINESTRING_D, LINESTRING_A],
26
+ [POLYGON_A, POLYGON_B],
27
+ [POLYGON_A, POINT_C]
28
28
  ].each_with_index do |(geom_a, geom_b), i|
29
29
  geom_a = read(geom_a).to_prepared
30
30
  geom_b = read(geom_b)
@@ -8,7 +8,7 @@ class STRtreeTests < Minitest::Test
8
8
  def setup_tree
9
9
  @tree = Geos::STRtree.new(3)
10
10
  @item_1 = { item_1: :test }
11
- @item_2 = [ :test ]
11
+ @item_2 = [:test]
12
12
  @item_3 = Object.new
13
13
 
14
14
  @geom_1 = read('LINESTRING(0 0, 10 10)')
@@ -183,9 +183,9 @@ class STRtreeTests < Minitest::Test
183
183
  skip unless ENV['FORCE_TESTS'] || defined?(Geos::STRtree)
184
184
 
185
185
  tree = Geos::STRtree.new(
186
- [ read('LINESTRING(0 0, 10 10)'), item_1 = { item_1: :test } ],
187
- [ read('LINESTRING(20 20, 30 30)'), item_2 = [ :test ] ],
188
- [ read('LINESTRING(20 20, 30 30)'), item_3 = Object.new ]
186
+ [read('LINESTRING(0 0, 10 10)'), item_1 = { item_1: :test }],
187
+ [read('LINESTRING(20 20, 30 30)'), item_2 = [:test]],
188
+ [read('LINESTRING(20 20, 30 30)'), item_3 = Object.new]
189
189
  )
190
190
 
191
191
  assert_equal([item_1],
@@ -233,7 +233,7 @@ class STRtreeTests < Minitest::Test
233
233
  end
234
234
 
235
235
  def test_nearest
236
- skip unless ENV['FORCE_TESTS'] || defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest)
236
+ skip unless ENV['FORCE_TESTS'] || (defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest))
237
237
 
238
238
  geom_1 = read('POINT (3 3)')
239
239
  geom_2 = read('POINT (2 7)')
@@ -250,7 +250,7 @@ class STRtreeTests < Minitest::Test
250
250
  end
251
251
 
252
252
  def test_nearest_with_depth
253
- skip unless ENV['FORCE_TESTS'] || defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest)
253
+ skip unless ENV['FORCE_TESTS'] || (defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest))
254
254
 
255
255
  number_of_geoms = 100
256
256
  geoms = []
@@ -284,7 +284,7 @@ class STRtreeTests < Minitest::Test
284
284
  end
285
285
 
286
286
  def test_nearest_with_empty_tree
287
- skip unless ENV['FORCE_TESTS'] || defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest)
287
+ skip unless ENV['FORCE_TESTS'] || (defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest))
288
288
 
289
289
  tree = Geos::STRtree.new(10)
290
290
  geom_1 = read('POINT (3 3)')
@@ -294,7 +294,7 @@ class STRtreeTests < Minitest::Test
294
294
  end
295
295
 
296
296
  def test_nearest_with_some_empty_geometries
297
- skip unless ENV['FORCE_TESTS'] || defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest)
297
+ skip unless ENV['FORCE_TESTS'] || (defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest))
298
298
 
299
299
  geom_1 = read('LINESTRING EMPTY')
300
300
  geom_2 = read('POINT (2 7)')
@@ -312,7 +312,8 @@ class STRtreeTests < Minitest::Test
312
312
  end
313
313
 
314
314
  def test_nearest_with_only_empty_geometries
315
- skip unless ENV['FORCE_TESTS'] || defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest)
315
+ skip unless ENV['FORCE_TESTS'] || (defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest))
316
+ skip if Geos::GEOS_NICE_VERSION > '030900'
316
317
 
317
318
  geom_1 = read('LINESTRING EMPTY')
318
319
  geom_2 = read('POINT (2 7)')
@@ -326,7 +327,7 @@ class STRtreeTests < Minitest::Test
326
327
  end
327
328
 
328
329
  def test_disallowed_inserts_on_nearest
329
- skip unless ENV['FORCE_TESTS'] || defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest)
330
+ skip unless ENV['FORCE_TESTS'] || (defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest))
330
331
 
331
332
  setup_tree
332
333
 
@@ -338,7 +339,7 @@ class STRtreeTests < Minitest::Test
338
339
  end
339
340
 
340
341
  def test_nearest_item
341
- skip unless ENV['FORCE_TESTS'] || defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest_item)
342
+ skip unless ENV['FORCE_TESTS'] || (defined?(Geos::STRtree) && Geos::STRtree.method_defined?(:nearest_item))
342
343
 
343
344
  geom_1 = read('POINT (3 3)')
344
345
  geom_2 = read('POINT (2 7)')
@@ -346,7 +347,7 @@ class STRtreeTests < Minitest::Test
346
347
  geom_4 = read('POINT (3 8)')
347
348
 
348
349
  item_1 = { item_1: :test }
349
- item_2 = [ :test ]
350
+ item_2 = [:test]
350
351
  item_3 = Object.new
351
352
 
352
353
  tree = Geos::STRtree.new(2)
data/test/test_helper.rb CHANGED
@@ -1,19 +1,17 @@
1
- # encoding: BINARY; frozen_string_literal: true
1
+ # frozen_string_literal: true
2
2
 
3
- if RUBY_VERSION >= '1.9'
4
- require 'simplecov'
3
+ require 'simplecov'
5
4
 
6
- SimpleCov.command_name('Unit Tests')
7
- SimpleCov.merge_timeout(3600)
8
- SimpleCov.start do
9
- add_filter '/test/'
10
- add_filter '/.bundle/'
11
- end
5
+ SimpleCov.command_name('Unit Tests')
6
+ SimpleCov.merge_timeout(3600)
7
+ SimpleCov.start do
8
+ add_filter '/test/'
9
+ add_filter '/.bundle/'
12
10
  end
13
11
 
14
12
  require 'rubygems'
15
13
  require 'minitest/autorun'
16
- require 'minitest/reporters' if RUBY_VERSION >= '1.9'
14
+ require 'minitest/reporters'
17
15
 
18
16
  if ENV['USE_BINARY_GEOS']
19
17
  require 'geos'
@@ -25,17 +23,28 @@ puts "Ruby version #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} - #{RbConfig::CONFIG['RUB
25
23
  puts "ffi version #{Gem.loaded_specs['ffi'].version}" if Gem.loaded_specs['ffi']
26
24
 
27
25
  if Geos.respond_to?(:version)
28
- puts "GEOS version #{Geos.version}"
26
+ puts "GEOS version #{Geos.version} (#{Geos::GEOS_NICE_VERSION})"
29
27
  else
30
- puts "GEOS version #{Geos::GEOS_VERSION}"
28
+ puts "GEOS version #{Geos::GEOS_VERSION} (#{Geos::GEOS_NICE_VERSION})"
31
29
  end
32
30
 
33
31
  puts "ffi-geos version #{Geos::VERSION}" if defined?(Geos::VERSION)
34
32
  puts "Using #{Geos::FFIGeos.geos_library_path}" if defined?(Geos::FFIGeos)
33
+ puts "Process #{$PID}"
35
34
 
36
35
  module TestHelper
37
36
  TOLERANCE = 0.0000000000001
38
37
 
38
+ EMPTY_GEOMETRY = if Geos::GEOS_NICE_VERSION >= '030800'
39
+ 'POINT EMPTY'
40
+ else
41
+ 'GEOMETRYCOLLECTION EMPTY'
42
+ end
43
+
44
+ EMPTY_BLOCK = proc do
45
+ # no-op
46
+ end
47
+
39
48
  def self.included(base)
40
49
  base.class_eval do
41
50
  attr_reader :reader, :reader_hex, :writer
@@ -49,16 +58,16 @@ module TestHelper
49
58
  @writer = Geos::WktWriter.new
50
59
  end
51
60
 
52
- def read(*args)
53
- if args[0][0] != '0'
54
- reader.read(*args)
61
+ def read(*args, **options)
62
+ if args[0][0] == '0'
63
+ reader_hex.read_hex(*args, **options)
55
64
  else
56
- reader_hex.read_hex(*args)
65
+ reader.read(*args, **options)
57
66
  end
58
67
  end
59
68
 
60
- def write(*args)
61
- writer.write(*args)
69
+ def write(*args, **options)
70
+ writer.write(*args, **options)
62
71
  end
63
72
 
64
73
  def geom_from_geom_or_wkt(geom_or_wkt)
@@ -69,11 +78,12 @@ module TestHelper
69
78
  end
70
79
  end
71
80
 
72
- def srid_copy_tester(method, expected, expected_srid, srid_policy, wkt, *args)
81
+ def srid_copy_tester(method, expected, expected_srid, srid_policy, wkt, *args, **options)
73
82
  geom = read(wkt)
74
83
  geom.srid = 4326
75
84
  Geos.srid_copy_policy = srid_policy
76
- geom_b = geom.send(method, *args)
85
+
86
+ geom_b = geom.__safe_send__(method, *args, **options)
77
87
  assert_equal(4326, geom.srid)
78
88
  assert_equal(expected_srid, geom_b.srid)
79
89
  assert_equal(expected, write(geom_b))
@@ -104,90 +114,98 @@ module TestHelper
104
114
  assert(geom.eql_exact?(result, tolerance), "Expected geom.eql_exact? to be within #{tolerance}")
105
115
  end
106
116
 
107
- def snapped_tester(method, expected, geom, *args)
117
+ def snapped_tester(method, expected, geom, *args, **options)
108
118
  geom = geom_from_geom_or_wkt(geom)
109
119
 
110
- result = geom.send(method, *args)
120
+ result = geom.__safe_send__(method, *args, **options)
111
121
  assert_equal(expected, write(result.snap_to_grid(1)))
112
122
  end
113
123
 
114
- def simple_tester(method, expected, geom, *args)
124
+ def simple_tester(method, expected, geom, *args, **options)
115
125
  geom = geom_from_geom_or_wkt(geom)
116
- result = geom.send(method, *args)
126
+
127
+ result = geom.__safe_send__(method, *args, **options)
117
128
  result = write(result) if result.is_a?(Geos::Geometry)
118
129
 
119
- assert_equal(expected, result)
130
+ if expected.nil?
131
+ assert_nil(result)
132
+ else
133
+ assert_equal(expected, result)
134
+ end
120
135
  end
121
136
 
122
- def simple_bang_tester(method, expected, wkt, *args)
137
+ def simple_bang_tester(method, expected, wkt, *args, **options)
123
138
  geom = read(wkt)
124
- result = geom.send(method, *args)
139
+ result = geom.__safe_send__(method, *args, **options)
125
140
 
126
141
  assert_equal(wkt, write(geom))
127
142
  assert_equal(expected, write(result))
128
143
 
129
144
  geom = read(wkt)
130
- geom.send("#{method}!", *args)
145
+ geom.__safe_send__("#{method}!", *args, **options)
131
146
 
132
147
  assert_equal(expected, write(geom))
133
148
  end
134
149
 
135
- def comparison_tester(method, expected, geom_a, geom_b, *args)
136
- geom_a = geom_from_geom_or_wkt(geom_a)
137
- geom_b = geom_from_geom_or_wkt(geom_b)
150
+ def comparison_tester(method, expected, geom_a, geom_b, *args, **options)
151
+ geom_a = geom_from_geom_or_wkt(geom_a).normalize
152
+ geom_b = geom_from_geom_or_wkt(geom_b).normalize
138
153
 
139
- simple_tester(method, expected, geom_a, geom_b, *args)
154
+ simple_tester(method, expected, geom_a, geom_b, *args, **options)
140
155
  end
141
156
 
142
- def array_tester(method, expected, geom, *args)
157
+ def array_tester(method, expected, geom, *args, **options)
143
158
  geom = geom_from_geom_or_wkt(geom)
144
- result = geom.send(method, *args)
159
+ result = geom.__safe_send__(method, *args, **options)
145
160
 
146
161
  case result
147
162
  when Geos::Geometry
148
- result = [ write(result) ]
163
+ result = [write(result)]
149
164
  when Array
150
- result = result.collect { |r|
165
+ result = result.collect do |r|
151
166
  write(r)
152
- }
167
+ end
153
168
  end
154
169
 
155
170
  assert_equal(expected, result)
156
171
  end
157
172
 
158
- def affine_tester(method, expected, wkt, *args)
173
+ def affine_tester(method, expected, wkt, *args, **options)
159
174
  writer.trim = true
160
175
 
161
176
  geom = read(wkt)
162
- geom.send("#{method}!", *args).snap_to_grid!(0.1)
177
+ geom.__safe_send__("#{method}!", *args, **options).snap_to_grid!(0.1)
163
178
 
164
179
  assert_equal(expected, write(geom))
165
180
 
166
181
  geom = read(wkt)
167
- geom2 = geom.send(method, *args).snap_to_grid(0.1)
182
+ geom_2 = geom.__safe_send__(method, *args, **options).snap_to_grid(0.1)
168
183
 
169
184
  assert_equal(wkt, write(geom))
170
- assert_equal(expected, write(geom2, :trim => true))
185
+ assert_equal(expected, write(geom_2, trim: true))
171
186
  end
172
187
  end
173
188
 
174
- if RUBY_VERSION >= '1.9'
175
- Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new)
176
- end
177
-
178
- if !Fixnum.method_defined?(:negative?)
179
- class Fixnum
180
- def negative?
181
- self < 0
189
+ class Object
190
+ if RUBY_VERSION >= '2.7'
191
+ def __safe_send__(method_name, *args, **kwargs)
192
+ send(method_name, *args, **kwargs)
182
193
  end
183
- end
184
- end
185
-
186
- if !Fixnum.method_defined?(:positive?)
187
- class Fixnum
188
- def positive?
189
- self > 0
194
+ else
195
+ def __safe_send__(method_name, *args, **kwargs)
196
+ raise NoMethodError unless respond_to?(method_name)
197
+
198
+ arity = method(method_name).arity
199
+
200
+ if arity.zero?
201
+ send(method_name)
202
+ elsif arity.negative? && !kwargs.empty?
203
+ send(method_name, *args, **kwargs)
204
+ else
205
+ send(method_name, *args)
206
+ end
190
207
  end
191
208
  end
192
209
  end
193
210
 
211
+ Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new)