do_assert_bucket_ok.sql
This page documents the preview version (v2.21). Preview includes features under active development and is for development and testing only. For production, use the stable version (v2024.1). To learn more, see Versioning.
Save this script as do_assert_bucket_ok.sql
.
-- Test it over the full range.
-- Pay special attention to the bucket boundaries.
do $body$
declare
one constant int := 1;
two constant int := 2;
lower_bound constant double precision := 0;
upper_bound constant double precision := 100;
no_of_values constant int := 10;
inputs constant double precision[] := array[
-- expected_bucket
0, -- 1
0.0000000001, -- 1
0.0000000002, -- 1
10, -- 1
10.00000001, 20, -- 2
20.00000001, 30, -- 3
30.00000001, 40, -- 4
40.00000001, 50, -- 5
50.00000001, 60, -- 6
60.00000001, 70, -- 7
70.00000001, 80, -- 8
80.00000001, 90, -- 9
90.00000001, 100 -- 10
];
expected_buckets constant int[] := array[1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
begin
for j in 1..array_upper(inputs, 1) loop
declare
expected_bucket constant int :=
expected_buckets[round((j + one)/two)::int];
begin
assert
bucket(inputs[j], lower_bound, upper_bound, no_of_values) = expected_bucket,
'assert failed for test no. '||j::text||':
bucket('||inputs[j]::text||', ...) <> '||expected_bucket::text;
end;
-- Provoke the expected assert failures from bucket().
declare
result double precision not null := 0;
begin
begin
result := bucket(-0.0000000002, lower_bound, upper_bound, no_of_values);
raise exception 'Logic error';
exception
when assert_failure then
-- raise info 'caught expected assert_failure';
null;
end;
begin
result := bucket(100.0000000001, lower_bound, upper_bound, no_of_values);
raise exception 'Logic error';
exception
when assert_failure then
-- raise info 'caught expected assert_failure';
null;
end;
end;
end loop;
end;
$body$;