ffi-geos 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
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
+