ffi-geos 1.2.2 → 2.3.0

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 (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)