File: flow_pgtap_tests.sql

package info (click to toggle)
pgrouting 4.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 17,676 kB
  • sloc: cpp: 21,494; sql: 14,113; ansic: 9,896; perl: 1,144; sh: 848; javascript: 314; xml: 182; makefile: 29
file content (233 lines) | stat: -rw-r--r-- 6,897 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
CREATE OR REPLACE FUNCTION flow_no_crash(fn_name TEXT)
RETURNS SETOF TEXT AS
$BODY$
DECLARE
params TEXT[];
subs TEXT[];
BEGIN

  IF NOT min_version('3.2.0') AND fn_name IN ('pgr_maxFlowMinCost', 'pgr_maxFlowMinCost_Cost') THEN
    RETURN QUERY
    SELECT skip(1, 'Can not test before 3.2.0 on ' || fn_name);
    RETURN;
  END IF;

  IF fn_name = 'pgr_edgeDisjointPaths' THEN
    PREPARE edges AS
    SELECT id, source, target, cost, reverse_cost  FROM edges;
  ELSE
    PREPARE edges AS
    SELECT id,
    source,
    target,
    capacity,
    reverse_capacity,
    cost,
    reverse_cost
    FROM edges
    ORDER BY id;
  END IF;



  PREPARE null_ret AS
  SELECT id FROM vertices  WHERE id IN (-1);

  PREPARE null_ret_arr AS
  SELECT array_agg(id) FROM vertices  WHERE id IN (-1);


  RETURN QUERY
  SELECT isnt_empty('edges', 'Should be not empty to tests be meaningful');
  RETURN QUERY
  SELECT is_empty('null_ret', 'Should be empty to tests be meaningful');
  RETURN QUERY
  SELECT set_eq('null_ret_arr', 'SELECT NULL::BIGINT[]', 'Should be empty to tests be meaningful');

  -- one to one
  params = ARRAY['$$edges$$',
  '5::BIGINT',
  '6::BIGINT'
  ]::TEXT[];
  subs = ARRAY[
  'NULL',
  '(SELECT id FROM vertices  WHERE id IN (-1))',
  '(SELECT id FROM vertices  WHERE id IN (-1))'
  ]::TEXT[];

  RETURN query SELECT * FROM no_crash_test(fn_name,params, subs);

  subs = ARRAY[
  'NULL',
  'NULL::BIGINT',
  'NULL::BIGINT'
  ]::TEXT[];
  RETURN query SELECT * FROM no_crash_test(fn_name,params, subs);
  -- one to many

  params = ARRAY['$$edges$$',
  '1::BIGINT',
  'ARRAY[6,7]::BIGINT[]'
  ]::TEXT[];
  subs = ARRAY[
  'NULL',
  '(SELECT id FROM vertices  WHERE id IN (-1))',
  '(SELECT array_agg(id) FROM vertices  WHERE id IN (-1))'
  ]::TEXT[];

  RETURN query SELECT * FROM no_crash_test(fn_name,params, subs);

  subs = ARRAY[
  'NULL',
  'NULL::BIGINT',
  'NULL::BIGINT[]'
  ]::TEXT[];
  RETURN query SELECT * FROM no_crash_test(fn_name,params, subs);

  -- many to one
  params = ARRAY['$$edges$$',
  'ARRAY[6,7]::BIGINT[]',
  '5'
  ]::TEXT[];
  subs = ARRAY[
  'NULL',
  '(SELECT array_agg(id) FROM vertices  WHERE id IN (-1))',
  '(SELECT id FROM vertices  WHERE id IN (-1))'
  ]::TEXT[];

  RETURN query SELECT * FROM no_crash_test(fn_name,params, subs);

  subs = ARRAY[
  'NULL',
  'NULL::BIGINT[]',
  'NULL::BIGINT'
  ]::TEXT[];
  RETURN query SELECT * FROM no_crash_test(fn_name,params, subs);

  -- many to many
  params = ARRAY['$$edges$$',
  'ARRAY[5]::BIGINT[]',
  'ARRAY[6,7]::BIGINT[]'
  ]::TEXT[];
  subs = ARRAY[
  'NULL',
  '(SELECT array_agg(id) FROM vertices  WHERE id IN (-1))',
  '(SELECT array_agg(id) FROM vertices  WHERE id IN (-1))'
  ]::TEXT[];

  RETURN query SELECT * FROM no_crash_test(fn_name,params, subs);

  subs = ARRAY[
  'NULL',
  'NULL::BIGINT[]',
  'NULL::BIGINT[]'
  ]::TEXT[];
  RETURN query SELECT * FROM no_crash_test(fn_name,params, subs);

  IF NOT min_version('3.2.0') THEN
    RETURN QUERY
    SELECT skip(1, 'Combinations functionality is new on 3.2.0');
    RETURN;
  END IF;

  PREPARE combinations AS
  SELECT source, target  FROM combinations WHERE target NOT IN (5,6);
  PREPARE null_combinations AS
  SELECT source, target FROM combinations WHERE source IN (-1);
  RETURN QUERY
  SELECT isnt_empty('combinations', 'Should be not empty to tests be meaningful');
  RETURN QUERY
  SELECT is_empty('null_combinations', 'Should be empty to tests be meaningful');

  params = ARRAY['$$edges$$', '$$combinations$$']::TEXT[];
  subs = ARRAY[
  'NULL',
  '$$(SELECT source, target FROM combinations  WHERE source IN (-1))$$'
  ]::TEXT[];

  RETURN query SELECT * FROM no_crash_test(fn_name, params, subs);

  subs = ARRAY[
  'NULL',
  'NULL::TEXT'
  ]::TEXT[];
  RETURN query SELECT * FROM no_crash_test(fn_name, params, subs);

