ffi-geos 1.2.1 → 1.2.2

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 (49) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +20 -0
  3. data/.travis.yml +7 -3
  4. data/Gemfile +1 -1
  5. data/Guardfile +4 -5
  6. data/ffi-geos.gemspec +1 -1
  7. data/lib/ffi-geos.rb +212 -196
  8. data/lib/ffi-geos/buffer_params.rb +9 -20
  9. data/lib/ffi-geos/coordinate_sequence.rb +342 -58
  10. data/lib/ffi-geos/geometry.rb +167 -178
  11. data/lib/ffi-geos/geometry_collection.rb +60 -12
  12. data/lib/ffi-geos/interrupt.rb +2 -4
  13. data/lib/ffi-geos/line_string.rb +146 -37
  14. data/lib/ffi-geos/linear_ring.rb +2 -3
  15. data/lib/ffi-geos/multi_line_string.rb +1 -2
  16. data/lib/ffi-geos/multi_point.rb +0 -1
  17. data/lib/ffi-geos/multi_polygon.rb +0 -1
  18. data/lib/ffi-geos/point.rb +69 -14
  19. data/lib/ffi-geos/polygon.rb +110 -21
  20. data/lib/ffi-geos/prepared_geometry.rb +11 -12
  21. data/lib/ffi-geos/strtree.rb +41 -52
  22. data/lib/ffi-geos/tools.rb +15 -18
  23. data/lib/ffi-geos/utils.rb +27 -44
  24. data/lib/ffi-geos/version.rb +1 -3
  25. data/lib/ffi-geos/wkb_reader.rb +4 -9
  26. data/lib/ffi-geos/wkb_writer.rb +14 -18
  27. data/lib/ffi-geos/wkt_reader.rb +2 -5
  28. data/lib/ffi-geos/wkt_writer.rb +17 -22
  29. data/test/.rubocop.yml +36 -0
  30. data/test/coordinate_sequence_tests.rb +263 -14
  31. data/test/geometry_collection_tests.rb +412 -1
  32. data/test/geometry_tests.rb +156 -86
  33. data/test/interrupt_tests.rb +2 -4
  34. data/test/line_string_tests.rb +212 -23
  35. data/test/linear_ring_tests.rb +1 -2
  36. data/test/misc_tests.rb +28 -29
  37. data/test/multi_line_string_tests.rb +0 -1
  38. data/test/point_tests.rb +158 -1
  39. data/test/polygon_tests.rb +284 -1
  40. data/test/prepared_geometry_tests.rb +1 -3
  41. data/test/strtree_tests.rb +9 -10
  42. data/test/test_helper.rb +49 -18
  43. data/test/tools_tests.rb +1 -3
  44. data/test/utils_tests.rb +22 -22
  45. data/test/wkb_reader_tests.rb +10 -9
  46. data/test/wkb_writer_tests.rb +5 -13
  47. data/test/wkt_reader_tests.rb +1 -2
  48. data/test/wkt_writer_tests.rb +9 -14
  49. metadata +6 -3
@@ -1,4 +1,3 @@
1
- # encoding: UTF-8
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require 'test_helper'
@@ -34,4 +33,288 @@ class PolygonTests < Minitest::Test
34
33
  geom = read('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))')
35
34
  assert_equal(1, geom.num_geometries)
36
35
  end
