1CREATE FUNCTION test(geom geometry, wrap float8, amount float8, exp geometry)
2RETURNS text AS $$
3DECLARE
4  obt geometry;
5BEGIN
6  obt = ST_Normalize(ST_WrapX(geom, wrap, amount));
7  IF ST_OrderingEquals(obt, exp) THEN
8    RETURN 'OK';
9  ELSE
10    RETURN 'KO:' || ST_AsEWKT(obt) || ' != ' || ST_AsEWKT(exp);
11  END IF;
12END
13$$ LANGUAGE plpgsql;
14
15SELECT 'P1', test(
16  'POINT(0 0)', 2, 10,
17  'POINT(10 0)');
18
19SELECT 'P2', test(
20  'POINT(0 0)', 2, -10,
21  'POINT(0 0)');
22
23SELECT 'P3', test(
24  'POINT(0 0)', -2, -10,
25  'POINT(-10 0)');
26
27SELECT 'L1', test(
28  'LINESTRING(0 0,10 0)', 2, 10,
29  --'LINESTRING(2 0,12 0)');
30  'MULTILINESTRING((10 0,12 0),(2 0,10 0))');
31
32SELECT 'L2', test(
33  'LINESTRING(0 0,10 0)', 8, -10,
34  'MULTILINESTRING((0 0,8 0),(-2 0,0 0))');
35
36SELECT 'L3', test(
37  'LINESTRING(0 0,10 0)', 0, 10,
38  'LINESTRING(0 0,10 0)');
39
40SELECT 'L4', test(
41  'LINESTRING(0 0,10 0)', 10, -10,
42  'LINESTRING(0 0,10 0)');
43
44SELECT 'ML1', test(
45  'MULTILINESTRING((-10 0,0 0),(0 0,10 0))', 0, 20,
46  'MULTILINESTRING((10 0,20 0),(0 0,10 0))');
47
48SELECT 'ML2', test(
49  'MULTILINESTRING((-10 0,0 0),(0 0,10 0))', 0, -20,
50  'MULTILINESTRING((-10 0,0 0),(-20 0,-10 0))');
51
52SELECT 'ML3', test(
53  'MULTILINESTRING((10 0,5 0),(-10 0,0 0),(0 0,5 0))', 0, -20,
54  'MULTILINESTRING((-10 0,0 0),(-15 0,-10 0),(-20 0,-15 0))');
55
56SELECT 'A1', test(
57  'POLYGON((0 0,10 0,10 10,0 10,0 0),
58           (1 2,3 2,3 4,1 4,1 2),
59           (4 2,6 2,6 4,4 4,4 2),
60           (7 2,9 2,9 4,7 4,7 2))', 5, 10,
61  'POLYGON((5 0,5 2,6 2,6 4,5 4,5 10,10 10,15 10,15 4,14 4,14 2,15 2,15 0,10 0,5 0),
62           (11 2,13 2,13 4,11 4,11 2),
63           (7 2,9 2,9 4,7 4,7 2))');
64
65SELECT 'A2', test(
66  'POLYGON((0 0,10 0,10 10,0 10,0 0),
67           (1 2,3 2,3 4,1 4,1 2),
68           (4 2,6 2,6 4,4 4,4 2),
69           (7 2,9 2,9 4,7 4,7 2))', 5, -10,
70  'POLYGON((-5 0,-5 2,-4 2,-4 4,-5 4,-5 10,0 10,5 10,5 4,4 4,4 2,5 2,5 0,0 0,-5 0),
71           (1 2,3 2,3 4,1 4,1 2),
72           (-3 2,-1 2,-1 4,-3 4,-3 2))');
73
74SELECT 'C1', test(
75  'GEOMETRYCOLLECTION(
76    POLYGON((0 0,10 0,10 10,0 10,0 0),
77            (1 2,3 2,3 4,1 4,1 2),
78            (4 2,6 2,6 4,4 4,4 2),
79            (7 2,9 2,9 4,7 4,7 2)),
80    POINT(2 20),
81    POINT(7 -20),
82    LINESTRING(0 40,10 40)
83  )',
84  5, -10,
85  'GEOMETRYCOLLECTION(
86    POLYGON((-5 0,-5 2,-4 2,-4 4,-5 4,-5 10,0 10,5 10,5 4,4 4,4 2,5 2,5 0,0 0,-5 0),
87            (1 2,3 2,3 4,1 4,1 2),
88            (-3 2,-1 2,-1 4,-3 4,-3 2)),
89    MULTILINESTRING((0 40,5 40),(-5 40,0 40)),
90    POINT(2 20),
91    POINT(-3 -20)
92  )');
93
94DROP FUNCTION test(geometry, float8, float8, geometry);
95