END
$BODY$
LANGUAGE plpgsql VOLATILE;


CREATE OR REPLACE FUNCTION flow_types_check(fn_name TEXT)
RETURNS SETOF TEXT AS
$BODY$
BEGIN
  RETURN QUERY SELECT has_function(fn_name);

  RETURN QUERY SELECT has_function(fn_name, ARRAY[ 'text', 'bigint', 'bigint' ]);
  RETURN QUERY SELECT has_function(fn_name, ARRAY[ 'text', 'anyarray', 'bigint' ]);
  RETURN QUERY SELECT has_function(fn_name, ARRAY[ 'text', 'bigint', 'anyarray' ]);
  RETURN QUERY SELECT has_function(fn_name, ARRAY[ 'text', 'anyarray', 'anyarray' ]);

  RETURN QUERY SELECT function_returns(fn_name, ARRAY[ 'text', 'bigint', 'bigint' ], 'setof record');
  RETURN QUERY SELECT function_returns(fn_name, ARRAY[ 'text', 'bigint', 'anyarray' ], 'setof record');
  RETURN QUERY SELECT function_returns(fn_name, ARRAY[ 'text', 'anyarray', 'bigint' ], 'setof record');
  RETURN QUERY SELECT function_returns(fn_name, ARRAY[ 'text', 'anyarray', 'anyarray' ], 'setof record');


  RETURN QUERY SELECT CASE
  WHEN min_version('3.2.0') THEN
    collect_tap(
      has_function(fn_name, ARRAY[ 'text', 'text']),
      function_returns(fn_name, ARRAY[ 'text', 'text'], 'setof record')
    )
  ELSE
    skip(2, 'Combinations signature added on version 3.2.0')
  END;

  RETURN QUERY SELECT CASE
  WHEN min_version('3.2.0') THEN
    collect_tap(

      function_args_eq(fn_name,
        $$VALUES
        ('{"","","","seq","edge","start_vid","end_vid","flow","residual_capacity"}'::TEXT[]),
        ('{"","","","seq","edge","start_vid","end_vid","flow","residual_capacity"}'::TEXT[]),
        ('{"","","","seq","edge","start_vid","end_vid","flow","residual_capacity"}'::TEXT[]),
        ('{"","","","seq","edge","start_vid","end_vid","flow","residual_capacity"}'::TEXT[]),
        ('{"","","seq","edge","start_vid","end_vid","flow","residual_capacity"}'::TEXT[])
        $$),

      function_types_eq(fn_name,
        $$VALUES
        ('{text,int8,int8,int4,int8,int8,int8,int8,int8}'::TEXT[]),
        ('{text,int8,anyarray,int4,int8,int8,int8,int8,int8}'::TEXT[]),
        ('{text,anyarray,int8,int4,int8,int8,int8,int8,int8}'::TEXT[]),
        ('{text,anyarray,anyarray,int4,int8,int8,int8,int8,int8}'::TEXT[]),
        ('{text,text,int4,int8,int8,int8,int8,int8}'::TEXT[])
        $$)
    )
  ELSE
    collect_tap(

      function_args_eq(fn_name,
        $$VALUES
        ('{"","","","seq","edge","start_vid","end_vid","flow","residual_capacity"}'::TEXT[]),
        ('{"","","","seq","edge","start_vid","end_vid","flow","residual_capacity"}'::TEXT[]),
        ('{"","","","seq","edge","start_vid","end_vid","flow","residual_capacity"}'::TEXT[]),
        ('{"","","","seq","edge","start_vid","end_vid","flow","residual_capacity"}'::TEXT[])
        $$),

      function_types_eq(fn_name,
        $$VALUES
        ('{text,int8,int8,int4,int8,int8,int8,int8,int8}'::TEXT[]),
        ('{text,int8,anyarray,int4,int8,int8,int8,int8,int8}'::TEXT[]),
        ('{text,anyarray,int8,int4,int8,int8,int8,int8,int8}'::TEXT[]),
        ('{text,anyarray,anyarray,int4,int8,int8,int8,int8,int8}'::TEXT[])
        $$)
    )
END;

END
$BODY$
LANGUAGE plpgsql VOLATILE;