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.
- checksums.yaml +4 -4
- data/.travis.yml +8 -5
- data/MIT-LICENSE +1 -1
- data/lib/ffi-geos.rb +90 -8
- data/lib/ffi-geos/buffer_params.rb +8 -7
- data/lib/ffi-geos/coordinate_sequence.rb +14 -13
- data/lib/ffi-geos/geometry.rb +120 -71
- data/lib/ffi-geos/geometry_collection.rb +2 -1
- data/lib/ffi-geos/interrupt.rb +2 -0
- data/lib/ffi-geos/line_string.rb +5 -4
- data/lib/ffi-geos/linear_ring.rb +1 -0
- data/lib/ffi-geos/multi_line_string.rb +2 -1
- data/lib/ffi-geos/multi_point.rb +1 -0
- data/lib/ffi-geos/multi_polygon.rb +1 -0
- data/lib/ffi-geos/point.rb +4 -3
- data/lib/ffi-geos/polygon.rb +4 -3
- data/lib/ffi-geos/prepared_geometry.rb +13 -12
- data/lib/ffi-geos/strtree.rb +61 -13
- data/lib/ffi-geos/tools.rb +2 -1
- data/lib/ffi-geos/utils.rb +12 -11
- data/lib/ffi-geos/version.rb +2 -1
- data/lib/ffi-geos/wkb_reader.rb +5 -4
- data/lib/ffi-geos/wkb_writer.rb +11 -10
- data/lib/ffi-geos/wkt_reader.rb +4 -3
- data/lib/ffi-geos/wkt_writer.rb +9 -8
- data/test/coordinate_sequence_tests.rb +1 -0
- data/test/geometry_collection_tests.rb +1 -0
- data/test/geometry_tests.rb +88 -0
- data/test/interrupt_tests.rb +1 -0
- data/test/line_string_tests.rb +1 -0
- data/test/linear_ring_tests.rb +1 -0
- data/test/misc_tests.rb +99 -0
- data/test/multi_line_string_tests.rb +1 -0
- data/test/point_tests.rb +1 -0
- data/test/polygon_tests.rb +1 -0
- data/test/prepared_geometry_tests.rb +1 -0
- data/test/strtree_tests.rb +143 -2
- data/test/test_helper.rb +8 -2
- data/test/tools_tests.rb +1 -0
- data/test/utils_tests.rb +1 -0
- data/test/wkb_reader_tests.rb +1 -0
- data/test/wkb_writer_tests.rb +3 -4
- data/test/wkt_reader_tests.rb +1 -0
- data/test/wkt_writer_tests.rb +1 -0
- metadata +9 -9
data/lib/ffi-geos/version.rb
CHANGED
data/lib/ffi-geos/wkb_reader.rb
CHANGED
@@ -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.
|
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.
|
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.
|
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.
|
43
|
+
FFIGeos.GEOSWKBReader_destroy_r(Geos.current_handle_pointer, ptr)
|
43
44
|
end
|
44
45
|
end
|
45
46
|
end
|
data/lib/ffi-geos/wkb_writer.rb
CHANGED
@@ -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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
87
|
+
FFIGeos.GEOSWKBWriter_setByteOrder_r(Geos.current_handle_pointer, self.ptr, val)
|
87
88
|
end
|
88
89
|
|
89
90
|
private
|
data/lib/ffi-geos/wkt_reader.rb
CHANGED
@@ -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.
|
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.
|
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.
|
35
|
+
FFIGeos.GEOSWKTReader_destroy_r(Geos.current_handle_pointer, ptr)
|
35
36
|
end
|
36
37
|
end
|
37
38
|
end
|
data/lib/ffi-geos/wkt_writer.rb
CHANGED
@@ -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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
106
|
+
FFIGeos.GEOSWKTWriter_getOutputDimension_r(Geos.current_handle_pointer, self.ptr)
|
106
107
|
end
|
107
108
|
end
|
108
109
|
end
|
data/test/geometry_tests.rb
CHANGED
@@ -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
|
data/test/interrupt_tests.rb
CHANGED
data/test/line_string_tests.rb
CHANGED
data/test/linear_ring_tests.rb
CHANGED
data/test/misc_tests.rb
CHANGED
@@ -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
|