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$;