36
+
37
+ def test_x_max
38
+ geom = read('POLYGON ((0 0, 5 0, 8 9, -10 5, 0 0))')
39
+ assert_equal(8, geom.x_max)
40
+ end
41
+
42
+ def test_x_min
43
+ geom = read('POLYGON ((0 0, 5 0, 8 9, -10 5, 0 0))')
44
+ assert_equal(-10, geom.x_min)
45
+ end
46
+
47
+ def test_y_max
48
+ geom = read('POLYGON ((0 0, 5 0, 8 9, -10 5, 0 0))')
49
+ assert_equal(9, geom.y_max)
50
+ end
51
+
52
+ def test_y_min
53
+ geom = read('POLYGON ((0 0, 5 0, 8 9, -10 5, 0 0))')
54
+ assert_equal(0, geom.y_min)
55
+ end
56
+
57
+ def test_z_max
58
+ geom = read('POLYGON ((0 0, 5 0, 8 9, -10 5, 0 0))')
59
+ assert_equal(0, geom.z_min)
60
+
61
+ geom = read('POLYGON Z ((0 0 0, 5 0 3, 8 9 4, -10 5 3, 0 0 0))')
62
+ assert_equal(4, geom.z_max)
63
+ end
64
+
65
+ def test_z_min
66
+ geom = read('POLYGON ((0 0, 5 0, 8 9, -10 5, 0 0))')
67
+ assert_equal(0, geom.z_min)
68
+
69
+ geom = read('POLYGON Z ((0 0 0, 5 0 3, 8 9 4, -10 5 3, 0 0 0))')
70
+ assert_equal(0, geom.z_min)
71
+ end
72
+
73
+ def test_snap_to_grid
74
+ wkt = 'POLYGON ((-10.12 0, -10.12 5, -10.12 5, -10.12 6, -10.12 6, -10.12 6, -10.12 7, -10.12 7, -10.12 7, -10.12 8, -10.12 8, -9 8, -9 9, -10.12 0))'
75
+ expected = 'POLYGON ((-10 0, -10 5, -10 6, -10 7, -10 8, -9 8, -9 9, -10 0))'
76
+
77
+ simple_bang_tester(:snap_to_grid, expected, wkt, 1)
78
+ end
79
+
80
+ def test_snap_to_grid_with_illegal_result
81
+ assert_raises(Geos::InvalidGeometryError) do
82
+ read('POLYGON ((1 1, 10 10, 10 10, 1 1))').
83
+ snap_to_grid
84
+ end
85
+ end
86
+
87
+ def test_snap_to_grid_empty
88
+ assert(read('POLYGON EMPTY').snap_to_grid!.empty?, 'Expected an empty Polygon')
89
+ end
90
+
91
+ def test_snap_to_grid_collapse_holes
92
+ wkt = 'POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0), (2.6 2.6, 2.7 2.6, 2.7 2.7, 2.6 2.7, 2.6 2.6))'
93
+
94
+ assert_equal('POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))', write(read(wkt).snap_to_grid(1)))
95
+ end
96
+
97
+ def test_snap_to_grid_with_srid
98
+ wkt = 'POLYGON ((0.1 0.1, 0.1 5.1, 5.1 5.1, 5.1 0.1, 0.1 0.1))'
99
+ expected = 'POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))'
100
+
101
+ srid_copy_tester(:snap_to_grid, expected, 0, :zero, wkt, 1)
102
+ srid_copy_tester(:snap_to_grid, expected, 4326, :lenient, wkt, 1)
103
+ srid_copy_tester(:snap_to_grid, expected, 4326, :strict, wkt, 1)
104
+ end
105
+
106
+ def test_rotate
107
+ wkt = 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))'
108
+
109
+ affine_tester(:rotate,
110
+ 'POLYGON ((30 10, 30 15, 25 15, 25 10, 30 10))',
111
+ wkt,
112
+ Math::PI / 2,
113
+ [ 10.0, 20.0 ])
114
+
115
+ affine_tester(:rotate,
116
+ 'POLYGON ((-3 1, -3 -4, 2 -4, 2 1, -3 1))',
117
+ wkt,
118
+ -Math::PI / 2,
119
+ [ -1.0, 2.0 ])
120
+
121
+ affine_tester(:rotate,
122
+ 'POLYGON ((2 2, -3 2, -3 -3, 2 -3, 2 2))',
123
+ wkt,
124
+ Math::PI, read('POINT(1 1)'))
125
+
126
+ affine_tester(:rotate,
127
+ 'POLYGON ((0.5 -0.5, 0.5 4.5, -4.5 4.5, -4.5 -0.5, 0.5 -0.5))',
128
+ wkt,
129
+ Math::PI / 2,
130
+ read('LINESTRING(0 0, 1 0)'))
131
+ end
132
+
133
+ def test_rotate_x
134
+ writer.output_dimensions = 3
135
+
136
+ wkt = 'POLYGON Z ((0 0 0, 5 0 0, 5 5 0, 0 5 0, 0 0 0))'
137
+
138
+ affine_tester(:rotate_x,
139
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 -5 0, 0 -5 0, 0 0 0))',
140
+ wkt,
141
+ Math::PI)
142
+
143
+ affine_tester(:rotate_x,
144
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 0 5, 0 0 5, 0 0 0))',
145
+ wkt,
146
+ Math::PI / 2)
147
+
148
+ affine_tester(:rotate_x,
149
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 0 -5, 0 0 -5, 0 0 0))',
150
+ wkt,
151
+ Math::PI + Math::PI / 2)
152
+
153
+ affine_tester(:rotate_x,
154
+ wkt,
155
+ wkt,
156
+ Math::PI * 2)
157
+ end
158
+
159
+ def test_rotate_y
160
+ writer.output_dimensions = 3
161
+
162
+ wkt = 'POLYGON Z ((0 0 0, 5 0 0, 5 5 0, 0 5 0, 0 0 0))'
163
+
164
+ affine_tester(:rotate_y,
165
+ 'POLYGON Z ((0 0 0, -5 0 0, -5 5 0, 0 5 0, 0 0 0))',
166
+ wkt,
167
+ Math::PI)
168
+
169
+ affine_tester(:rotate_y,
170
+ 'POLYGON Z ((0 0 0, 0 0 -5, 0 5 -5, 0 5 0, 0 0 0))',
171
+ wkt,
172
+ Math::PI / 2)
173
+
174
+ affine_tester(:rotate_y,
175
+ 'POLYGON Z ((0 0 0, 0 0 5, 0 5 5, 0 5 0, 0 0 0))',
176
+ wkt,
177
+ Math::PI + Math::PI / 2)
178
+
179
+ affine_tester(:rotate_y,
180
+ wkt,
181
+ wkt,
182
+ Math::PI * 2)
183
+ end
184
+
185
+ def test_rotate_z
186
+ affine_tester(:rotate_z,
187
+ 'POLYGON ((0 0, -5 0, -5 -5, 0 -5, 0 0))',
188
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
189
+ Math::PI)
190
+
191
+ affine_tester(:rotate_z,
192
+ 'POLYGON ((0 0, 0 5, -5 5, -5 0, 0 0))',
193
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
194
+ Math::PI / 2)
195
+
196
+ affine_tester(:rotate_z,
197
+ 'POLYGON ((0 0, 0 -5, 5 -5, 5 0, 0 0))',
198
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
199
+ Math::PI + Math::PI / 2)
200
+
201
+ affine_tester(:rotate_z,
202
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
203
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
204
+ Math::PI * 2)
205
+ end
206
+
207
+ def test_scale
208
+ affine_tester(:scale,
209
+ 'POLYGON ((0 0, 25 0, 25 25, 0 25, 0 0))',
210
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
211
+ 5,
212
+ 5)
213
+
214
+ affine_tester(:scale,
215
+ 'POLYGON ((0 0, 15 0, 15 10, 0 10, 0 0))',
216
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
217
+ 3,
218
+ 2)
219
+
220
+ writer.output_dimensions = 3
221
+
222
+ affine_tester(:scale,
223
+ 'POLYGON Z ((0 0 0, 20 0 0, 20 10 0, 0 10 0, 0 0 0))',
224
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 5 0, 0 5 0, 0 0 0))',
225
+ 4,
226
+ 2,
227
+ -8)
228
+ end
229
+
230
+ def test_scale_hash
231
+ affine_tester(:scale,
232
+ 'POLYGON ((0 0, 25 0, 25 25, 0 25, 0 0))',
233
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
234
+ x: 5,
235
+ y: 5)
236
+
237
+ affine_tester(:scale,
238
+ 'POLYGON ((0 0, 15 0, 15 10, 0 10, 0 0))',
239
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
240
+ x: 3,
241
+ y: 2)
242
+
243
+ writer.output_dimensions = 3
244
+
245
+ affine_tester(:scale,
246
+ 'POLYGON Z ((0 0 0, 20 0 0, 20 10 0, 0 10 0, 0 0 -80))',
247
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 5 0, 0 5 0, 0 0 10))',
248
+ x: 4,
249
+ y: 2,
250
+ z: -8)
251
+ end
252
+
253
+ def test_trans_scale
254
+ affine_tester(:trans_scale, 'POLYGON ((2 2, 11 11, 21 2, 2 2))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 1, 1, 1, 1)
255
+ affine_tester(:trans_scale, 'POLYGON ((3 3, 12 12, 22 3, 3 3))', 'POLYGON ((2 2, 11 11, 21 2, 2 2))', 1, 1, 1, 1)
256
+ affine_tester(:trans_scale, 'POLYGON ((0 0, -9 -9, -19 0, 0 0))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', -1, -1, -1, -1)
257
+ affine_tester(:trans_scale, 'POLYGON ((1 2, 10 11, 20 2, 1 2))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 0, 1, 1, 1)
258
+ affine_tester(:trans_scale, 'POLYGON ((2 1, 11 10, 21 1, 2 1))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 1, 0, 1, 1)
259
+ affine_tester(:trans_scale, 'POLYGON ((2 0, 11 0, 21 0, 2 0))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 1, 1, 1, 0)
260
+ affine_tester(:trans_scale, 'POLYGON ((3 2, 12 11, 22 2, 3 2))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 2, 1, 1, 1)
261
+ affine_tester(:trans_scale, 'POLYGON ((2 3, 11 12, 21 3, 2 3))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 1, 2, 1, 1)
262
+ affine_tester(:trans_scale, 'POLYGON ((4 2, 22 11, 42 2, 4 2))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 1, 1, 2, 1)
263
+ affine_tester(:trans_scale, 'POLYGON ((2 4, 11 22, 21 4, 2 4))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 1, 1, 1, 2)
264
+ affine_tester(:trans_scale, 'POLYGON ((15 28, 60 91, 110 28, 15 28))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 2, 3, 5, 7)
265
+
266
+ writer.output_dimensions = 3
267
+ affine_tester(:trans_scale, 'POLYGON Z ((15 28 1, 60 91 10, 110 28 1, 15 28 1))', 'POLYGON Z ((1 1 1, 10 10 10, 20 1 1, 1 1 1))', 2, 3, 5, 7)
268
+ end
269
+
270
+ def test_trans_scale_hash
271
+ affine_tester(:trans_scale,
272
+ 'POLYGON ((2 2, 11 11, 21 2, 2 2))',
273
+ 'POLYGON ((1 1, 10 10, 20 1, 1 1))',
274
+ delta_x: 1, delta_y: 1, x_factor: 1, y_factor: 1)
275
+
276
+ writer.output_dimensions = 3
277
+
278
+ affine_tester(:trans_scale, 'POLYGON Z ((15 28 1, 60 91 10, 110 28 1, 15 28 1))',
279
+ 'POLYGON Z ((1 1 1, 10 10 10, 20 1 1, 1 1 1))',
280
+ delta_x: 2, delta_y: 3, x_factor: 5, y_factor: 7)
281
+
282
+ affine_tester(:trans_scale, 'POLYGON Z ((3 1 1, 12 10 10, 22 1 1, 3 1 1))',
283
+ 'POLYGON Z ((1 1 1, 10 10 10, 20 1 1, 1 1 1))',
284
+ delta_x: 2, z_factor: 2)
285
+ end
286
+
287
+ def test_translate
288
+ affine_tester(:translate,
289
+ 'POLYGON ((5 12, 10 12, 10 17, 5 17, 5 12))',
290
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
291
+ 5,
292
+ 12)
293
+
294
+ writer.output_dimensions = 3
295
+
296
+ affine_tester(:translate,
297
+ 'POLYGON Z ((-3 -7 3, 2 -7 3, 2 -2 3, -3 -2 3, -3 -7 3))',
298
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 5 0, 0 5 0, 0 0 0))',
299
+ -3,
300
+ -7,
301
+ 3)
302
+ end
303
+
304
+ def test_translate_hash
305
+ affine_tester(:translate,
306
+ 'POLYGON ((5 12, 10 12, 10 17, 5 17, 5 12))',
307
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
308
+ x: 5,
309
+ y: 12)
310
+
311
+ writer.output_dimensions = 3
312
+
313
+ affine_tester(:translate,
314
+ 'POLYGON Z ((-3 -7 3, 2 -7 3, 2 -2 3, -3 -2 3, -3 -7 3))',
315
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 5 0, 0 5 0, 0 0 0))',
316
+ x: -3,
317
+ y: -7,
318
+ z: 3)
319
+ end
37
320
  end
@@ -1,4 +1,3 @@
1
- # encoding: UTF-8
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require 'test_helper'
@@ -25,7 +24,7 @@ class PreparedGeometryTests < Minitest::Test
25
24
  [ LINESTRING_C, LINESTRING_A ],
26
25
  [ LINESTRING_D, LINESTRING_A ],
27
26
  [ POLYGON_A, POLYGON_B ],
28
- [ POLYGON_A, POINT_C ],
27
+ [ POLYGON_A, POINT_C ]
29
28
  ].each_with_index do |(geom_a, geom_b), i|
30
29
  geom_a = read(geom_a).to_prepared
31
30
  geom_b = read(geom_b)
@@ -113,4 +112,3 @@ class PreparedGeometryTests < Minitest::Test
113
112
  end
114
113
  end
115
114
  end
116
-
@@ -1,4 +1,3 @@
1
- # encoding: UTF-8
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require 'test_helper'
@@ -8,7 +7,7 @@ class STRtreeTests < Minitest::Test
8
7
 
9
8
  def setup_tree
10
9
  @tree = Geos::STRtree.new(3)
11
- @item_1 = { :item_1 => :test }
10
+ @item_1 = { item_1: :test }
12
11
  @item_2 = [ :test ]
13
12
  @item_3 = Object.new
14
13
 
@@ -82,7 +81,7 @@ class STRtreeTests < Minitest::Test
82
81
 
83
82
  assert_equal(
84
83
  [
85
- { :item => @item_1, :geometry => @geom_1 }
84
+ { item: @item_1, geometry: @geom_1 }
86
85
  ],
87
86
  @tree.query(read('LINESTRING(5 5, 6 6)'), :all)
88
87
  )
@@ -92,17 +91,17 @@ class STRtreeTests < Minitest::Test
92
91
 
93
92
  assert_equal(
94
93
  [
95
- { :item => @item_2, :geometry => @geom_2 },
96
- { :item => @item_3, :geometry => @geom_3 }
94
+ { item: @item_2, geometry: @geom_2 },
95
+ { item: @item_3, geometry: @geom_3 }
97
96
  ],
98
97
  @tree.query(read('LINESTRING(25 25, 26 26)'), :all)
99
98
  )
100
99
 
101
100
  assert_equal(
102
101
  [
103
- { :item => @item_1, :geometry => @geom_1 },
104
- { :item => @item_2, :geometry => @geom_2 },
105
- { :item => @item_3, :geometry => @geom_3 }
102
+ { item: @item_1, geometry: @geom_1 },
103
+ { item: @item_2, geometry: @geom_2 },
104
+ { item: @item_3, geometry: @geom_3 }
106
105
  ],
107
106
  @tree.query(read('LINESTRING(0 0, 100 100)'), :all)
108
107
  )
@@ -184,7 +183,7 @@ class STRtreeTests < Minitest::Test
184
183
  skip unless ENV['FORCE_TESTS'] || defined?(Geos::STRtree)
185
184
 
186
185
  tree = Geos::STRtree.new(
187
- [ read('LINESTRING(0 0, 10 10)'), item_1 = { :item_1 => :test } ],
186
+ [ read('LINESTRING(0 0, 10 10)'), item_1 = { item_1: :test } ],
188
187
  [ read('LINESTRING(20 20, 30 30)'), item_2 = [ :test ] ],
189
188
  [ read('LINESTRING(20 20, 30 30)'), item_3 = Object.new ]
190
189
  )
@@ -346,7 +345,7 @@ class STRtreeTests < Minitest::Test
346
345
  geom_3 = read('POINT (5 4)')
347
346
  geom_4 = read('POINT (3 8)')
348
347
 
349
- item_1 = { :item_1 => :test }
348
+ item_1 = { item_1: :test }
350
349
  item_2 = [ :test ]
351
350
  item_3 = Object.new
352
351
 
@@ -1,5 +1,4 @@
1
- # encoding: BINARY
2
- # frozen_string_literal: true
1
+ # encoding: BINARY; frozen_string_literal: true
3
2
 
4
3
  if RUBY_VERSION >= '1.9'
5
4
  require 'simplecov'
@@ -32,10 +31,7 @@ else
32
31
  end
33
32
 
34
33
  puts "ffi-geos version #{Geos::VERSION}" if defined?(Geos::VERSION)
35
-
36
- if defined?(Geos::FFIGeos)
37
- puts "Using #{Geos::FFIGeos.geos_library_path}"
38
- end
34
+ puts "Using #{Geos::FFIGeos.geos_library_path}" if defined?(Geos::FFIGeos)
39
35
 
40
36
  module TestHelper
41
37
  TOLERANCE = 0.0000000000001
@@ -86,14 +82,14 @@ module TestHelper
86
82
  end
87
83
 
88
84
  {
89
- :empty => 'to be empty',
90
- :valid => 'to be valid',
91
- :simple => 'to be simple',
92
- :ring => 'to be ring',
93
- :closed => 'to be closed',
94
- :has_z => 'to have z dimension'
85
+ empty: 'to be empty',
86
+ valid: 'to be valid',
87
+ simple: 'to be simple',
88
+ ring: 'to be ring',
89
+ closed: 'to be closed',
90
+ has_z: 'to have z dimension'
95
91
  }.each do |t, m|
96
- self.class_eval(<<-EOF, __FILE__, __LINE__ + 1)
92
+ class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
97
93
  def assert_geom_#{t}(geom)
98
94
  assert(geom.#{t}?, "Expected geom #{m}")
99
95
  end
@@ -101,20 +97,24 @@ module TestHelper
101
97
  def refute_geom_#{t}(geom)
102
98
  assert(!geom.#{t}?, "Did not expect geom #{m}")
103
99
  end
104
- EOF
100
+ RUBY
105
101
  end
106
102
 
107
103
  def assert_geom_eql_exact(geom, result, tolerance = TOLERANCE)
108
104
  assert(geom.eql_exact?(result, tolerance), "Expected geom.eql_exact? to be within #{tolerance}")
109
105
  end
110
106
 
111
- def simple_tester(method, expected, geom, *args)
107
+ def snapped_tester(method, expected, geom, *args)
112
108
  geom = geom_from_geom_or_wkt(geom)
109
+
113
110
  result = geom.send(method, *args)
111
+ assert_equal(expected, write(result.snap_to_grid(1)))
112
+ end
114
113
 
115
- if result.is_a?(Geos::Geometry)
116
- result = write(result)
117
- end
114
+ def simple_tester(method, expected, geom, *args)
115
+ geom = geom_from_geom_or_wkt(geom)
116
+ result = geom.send(method, *args)
117
+ result = write(result) if result.is_a?(Geos::Geometry)
118
118
 
119
119
  assert_equal(expected, result)
120
120
  end
@@ -154,9 +154,40 @@ module TestHelper
154
154
 
155
155
  assert_equal(expected, result)
156
156
  end
157
+
158
+ def affine_tester(method, expected, wkt, *args)
159
+ writer.trim = true
160
+
161
+ geom = read(wkt)
162
+ geom.send("#{method}!", *args).snap_to_grid!(0.1)
163
+
164
+ assert_equal(expected, write(geom))
165
+
166
+ geom = read(wkt)
167
+ geom2 = geom.send(method, *args).snap_to_grid(0.1)
168
+
169
+ assert_equal(wkt, write(geom))
170
+ assert_equal(expected, write(geom2, :trim => true))
171
+ end
157
172
  end
158
173
 
159
174
  if RUBY_VERSION >= '1.9'
160
175
  Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new)
161
176
  end
162
177
 
178
+ if !Fixnum.method_defined?(:negative?)
179
+ class Fixnum
180
+ def negative?
181
+ self < 0
182
+ end
183
+ end
184
+ end
185
+
186
+ if !Fixnum.method_defined?(:positive?)
187
+ class Fixnum
188
+ def positive?
189
+ self > 0
190
+ end
191
+ end
192
+ end
193
+