ffi-geos 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -5
  3. data/MIT-LICENSE +1 -1
  4. data/lib/ffi-geos.rb +90 -8
  5. data/lib/ffi-geos/buffer_params.rb +8 -7
  6. data/lib/ffi-geos/coordinate_sequence.rb +14 -13
  7. data/lib/ffi-geos/geometry.rb +120 -71
  8. data/lib/ffi-geos/geometry_collection.rb +2 -1
  9. data/lib/ffi-geos/interrupt.rb +2 -0
  10. data/lib/ffi-geos/line_string.rb +5 -4
  11. data/lib/ffi-geos/linear_ring.rb +1 -0
  12. data/lib/ffi-geos/multi_line_string.rb +2 -1
  13. data/lib/ffi-geos/multi_point.rb +1 -0
  14. data/lib/ffi-geos/multi_polygon.rb +1 -0
  15. data/lib/ffi-geos/point.rb +4 -3
  16. data/lib/ffi-geos/polygon.rb +4 -3
  17. data/lib/ffi-geos/prepared_geometry.rb +13 -12
  18. data/lib/ffi-geos/strtree.rb +61 -13
  19. data/lib/ffi-geos/tools.rb +2 -1
  20. data/lib/ffi-geos/utils.rb +12 -11
  21. data/lib/ffi-geos/version.rb +2 -1
  22. data/lib/ffi-geos/wkb_reader.rb +5 -4
  23. data/lib/ffi-geos/wkb_writer.rb +11 -10
  24. data/lib/ffi-geos/wkt_reader.rb +4 -3
  25. data/lib/ffi-geos/wkt_writer.rb +9 -8
  26. data/test/coordinate_sequence_tests.rb +1 -0
  27. data/test/geometry_collection_tests.rb +1 -0
  28. data/test/geometry_tests.rb +88 -0
  29. data/test/interrupt_tests.rb +1 -0
  30. data/test/line_string_tests.rb +1 -0
  31. data/test/linear_ring_tests.rb +1 -0
  32. data/test/misc_tests.rb +99 -0
  33. data/test/multi_line_string_tests.rb +1 -0
  34. data/test/point_tests.rb +1 -0
  35. data/test/polygon_tests.rb +1 -0
  36. data/test/prepared_geometry_tests.rb +1 -0
  37. data/test/strtree_tests.rb +143 -2
  38. data/test/test_helper.rb +8 -2
  39. data/test/tools_tests.rb +1 -0
  40. data/test/utils_tests.rb +1 -0
  41. data/test/wkb_reader_tests.rb +1 -0
  42. data/test/wkb_writer_tests.rb +3 -4
  43. data/test/wkt_reader_tests.rb +1 -0
  44. data/test/wkt_writer_tests.rb +1 -0
  45. metadata +9 -9
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
- VERSION = "1.1.1".freeze
5
+ VERSION = '1.2.0'.freeze
5
6
  end
6
7
 
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class WkbReader
@@ -13,7 +14,7 @@ module Geos
13
14
  ptr = if args.first.is_a?(FFI::Pointer)
14
15
  args.first
15
16
  else
16
- FFIGeos.GEOSWKBReader_create_r(Geos.current_handle, *args)
17
+ FFIGeos.GEOSWKBReader_create_r(Geos.current_handle_pointer, *args)
17
18
  end
18
19
 
