1# Copyright 2013 Luciad (http://www.luciad.com)
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#     http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15require_relative 'gpkg'
16
17if ENV['GPKG_HAVE_GEOM_FUNC']
18  describe 'ST_Area' do
19    it 'should return NULL when passed NULL' do
20      expect('SELECT ST_Area(NULL)').to have_result nil
21    end
22
23    it 'should raise an error on invalid input' do
24      expect("SELECT ST_Area(x'FFFFFFFFFF')").to raise_sql_error
25    end
26
27    it 'should return zero for 0 and 1 dimensional geometry' do
28      expect("SELECT ST_Area(GeomFromText('Point(1 0)'))").to have_result 0
29      expect("SELECT ST_Area(GeomFromText('LineString(1 1, 2 2)'))").to have_result 0
30    end
31
32    it 'should return a valid value for 2 dimensional geometry' do
33      expect("SELECT ST_Area(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result 2.0
34    end
35  end
36
37  describe 'ST_Length' do
38    it 'should return NULL when passed NULL' do
39      expect('SELECT ST_Length(NULL)').to have_result nil
40    end
41
42    it 'should raise an error on invalid input' do
43      expect("SELECT ST_Length(x'FFFFFFFFFF')").to raise_sql_error
44    end
45
46    it 'should return zero for 0 dimensional geometry' do
47      expect("SELECT ST_Area(GeomFromText('Point(1 0)'))").to have_result 0
48    end
49
50    it 'should return a valid value for 1 and 2 dimensional geometry' do
51      expect("SELECT ST_Length(GeomFromText('LineString(1 1, 2 2)'))").to have_result 1.4142135623730951
52      expect("SELECT ST_Length(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result 6.47213595499958
53    end
54  end
55
56  describe 'ST_IsClosed' do
57    it 'should return NULL when passed NULL' do
58      expect('SELECT ST_IsClosed(NULL)').to have_result nil
59    end
60
61    it 'should raise an error on invalid input' do
62      expect("SELECT ST_IsClosed(x'FFFFFFFFFF')").to raise_sql_error
63      expect("SELECT ST_IsClosed(GeomFromText('Point(1 0)'))").to raise_sql_error
64      expect("SELECT ST_IsClosed(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
65
66    end
67
68    it 'should return a valid value' do
69      expect("SELECT ST_IsClosed(GeomFromText('LineString(1 1, 2 2)'))").to have_result 0
70    end
71  end
72
73  describe 'ST_IsSimple' do
74    it 'should return NULL when passed NULL' do
75      expect('SELECT ST_IsSimple(NULL)').to have_result nil
76    end
77
78    it 'should raise an error on invalid input' do
79      expect("SELECT ST_IsSimple(x'FFFFFFFFFF')").to raise_sql_error
80    end
81
82    it 'should return a valid value' do
83      expect("SELECT ST_IsSimple(GeomFromText('Point(1 0)'))").to have_result 1
84      expect("SELECT ST_IsSimple(GeomFromText('LineString(1 1, 2 2)'))").to have_result 1
85      expect("SELECT ST_IsSimple(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result 1
86    end
87  end
88
89  describe 'ST_IsRing' do
90    it 'should return NULL when passed NULL' do
91      expect('SELECT ST_IsRing(NULL)').to have_result nil
92    end
93
94    it 'should raise an error on invalid input' do
95      expect("SELECT ST_IsRing(x'FFFFFFFFFF')").to raise_sql_error
96    end
97
98    it 'should return a valid value' do
99      expect("SELECT ST_IsRing(GeomFromText('Point(1 0)'))").to have_result 0
100      expect("SELECT ST_IsRing(GeomFromText('LineString(1 1, 2 2)'))").to have_result 0
101      expect("SELECT ST_IsRing(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result 0
102    end
103  end
104
105  describe 'ST_IsValid' do
106    it 'should return NULL when passed NULL' do
107      expect('SELECT ST_IsValid(NULL)').to have_result nil
108    end
109
110    it 'should raise an error on invalid input' do
111      expect("SELECT ST_IsValid(x'FFFFFFFFFF')").to raise_sql_error
112    end
113
114    it 'should return a valid value' do
115      expect("SELECT ST_IsValid(GeomFromText('Point(1 0)'))").to have_result 1
116      expect("SELECT ST_IsValid(GeomFromText('Point EMPTY'))").to have_result 1
117      expect("SELECT ST_IsValid(GeomFromText('LineString(1 1, 2 2)'))").to have_result 1
118      expect("SELECT ST_IsValid(GeomFromText('LineString EMPTY'))").to have_result 1
119      expect("SELECT ST_IsValid(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result 1
120      expect("SELECT ST_IsValid(GeomFromText('Polygon empty'))").to have_result 1
121      expect("SELECT ST_IsValid(GeomFromText('MultiPoint((1 0),(1 2),EMPTY)'))").to have_result 1
122      expect("SELECT ST_IsValid(GeomFromText('MultiPoint empty'))").to have_result 1
123      expect("SELECT ST_IsValid(GeomFromText('MultiLineString((1 1, 2 2),(2 2, 1 1),EMPTY)'))").to have_result 1
124      expect("SELECT ST_IsValid(GeomFromText('MultiLineString EMPTY'))").to have_result 1
125      expect("SELECT ST_IsValid(GeomFromText('MultiPolygon(((0 0, 2 0, 1 2, 0 0)), EMPTY)'))").to have_result 1
126      expect("SELECT ST_IsValid(GeomFromText('MultiPolygon empty'))").to have_result 1
127      expect("SELECT ST_IsValid(GeomFromText('GeometryCollection empty'))").to have_result 1
128      expect("SELECT ST_IsValid(GeomFromText('GeometryCollection (point(1 2), linestring(1 3, 4 5, 7 2))'))").to have_result 1
129    end
130  end
131
132  describe 'ST_Relate' do
133    it 'should return NULL when either argument is NULL' do
134      expect("SELECT ST_Relate(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), '')").to have_result nil
135      expect("SELECT ST_Relate(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL, '')").to have_result nil
136      expect("SELECT ST_Relate(NULL, NULL, '')").to have_result nil
137      expect("SELECT ST_Relate(GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'), GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'), NULL)").to have_result nil
138    end
139
140    it 'should raise an error on invalid input' do
141      expect("SELECT ST_Relate(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), '')").to raise_sql_error
142      expect("SELECT ST_Relate(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF', '')").to raise_sql_error
143      expect("SELECT ST_Relate(x'FFFFFFFFFF', x'FFFFFFFFFF', '')").to raise_sql_error
144      expect("SELECT ST_Relate(GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'), GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'), '')").to raise_sql_error
145      expect("SELECT ST_Relate(GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'), GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'), 'Flub')").to raise_sql_error
146    end
147
148    it 'should return a valid value' do
149      expect("SELECT ST_Relate(GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'), GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'), 'T*F**F***')").to have_result 1
150      expect("SELECT ST_Relate(GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'), GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'), 'T*F**F***')").to have_result 0
151    end
152  end
153
154  describe 'ST_Disjoint' do
155    it 'should return NULL when either argument is NULL' do
156      expect("SELECT ST_Disjoint(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
157      expect("SELECT ST_Disjoint(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
158      expect('SELECT ST_Disjoint(NULL, NULL)').to have_result nil
159    end
160
161    it 'should raise an error on invalid input' do
162      expect("SELECT ST_Disjoint(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
163      expect("SELECT ST_Disjoint(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
164      expect("SELECT ST_Disjoint(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
165    end
166
167    it 'should return a valid value' do
168      expect("SELECT ST_Disjoint(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result 0
169      expect("SELECT ST_Disjoint(GeomFromText('Polygon((0 10, 2 10, 1 12, 0 10))'), GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result 1
170    end
171  end
172
173  describe 'ST_Intersects' do
174    it 'should return NULL when either argument is NULL' do
175      expect("SELECT ST_Intersects(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
176      expect("SELECT ST_Intersects(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
177      expect('SELECT ST_Intersects(NULL, NULL)').to have_result nil
178    end
179
180    it 'should raise an error on invalid input' do
181      expect("SELECT ST_Intersects(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
182      expect("SELECT ST_Intersects(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
183      expect("SELECT ST_Intersects(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
184    end
185
186    it 'should return a valid value' do
187      expect("SELECT ST_Intersects(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result 1
188      expect("SELECT ST_Intersects(GeomFromText('Polygon((0 10, 2 10, 1 12, 0 10))'), GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result 0
189    end
190  end
191
192  describe 'ST_Touches' do
193    it 'should return NULL when either argument is NULL' do
194      expect("SELECT ST_Touches(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
195      expect("SELECT ST_Touches(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
196      expect('SELECT ST_Touches(NULL, NULL)').to have_result nil
197    end
198
199    it 'should raise an error on invalid input' do
200      expect("SELECT ST_Touches(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
201      expect("SELECT ST_Touches(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
202      expect("SELECT ST_Touches(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
203    end
204
205    it 'should return a valid value' do
206      expect("SELECT ST_Touches(GeomFromText('Polygon((0 0, 2 0, 0 2, 0 0))'), GeomFromText('Polygon((0 2, 2 0, 2 2, 0 2))'))").to have_result 1
207      expect("SELECT ST_Touches(GeomFromText('Polygon((0 10, 2 10, 1 12, 0 10))'), GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result 0
208    end
209  end
210
211  describe 'ST_Crosses' do
212    it 'should return NULL when either argument is NULL' do
213      expect("SELECT ST_Crosses(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
214      expect("SELECT ST_Crosses(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
215      expect('SELECT ST_Crosses(NULL, NULL)').to have_result nil
216    end
217
218    it 'should raise an error on invalid input' do
219      expect("SELECT ST_Crosses(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
220      expect("SELECT ST_Crosses(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
221      expect("SELECT ST_Crosses(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
222    end
223
224    it 'should return a valid value' do
225      expect("SELECT ST_Crosses(GeomFromText('LineString(0 0, 2 2)'), GeomFromText('LineString(0 2, 2 0)'))").to have_result 1
226      expect("SELECT ST_Crosses(GeomFromText('LineString(0 0, 2 2)'), GeomFromText('LineString(10 2, 12 0)'))").to have_result 0
227    end
228  end
229
230  describe 'ST_Within' do
231    it 'should return NULL when either argument is NULL' do
232      expect("SELECT ST_Within(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
233      expect("SELECT ST_Within(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
234      expect('SELECT ST_Within(NULL, NULL)').to have_result nil
235    end
236
237    it 'should raise an error on invalid input' do
238      expect("SELECT ST_Within(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
239      expect("SELECT ST_Within(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
240      expect("SELECT ST_Within(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
241    end
242
243    it 'should return a valid value' do
244      expect("SELECT ST_Within(GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'), GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'))").to have_result 1
245      expect("SELECT ST_Within(GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'), GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'))").to have_result 0
246    end
247  end
248
249  describe 'ST_Contains' do
250    it 'should return NULL when either argument is NULL' do
251      expect("SELECT ST_Contains(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
252      expect("SELECT ST_Contains(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
253      expect('SELECT ST_Contains(NULL, NULL)').to have_result nil
254    end
255
256    it 'should raise an error on invalid input' do
257      expect("SELECT ST_Contains(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
258      expect("SELECT ST_Contains(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
259      expect("SELECT ST_Contains(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
260    end
261
262    it 'should return a valid value' do
263      expect("SELECT ST_Contains(GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'), GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'))").to have_result 0
264      expect("SELECT ST_Contains(GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'), GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'))").to have_result 1
265    end
266  end
267
268  describe 'ST_Overlaps' do
269    it 'should return NULL when either argument is NULL' do
270      expect("SELECT ST_Overlaps(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
271      expect("SELECT ST_Overlaps(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
272      expect('SELECT ST_Overlaps(NULL, NULL)').to have_result nil
273    end
274
275    it 'should raise an error on invalid input' do
276      expect("SELECT ST_Overlaps(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
277      expect("SELECT ST_Overlaps(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
278      expect("SELECT ST_Overlaps(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
279    end
280
281    it 'should return a valid value' do
282      expect("SELECT ST_Overlaps(GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'), GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'))").to have_result 0
283      expect("SELECT ST_Overlaps(GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'),GeomFromText('Polygon((1 0, 4 0, 4 3, 1 3, 1 0))'))").to have_result 1
284    end
285  end
286
287  describe 'ST_Equals' do
288    it 'should return NULL when either argument is NULL' do
289      expect("SELECT ST_Equals(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
290      expect("SELECT ST_Equals(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
291      expect('SELECT ST_Equals(NULL, NULL)').to have_result nil
292    end
293
294    it 'should raise an error on invalid input' do
295      expect("SELECT ST_Equals(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
296      expect("SELECT ST_Equals(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
297      expect("SELECT ST_Equals(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
298    end
299
300    it 'should return a valid value' do
301      expect("SELECT ST_Equals(GeomFromText('Polygon((0 0, 2 0, 0 2, 0 0))'), GeomFromText('Polygon((0 0, 2 0, 0 2, 0 0))'))").to have_result 1
302      expect("SELECT ST_Equals(GeomFromText('Polygon((0 10, 2 10, 1 12, 0 10))'), GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result 0
303    end
304  end
305
306  describe 'ST_Covers' do
307    if geos_version[0] > 3 || geos_version[1] >= 3
308      it 'should return NULL when either argument is NULL' do
309        expect("SELECT ST_Covers(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
310        expect("SELECT ST_Covers(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
311        expect('SELECT ST_Covers(NULL, NULL)').to have_result nil
312      end
313
314      it 'should raise an error on invalid input' do
315        expect("SELECT ST_Covers(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
316        expect("SELECT ST_Covers(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
317        expect("SELECT ST_Covers(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
318      end
319
320      it 'should return a valid value' do
321        expect("SELECT ST_Covers(GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'), GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'))").to have_result 0
322        expect("SELECT ST_Covers(GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'),GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'))").to have_result 1
323      end
324    end
325  end
326
327  describe 'ST_CoveredBy' do
328    if geos_version[0] > 3 || geos_version[1] >= 3
329      it 'should return NULL when either argument is NULL' do
330        expect("SELECT ST_CoveredBy(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
331        expect("SELECT ST_CoveredBy(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
332        expect('SELECT ST_CoveredBy(NULL, NULL)').to have_result nil
333      end
334
335      it 'should raise an error on invalid input' do
336        expect("SELECT ST_CoveredBy(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
337        expect("SELECT ST_CoveredBy(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
338        expect("SELECT ST_CoveredBy(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
339      end
340
341      it 'should return a valid value' do
342        expect("SELECT ST_CoveredBy(GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'), GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'))").to have_result 1
343        expect("SELECT ST_CoveredBy(GeomFromText('Polygon((0 0, 3 0, 3 3, 0 3, 0 0))'),GeomFromText('Polygon((1 1, 2 1, 2 2, 1 2, 1 1))'))").to have_result 0
344      end
345    end
346  end
347
348  describe 'ST_Distance' do
349    it 'should return NULL when either argument is NULL' do
350      expect("SELECT ST_Distance(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
351      expect("SELECT ST_Distance(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
352      expect('SELECT ST_Distance(NULL, NULL)').to have_result nil
353    end
354
355    it 'should raise an error on invalid input' do
356      expect("SELECT ST_Distance(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
357      expect("SELECT ST_Distance(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
358      expect("SELECT ST_Distance(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
359    end
360
361    it 'should return a valid value' do
362      expect("SELECT ST_Distance(GeomFromText('Point(0 0)'), GeomFromText('Point(0 2)'))").to have_result 2.0
363    end
364  end
365
366  describe 'ST_HausdorffDistance' do
367    it 'should return NULL when either argument is NULL' do
368      expect("SELECT ST_HausdorffDistance(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
369      expect("SELECT ST_HausdorffDistance(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
370      expect('SELECT ST_HausdorffDistance(NULL, NULL)').to have_result nil
371    end
372
373    it 'should raise an error on invalid input' do
374      expect("SELECT ST_HausdorffDistance(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
375      expect("SELECT ST_HausdorffDistance(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
376      expect("SELECT ST_HausdorffDistance(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
377    end
378
379    it 'should return a valid value' do
380      expect("SELECT ST_HausdorffDistance(GeomFromText('LineString (0 0, 100 0, 10 100, 10 100)'), GeomFromText('LineString (0 100, 0 10, 80 10)'))").to have_result 22.360679774997898
381    end
382  end
383
384  describe 'ST_Boundary' do
385    it 'should return NULL when either argument is NULL' do
386      expect('SELECT ST_Boundary(NULL)').to have_result nil
387    end
388
389    it 'should raise an error on invalid input' do
390      expect("SELECT ST_Boundary(x'FFFFFFFFFF')").to raise_sql_error
391    end
392
393    it 'should return a valid value' do
394      expect("SELECT AsText(ST_Boundary(GeomFromText('Point (0 100)')))").to have_result 'GeometryCollection EMPTY'
395      expect("SELECT AsText(ST_Boundary(GeomFromText('LineString (0 100, 0 10, 80 10)')))").to have_result 'MultiPoint ((0 100), (80 10))'
396      expect("SELECT AsText(ST_Boundary(GeomFromText('Polygon((0 0, 2 0, 2 2, 1 1, 0 2, 0 0))')))").to have_result 'LineString (0 0, 2 0, 2 2, 1 1, 0 2, 0 0)'
397    end
398  end
399
400  describe 'ST_ConvexHull' do
401    it 'should return NULL when either argument is NULL' do
402      expect('SELECT ST_ConvexHull(NULL)').to have_result nil
403    end
404
405    it 'should raise an error on invalid input' do
406      expect("SELECT ST_ConvexHull(x'FFFFFFFFFF')").to raise_sql_error
407    end
408
409    it 'should return a valid value' do
410      expect("SELECT AsText(ST_ConvexHull(GeomFromText('Point (0 100)')))").to have_result 'Point (0 100)'
411      expect("SELECT AsText(ST_ConvexHull(GeomFromText('LineString (0 100, 0 10, 80 10)')))").to have_result 'Polygon ((0 10, 0 100, 80 10, 0 10))'
412      expect("SELECT AsText(ST_ConvexHull(GeomFromText('Polygon((0 0, 2 0, 2 2, 1 1, 0 2, 0 0))')))").to have_result 'Polygon ((0 0, 0 2, 2 2, 2 0, 0 0))'
413    end
414  end
415
416  describe 'ST_Envelope' do
417    it 'should return NULL when either argument is NULL' do
418      expect('SELECT ST_Envelope(NULL)').to have_result nil
419    end
420
421    it 'should raise an error on invalid input' do
422      expect("SELECT ST_Envelope(x'FFFFFFFFFF')").to raise_sql_error
423    end
424
425    it 'should return a valid value' do
426      expect("SELECT AsText(ST_Envelope(GeomFromText('Point (0 100)')))").to have_result 'Point (0 100)'
427      expect("SELECT AsText(ST_Envelope(GeomFromText('LineString (0 100, 0 10, 80 10)')))").to have_result 'Polygon ((0 10, 80 10, 80 100, 0 100, 0 10))'
428      expect("SELECT AsText(ST_Envelope(GeomFromText('Polygon((0 0, 2 0, 2 2, 1 3, 0 2, 0 0))')))").to have_result 'Polygon ((0 0, 2 0, 2 3, 0 3, 0 0))'
429    end
430  end
431
432  describe 'ST_Distance' do
433    it 'should return NULL when either argument is NULL' do
434      expect("SELECT ST_Difference(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
435      expect("SELECT ST_Difference(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
436      expect('SELECT ST_Difference(NULL, NULL)').to have_result nil
437    end
438
439    it 'should raise an error on invalid input' do
440      expect("SELECT ST_Difference(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
441      expect("SELECT ST_Difference(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
442      expect("SELECT ST_Difference(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
443    end
444
445    it 'should return a valid value' do
446      expect("SELECT AsText(ST_Difference(GeomFromText('Polygon((0 0, 2 0, 2 2, 0 2, 0 0))'), GeomFromText('Polygon((1 0, 3 0, 3 2, 1 2, 1 0))')))").to have_result 'Polygon ((1 0, 0 0, 0 2, 1 2, 1 0))'
447    end
448  end
449
450  describe 'ST_SymDifference' do
451    it 'should return NULL when either argument is NULL' do
452      expect("SELECT ST_SymDifference(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
453      expect("SELECT ST_SymDifference(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
454      expect('SELECT ST_SymDifference(NULL, NULL)').to have_result nil
455    end
456
457    it 'should raise an error on invalid input' do
458      expect("SELECT ST_SymDifference(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
459      expect("SELECT ST_SymDifference(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
460      expect("SELECT ST_SymDifference(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
461    end
462
463    it 'should return a valid value' do
464      expect("SELECT AsText(ST_SymDifference(GeomFromText('Polygon((0 0, 2 0, 2 2, 0 2, 0 0))'), GeomFromText('Polygon((1 0, 3 0, 3 2, 1 2, 1 0))')))").to have_result 'MultiPolygon (((1 0, 0 0, 0 2, 1 2, 1 0)), ((2 0, 2 2, 3 2, 3 0, 2 0)))'
465    end
466  end
467
468  describe 'ST_Intersection' do
469    it 'should return NULL when either argument is NULL' do
470      expect("SELECT ST_Intersection(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
471      expect("SELECT ST_Intersection(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
472      expect('SELECT ST_Intersection(NULL, NULL)').to have_result nil
473    end
474
475    it 'should raise an error on invalid input' do
476      expect("SELECT ST_Intersection(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
477      expect("SELECT ST_Intersection(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
478      expect("SELECT ST_Intersection(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
479    end
480
481    it 'should return a valid value' do
482      expect("SELECT AsText(ST_Intersection(GeomFromText('Polygon((0 0, 2 0, 2 2, 0 2, 0 0))'), GeomFromText('Polygon((1 0, 3 0, 3 2, 1 2, 1 0))')))").to have_result 'Polygon ((2 0, 1 0, 1 2, 2 2, 2 0))'
483    end
484  end
485
486  describe 'ST_Union' do
487    it 'should return NULL when either argument is NULL' do
488      expect("SELECT ST_Union(NULL, GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to have_result nil
489      expect("SELECT ST_Union(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), NULL)").to have_result nil
490      expect('SELECT ST_Union(NULL, NULL)').to have_result nil
491    end
492
493    it 'should raise an error on invalid input' do
494      expect("SELECT ST_Union(x'FFFFFFFFFF', GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'))").to raise_sql_error
495      expect("SELECT ST_Union(GeomFromText('Polygon((0 0, 2 0, 1 2, 0 0))'), x'FFFFFFFFFF')").to raise_sql_error
496      expect("SELECT ST_Union(x'FFFFFFFFFF', x'FFFFFFFFFF')").to raise_sql_error
497    end
498
499    it 'should return a valid value' do
500      expect("SELECT AsText(ST_Union(GeomFromText('Point(0 0)'), GeomFromText('Point empty')))").to have_result 'Point (0 0)'
501      expect("SELECT AsText(ST_Union(GeomFromText('Point(0 0)'), GeomFromText('Point (1 1)')))").to have_result 'MultiPoint ((0 0), (1 1))'
502      expect("SELECT AsText(ST_Union(GeomFromText('Point(0 0)'), GeomFromText('LineString (1 1, 2 2)')))").to have_result 'GeometryCollection (Point (0 0), LineString (1 1, 2 2))'
503      expect("SELECT AsText(ST_Union(GeomFromText('Point(0 0)'), GeomFromText('LineString (1 1, 2 2)')))").to have_result 'GeometryCollection (Point (0 0), LineString (1 1, 2 2))'
504      expect("SELECT AsText(ST_Union(GeomFromText('LineString(4 5, 5 5)'), GeomFromText('LineString (1 3, 1 4)')))").to have_result 'MultiLineString ((4 5, 5 5), (1 3, 1 4))'
505      expect("SELECT AsText(ST_Union(GeomFromText('LineString(4 5, 5 5)'), GeomFromText('LineString(4 5, 5 5)')))").to have_result 'LineString (4 5, 5 5)'
506      expect("SELECT AsText(ST_Union(GeomFromText('Point(0 0)'), GeomFromText('Polygon ((1 3, 1 4, 2 3, 1 3))')))").to have_result 'GeometryCollection (Point (0 0), Polygon ((1 3, 1 4, 2 3, 1 3)))'
507      expect("SELECT AsText(ST_Union(GeomFromText('Polygon ((1 3, 1 4, 2 3, 1 3))'), GeomFromText('Polygon ((1 3, 1 4, 2 3, 1 3))')))").to have_result 'Polygon ((1 3, 1 4, 2 3, 1 3))'
508      expect("SELECT AsText(ST_Union(GeomFromText('Polygon ((10 3, 10 4, 12 3, 10 3))'), GeomFromText('Polygon ((1 3, 1 4, 2 3, 1 3))')))").to have_result 'MultiPolygon (((10 3, 10 4, 12 3, 10 3)), ((1 3, 1 4, 2 3, 1 3)))'
509      expect("SELECT AsText(ST_Union(GeomFromText('Polygon((0 0, 2 0, 2 2, 0 2, 0 0))'), GeomFromText('Polygon((1 0, 3 0, 3 2, 1 2, 1 0))')))").to have_result 'Polygon ((1 0, 0 0, 0 2, 1 2, 2 2, 3 2, 3 0, 2 0, 1 0))'
510    end
511  end
512end