Further fixes for tab-completion TAP tests.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 3 Jan 2020 17:54:13 +0000 (12:54 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 3 Jan 2020 17:54:13 +0000 (12:54 -0500)
Escape non-printable characters in failure reports, by using Data::Dumper
in Useqq mode.  Also, bump $Test::Builder::Level so the diagnostic
references the calling line, and use diag() instad of note(),
so it shows even in non-verbose mode (per request from Christoph Berg).

Also, give up on trying to test for the specific way that readline
chooses to overwrite existing text in the \DRD -> \drds test.
There are too many variants, it seems, at least on the libedit
side of things.

Dagfinn Ilmari MannsÃ¥ker and Tom Lane

Discussion: https://postgr.es/m/20200103110128.GA28967@msg.df7cb.de

src/bin/psql/t/010_tab_completion.pl

index a02cbd8e4761b7d71b2a141952c43586123d5d3e..96221f8148150d78b19feebfa892cf042e28208a 100644 (file)
@@ -5,6 +5,7 @@ use PostgresNode;
 use TestLib;
 use Test::More;
 use IPC::Run qw(pump finish timer);
+use Data::Dumper;
 
 if (!defined($ENV{with_readline}) || $ENV{with_readline} ne 'yes')
 {
@@ -52,6 +53,9 @@ sub check_completion
 {
        my ($send, $pattern, $annotation) = @_;
 
+       # report test failures from caller location
+       local $Test::Builder::Level = $Test::Builder::Level + 1;
+
        # reset output collector
        $out = "";
        # restart per-command timer
@@ -63,7 +67,9 @@ sub check_completion
        my $okay = ($out =~ m/$pattern/ && !$timer->is_expired);
        ok($okay, $annotation);
        # for debugging, log actual output if it didn't match
-       note 'Actual output was "' . $out . "\"\n" if !$okay;
+       local $Data::Dumper::Terse = 1;
+       local $Data::Dumper::Useqq = 1;
+       diag 'Actual output was ' . Dumper($out) . "\n" if !$okay;
        return;
 }
 
@@ -105,11 +111,9 @@ check_completion("2\t", "246 ",
 clear_query();
 
 # check case-sensitive keyword replacement
-# XXX the output here might vary across readline versions
-check_completion(
-       "\\DRD\t",
-       "\\DRD\b\b\bdrds ",
-       "complete \\DRD<tab> to \\drds");
+# note: various versions of readline/libedit handle backspacing
+# differently, so just check that the replacement comes out correctly
+check_completion("\\DRD\t", "drds ", "complete \\DRD<tab> to \\drds");
 
 clear_query();