19
20
  @ptr = FFI::AutoPointer.new(
@@ -23,7 +24,7 @@ module Geos
23
24
  end
24
25
 
25
26
  def read(wkb, options = {})
26
- cast_geometry_ptr(FFIGeos.GEOSWKBReader_read_r(Geos.current_handle, self.ptr, wkb, wkb.bytesize), {
27
+ cast_geometry_ptr(FFIGeos.GEOSWKBReader_read_r(Geos.current_handle_pointer, self.ptr, wkb, wkb.bytesize), {
27
28
  :srid => options[:srid]
28
29
  })
29
30
  rescue Geos::GEOSException => e
@@ -31,7 +32,7 @@ module Geos
31
32
  end
32
33
 
33
34
  def read_hex(wkb, options = {})
34
- cast_geometry_ptr(FFIGeos.GEOSWKBReader_readHEX_r(Geos.current_handle, self.ptr, wkb, wkb.bytesize), {
35
+ cast_geometry_ptr(FFIGeos.GEOSWKBReader_readHEX_r(Geos.current_handle_pointer, self.ptr, wkb, wkb.bytesize), {
35
36
  :srid => options[:srid]
36
37
  })
37
38
  rescue Geos::GEOSException => e
@@ -39,7 +40,7 @@ module Geos
39
40
  end
40
41
 
41
42
  def self.release(ptr) #:nodoc:
42
- FFIGeos.GEOSWKBReader_destroy_r(Geos.current_handle, ptr)
43
+ FFIGeos.GEOSWKBReader_destroy_r(Geos.current_handle_pointer, ptr)
43
44
  end
44
45
  end
45
46
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class WkbWriter
@@ -11,7 +12,7 @@ module Geos
11
12
  :include_srid => false
12
13
  }.merge(options)
13
14
 
14
- ptr = FFIGeos.GEOSWKBWriter_create_r(Geos.current_handle)
15
+ ptr = FFIGeos.GEOSWKBWriter_create_r(Geos.current_handle_pointer)
15
16
  @ptr = FFI::AutoPointer.new(
16
17
  ptr,
17
18
  self.class.method(:release)
@@ -21,7 +22,7 @@ module Geos
21
22
  end
22
23
 
23
24
  def self.release(ptr) #:nodoc:
24
- FFIGeos.GEOSWKBWriter_destroy_r(Geos.current_handle, ptr)
25
+ FFIGeos.GEOSWKBWriter_destroy_r(Geos.current_handle_pointer, ptr)
25
26
  end
26
27
 
27
28
  # Options can be set temporarily for individual writes using an options
@@ -36,7 +37,7 @@ module Geos
36
37
  end
37
38
 
38
39
  size_t = FFI::MemoryPointer.new(:size_t)
39
- FFIGeos.GEOSWKBWriter_write_r(Geos.current_handle, self.ptr, geom.ptr, size_t).get_bytes(0, size_t.read_int)
40
+ FFIGeos.GEOSWKBWriter_write_r(Geos.current_handle_pointer, self.ptr, geom.ptr, size_t).get_bytes(0, size_t.read_int)
40
41
  ensure
41
42
  set_options(old_options) unless old_options.nil?
42
43
  end
@@ -51,7 +52,7 @@ module Geos
51
52
  end
52
53
 
53
54
  size_t = FFI::MemoryPointer.new(:size_t)
54
- FFIGeos.GEOSWKBWriter_writeHEX_r(Geos.current_handle, self.ptr, geom.ptr, size_t).get_string(0, size_t.read_int)
55
+ FFIGeos.GEOSWKBWriter_writeHEX_r(Geos.current_handle_pointer, self.ptr, geom.ptr, size_t).get_string(0, size_t.read_int)
55
56
  ensure
56
57
  set_options(old_options) unless old_options.nil?
57
58
  end
@@ -60,30 +61,30 @@ module Geos
60
61
  if dim < 2 || dim > 3
61
62
  raise ArgumentError.new("Output dimensions must be either 2 or 3")
62
63
  end
63
- FFIGeos.GEOSWKBWriter_setOutputDimension_r(Geos.current_handle, self.ptr, dim)
64
+ FFIGeos.GEOSWKBWriter_setOutputDimension_r(Geos.current_handle_pointer, self.ptr, dim)
64
65
  end
65
66
 
66
67
  def output_dimensions
67
- FFIGeos.GEOSWKBWriter_getOutputDimension_r(Geos.current_handle, self.ptr)
68
+ FFIGeos.GEOSWKBWriter_getOutputDimension_r(Geos.current_handle_pointer, self.ptr)
68
69
  end
69
70
 
70
71
  def include_srid
71
- bool_result(FFIGeos.GEOSWKBWriter_getIncludeSRID_r(Geos.current_handle, self.ptr))
72
+ bool_result(FFIGeos.GEOSWKBWriter_getIncludeSRID_r(Geos.current_handle_pointer, self.ptr))
72
73
  end
73
74
 
74
75
  def include_srid=(val)
75
- FFIGeos.GEOSWKBWriter_setIncludeSRID_r(Geos.current_handle, self.ptr,
76
+ FFIGeos.GEOSWKBWriter_setIncludeSRID_r(Geos.current_handle_pointer, self.ptr,
76
77
  Geos::Tools.bool_to_int(val)
77
78
  )
78
79
  end
79
80
 
80
81
  def byte_order
81
- FFIGeos.GEOSWKBWriter_getByteOrder_r(Geos.current_handle, self.ptr)
82
+ FFIGeos.GEOSWKBWriter_getByteOrder_r(Geos.current_handle_pointer, self.ptr)
82
83
  end
83
84
 
84
85
  def byte_order=(val)
85
86
  check_enum_value(Geos::ByteOrders, val)
86
- FFIGeos.GEOSWKBWriter_setByteOrder_r(Geos.current_handle, self.ptr, val)
87
+ FFIGeos.GEOSWKBWriter_setByteOrder_r(Geos.current_handle_pointer, self.ptr, val)
87
88
  end
88
89
 
89
90
  private
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class WktReader
@@ -13,7 +14,7 @@ module Geos
13
14
  ptr = if args.first.is_a?(FFI::Pointer)
14
15
  args.first
15
16
  else
16
- FFIGeos.GEOSWKTReader_create_r(Geos.current_handle, *args)
17
+ FFIGeos.GEOSWKTReader_create_r(Geos.current_handle_pointer, *args)
17
18
  end
18
19
 
19
20
  @ptr = FFI::AutoPointer.new(
@@ -23,7 +24,7 @@ module Geos
23
24
  end
24
25
 
25
26
  def read(wkt, options = {})
26
- cast_geometry_ptr(FFIGeos.GEOSWKTReader_read_r(Geos.current_handle, self.ptr, wkt), {
27
+ cast_geometry_ptr(FFIGeos.GEOSWKTReader_read_r(Geos.current_handle_pointer, self.ptr, wkt), {
27
28
  :srid => options[:srid]
28
29
  })
29
30
  rescue Geos::GEOSException => e
@@ -31,7 +32,7 @@ module Geos
31
32
  end
32
33
 
33
34
  def self.release(ptr) #:nodoc:
34
- FFIGeos.GEOSWKTReader_destroy_r(Geos.current_handle, ptr)
35
+ FFIGeos.GEOSWKTReader_destroy_r(Geos.current_handle_pointer, ptr)
35
36
  end
36
37
  end
37
38
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class WktWriter
@@ -15,7 +16,7 @@ module Geos
15
16
  :output_dimensions => 2
16
17
  }.merge(options)
17
18
 
18
- ptr = FFIGeos.GEOSWKTWriter_create_r(Geos.current_handle)
19
+ ptr = FFIGeos.GEOSWKTWriter_create_r(Geos.current_handle_pointer)
19
20
  @ptr = FFI::AutoPointer.new(
20
21
  ptr,
21
22
  self.class.method(:release)
@@ -25,7 +26,7 @@ module Geos
25
26
  end
26
27
 
27
28
  def self.release(ptr) #:nodoc:
28
- FFIGeos.GEOSWKTWriter_destroy_r(Geos.current_handle, ptr)
29
+ FFIGeos.GEOSWKTWriter_destroy_r(Geos.current_handle_pointer, ptr)
29
30
  end
30
31
 
31
32
  def set_options(options) #:nodoc:
@@ -50,7 +51,7 @@ module Geos
50
51
  set_options(options)
51
52
  end
52
53
 
53
- FFIGeos.GEOSWKTWriter_write_r(Geos.current_handle, self.ptr, geom.ptr)
54
+ FFIGeos.GEOSWKTWriter_write_r(Geos.current_handle_pointer, self.ptr, geom.ptr)
54
55
  ensure
55
56
  set_options(old_options) unless options.nil?
56
57
  end
@@ -59,7 +60,7 @@ module Geos
59
60
  # Available in GEOS 3.3+.
60
61
  def trim=(val)
61
62
  @trim = !!val
62
- FFIGeos.GEOSWKTWriter_setTrim_r(Geos.current_handle, self.ptr,
63
+ FFIGeos.GEOSWKTWriter_setTrim_r(Geos.current_handle_pointer, self.ptr,
63
64
  Geos::Tools.bool_to_int(@trim)
64
65
  )
65
66
  end
@@ -74,7 +75,7 @@ module Geos
74
75
  end
75
76
 
76
77
  @rounding_precision = r
77
- FFIGeos.GEOSWKTWriter_setRoundingPrecision_r(Geos.current_handle, self.ptr, @rounding_precision)
78
+ FFIGeos.GEOSWKTWriter_setRoundingPrecision_r(Geos.current_handle_pointer, self.ptr, @rounding_precision)
78
79
  end
79
80
  end
80
81
 
@@ -82,7 +83,7 @@ module Geos
82
83
  # Available in GEOS 3.3+.
83
84
  def old_3d=(val)
84
85
  @old_3d = !!val
85
- FFIGeos.GEOSWKTWriter_setOld3D_r(Geos.current_handle, self.ptr,
86
+ FFIGeos.GEOSWKTWriter_setOld3D_r(Geos.current_handle_pointer, self.ptr,
86
87
  Geos::Tools.bool_to_int(@old_3d)
87
88
  )
88
89
  end
@@ -95,14 +96,14 @@ module Geos
95
96
  if dim < 2 || dim > 3
96
97
  raise ArgumentError.new("Output dimensions must be either 2 or 3")
97
98
  end
98
- FFIGeos.GEOSWKTWriter_setOutputDimension_r(Geos.current_handle, self.ptr, dim)
99
+ FFIGeos.GEOSWKTWriter_setOutputDimension_r(Geos.current_handle_pointer, self.ptr, dim)
99
100
  end
100
101
  end
101
102
 
102
103
  if FFIGeos.respond_to?(:GEOSWKTWriter_getOutputDimension_r)
103
104
  # Available in GEOS 3.3+.
104
105
  def output_dimensions
105
- FFIGeos.GEOSWKTWriter_getOutputDimension_r(Geos.current_handle, self.ptr)
106
+ FFIGeos.GEOSWKTWriter_getOutputDimension_r(Geos.current_handle_pointer, self.ptr)
106
107
  end
107
108
  end
108
109
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  $: << File.dirname(__FILE__)
4
5
  require 'test_helper'
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  $: << File.dirname(__FILE__)
4
5
  require 'test_helper'
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  $: << File.dirname(__FILE__)
4
5
  require 'test_helper'
@@ -1635,4 +1636,91 @@ class GeometryTests < Minitest::Test
1635
1636
  @writer.rounding_precision = 3
1636
1637
  tester['GEOMETRYCOLLECTION (POLYGON ((290 252, 290 140, 185 140, 185 215, 188 235, 290 252)), POLYGON ((80 215, 80 340, 101 340, 188 235, 185 215, 80 215)), POLYGON ((185 140, 80 140, 80 215, 185 215, 185 140)), POLYGON ((101 340, 290 340, 290 252, 188 235, 101 340)))', "MULTIPOINT ((150 210), (210 270), (150 220), (220 210), (215 269))", 10]
1637
1638
  end
1639
+
1640
+ def test_precision
1641
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:precision)
1642
+
1643
+ geom = read('POLYGON EMPTY')
1644
+ scale = geom.precision
1645
+ assert_equal(0.0, scale)
1646
+
1647
+ geom_with_precision = geom.with_precision(2.0)
1648
+
1649
+ assert_equal('POLYGON EMPTY', write(geom_with_precision))
1650
+ scale = geom_with_precision.precision
1651
+ assert_equal(2.0, scale)
1652
+ end
1653
+
1654
+ def test_with_precision
1655
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:with_precision)
1656
+
1657
+ geom = read('LINESTRING(1 0, 2 0)')
1658
+
1659
+ geom_with_precision = geom.with_precision(5.0)
1660
+ assert_equal('LINESTRING EMPTY', write(geom_with_precision))
1661
+
1662
+ geom_with_precision = geom.with_precision(5.0, :keep_collapsed => true)
1663
+ assert_equal('LINESTRING (0 0, 0 0)', write(geom_with_precision))
1664
+ end
1665
+
1666
+ def test_minimum_rotated_rectangle
1667
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:minimum_rotated_rectangle)
1668
+
1669
+ geom = read('POLYGON ((1 6, 6 11, 11 6, 6 1, 1 6))')
1670
+ minimum_rotated_rectangle = geom.minimum_rotated_rectangle
1671
+
1672
+ assert_equal('POLYGON ((6 1, 11 6, 6 11, 1 6, 6 1))', write(minimum_rotated_rectangle))
1673
+ end
1674
+
1675
+ def test_minimum_clearance
1676
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:minimum_clearance)
1677
+
1678
+ tester = lambda { |expected_clearance, geom|
1679
+ geom = read(geom)
1680
+ clearance = geom.minimum_clearance
1681
+
1682
+ if expected_clearance.eql?(Float::INFINITY)
1683
+ assert(clearance.infinite?)
1684
+ else
1685
+ assert_in_delta(expected_clearance, clearance, TOLERANCE)
1686
+ end
1687
+ }
1688
+
1689
+ tester[Float::INFINITY, 'LINESTRING EMPTY']
1690
+ tester[20, 'LINESTRING (30 100, 10 100)']
1691
+ tester[100, 'LINESTRING (200 200, 200 100)']
1692
+ tester[3.49284983912134e-05, 'LINESTRING (-112.712119 33.575919, -112.712127 33.575885)']
1693
+ end
1694
+
1695
+ def test_minimum_clearance_line
1696
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:minimum_clearance_line)
1697
+
1698
+ tester = lambda { |expected_geom, geom|
1699
+ geom = read(geom)
1700
+ clearance_geom = geom.minimum_clearance_line
1701
+
1702
+ assert_equal(expected_geom, write(clearance_geom))
1703
+ }
1704
+
1705
+ tester['LINESTRING EMPTY', 'MULTIPOINT ((100 100), (100 100))']
1706
+ tester['LINESTRING (30 100, 10 100)', 'MULTIPOINT ((100 100), (10 100), (30 100))']
1707
+ tester['LINESTRING (200 200, 200 100)', 'POLYGON ((100 100, 300 100, 200 200, 100 100))']
1708
+ tester[
1709
+ 'LINESTRING (-112.712119 33.575919, -112.712127 33.575885)',
1710
+ '0106000000010000000103000000010000001a00000035d42824992d5cc01b834e081dca404073b9c150872d5cc03465a71fd4c940400ec00644882d5cc03b8a73d4d1c94040376dc669882d5cc0bf9cd9aed0c940401363997e892d5cc002f4fbfecdc94040ca4e3fa88b2d5cc0a487a1d5c9c940408f1ce90c8c2d5cc0698995d1c8c94040fab836548c2d5cc0bd175fb4c7c940409f1f46088f2d5cc0962023a0c2c940407b15191d902d5cc068041bd7bfc940400397c79a912d5cc0287d21e4bcc940403201bf46922d5cc065e3c116bbc940409d9d0c8e922d5cc0060fd3beb9c940400ef7915b932d5cc09012bbb6b7c940404fe61f7d932d5cc0e4a08499b6c94040fc71fbe5932d5cc0ea9106b7b5c94040eaec6470942d5cc0c2323674b3c94040601dc70f952d5cc043588d25acc94040aea06989952d5cc03ecf9f36aac94040307f85cc952d5cc0e5eb32fca7c94040dd0a6135962d5cc01b615111a7c9404048a7ae7c962d5cc00a2aaa7ea5c94040f4328ae5962d5cc05eb87361a4c94040c49448a2972d5cc04d81cccea2c940407c80eecb992d5cc06745d4449fc9404035d42824992d5cc01b834e081dca4040'
1711
+ ]
1712
+ tester['LINESTRING EMPTY', 'POLYGON EMPTY']
1713
+ end
1714
+
1715
+ def test_minimum_width
1716
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:minimum_width)
1717
+
1718
+ geom = read('POLYGON ((0 0, 0 15, 5 10, 5 0, 0 0))')
1719
+ output = geom.minimum_width
1720
+ assert_equal('LINESTRING (0 0, 5 0)', write(output))
1721
+
1722
+ geom = read('LINESTRING (0 0,0 10, 10 10)')
1723
+ output = geom.minimum_width
1724
+ assert_equal('LINESTRING (5 5, 0 10)', write(output))
1725
+ end
1638
1726
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  $: << File.dirname(__FILE__)
4
5
  require 'test_helper'
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  $: << File.dirname(__FILE__)
4
5
  require 'test_helper'
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  $: << File.dirname(__FILE__)
4
5
  require 'test_helper'
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  $: << File.dirname(__FILE__)
4
5
  require 'test_helper'
@@ -105,4 +106,102 @@ class MiscTests < Minitest::Test
105
106
  Geos::BufferParams.new.dup
106
107
  end
107
108
  end
109
+
110
+ def notice_handler_tester
111
+ results = ''.dup
112
+ geom = read('POLYGON((0 0, 0 5, 5 0, 5 5, 0 0))')
113
+
114
+ yield results
115
+
116
+ refute(geom.valid?, "Expected geom to be invalid")
117
+ assert_match(/^NOTICE: .+$/, results)
118
+ ensure
119
+ Geos.current_handle.reset_notice_handler
120
+ end
121
+
122
+ def notice_handler_method(results, *args)
123
+ results << "NOTICE: #{args[0] % args[1]}"
124
+ end
125
+
126
+ def test_setting_notice_handler_with_method
127
+ skip unless ENV['FORCE_TESTS'] || Geos::Handle.method_defined?(:notice_handler=)
128
+
129
+ notice_handler_tester do |results|
130
+ Geos.current_handle.notice_handler = method(:notice_handler_method).curry(2)[results]
131
+ end
132
+ end
133
+
134
+ def test_setting_notice_handler_with_proc
135
+ skip unless ENV['FORCE_TESTS'] || Geos::Handle.method_defined?(:notice_handler=)
136
+
137
+ notice_handler_tester do |results|
138
+ Geos.current_handle.notice_handler = proc do |*args|
139
+ results << "NOTICE: #{args[0] % args[1]}"
140
+ end
141
+ end
142
+ end
143
+
144
+ def test_setting_notice_handler_with_block
145
+ skip unless ENV['FORCE_TESTS'] || Geos::Handle.method_defined?(:notice_handler=)
146
+
147
+ notice_handler_tester do |results|
148
+ Geos.current_handle.notice_handler do |*args|
149
+ results << "NOTICE: #{args[0] % args[1]}"
150
+ end
151
+ end
152
+ end
153
+
154
+ def error_handler_tester
155
+ results = ''.dup
156
+ geom = nil
157
+
158
+ yield results
159
+
160
+ assert_raises(RuntimeError) do
161
+ geom = read('POLYGON((0 0, 0 5, 5 0, 5 5))')
162
+ end
163
+
164
+ assert_nil(geom)
165
+ assert_match(/^ERROR: .+$/, results)
166
+ ensure
167
+ Geos.current_handle.reset_error_handler
168
+ end
169
+
170
+ def error_handler_method(results, *args)
171
+ message = "ERROR: #{args[0] % args[1]}".dup
172
+ results << message
173
+ raise message
174
+ end
175
+
176
+ def test_setting_error_handler_with_method
177
+ skip unless ENV['FORCE_TESTS'] || Geos::Handle.method_defined?(:error_handler=)
178
+
179
+ error_handler_tester do |results|
180
+ Geos.current_handle.error_handler = method(:error_handler_method).curry(2)[results]
181
+ end
182
+ end
183
+
184
+ def test_setting_error_handler_with_proc
185
+ skip unless ENV['FORCE_TESTS'] || Geos::Handle.method_defined?(:error_handler=)
186
+
187
+ error_handler_tester do |results|
188
+ Geos.current_handle.error_handler = proc do |*args|
189
+ message = "ERROR: #{args[0] % args[1]}".dup
190
+ results << message
191
+ raise message
192
+ end
193
+ end
194
+ end
195
+
196
+ def test_setting_error_handler_with_block
197
+ skip unless ENV['FORCE_TESTS'] || Geos::Handle.method_defined?(:error_handler=)
198
+
199
+ error_handler_tester do |results|
200
+ Geos.current_handle.error_handler do |*args|
201
+ message = "ERROR: #{args[0] % args[1]}".dup
202
+ results << message
203
+ raise message
204
+ end
205
+ end
206
+ end
108
207
  end