#!/usr/bin/perl -w require 5.003; use strict; my $program_name; ($program_name = $0) =~ s|.*/||; # A file spec: a scalar or a reference to a single-keyed hash # ================ # 'contents' contents only (file name is derived from test name) # {filename => 'contents'} filename and contents # {filename => undef} filename only -- $(srcdir)/filename must exist # (FIXME: note to self: get $srcdir from ENV) # # FIXME: If there is more than one input file, the you can't specify REDIRECT. # PIPE is still ok. # # I/O spec: a hash ref with the following properties # ================ # - one key/value pair # - the key must be one of these strings: IN, OUT, ERR, EXIT # - the value must be a file spec # {OUT => 'data'} put data in a temp file and compare it to stdout from cmd # {OUT => {'filename'=>undef}} compare contents of existing filename to # stdout from cmd # Ditto for `ERR', but compare with stderr # {EXIT => N} expect exit status of cmd to be N # # There may be many input file specs. File names from the input specs # are concatenated in order on the command line. # There may be at most one of the OUT-, ERR-, and EXIT-keyed specs. # If the OUT-(or ERR)-keyed hash ref is omitted, then expect no output # on stdout (or stderr). # If the EXIT-keyed one is omitted, then expect the exit status to be zero. my $q_bell = {IN => {"q\a" => ''}} my @Tests = ( # test-name options input expected-output # ['q-', $q_bell, {OUT => "q\a\n"}], ['q-N', '-N', $q_bell, {OUT => "q\a\n"}], ['q-q', '-q', $q_bell, {OUT => "q?\n"}], ['q-Q', '-Q', $q_bell, {OUT => "\"q\\a\"\n"}], ['q-qs-lit', '--quoting=literal', $q_bell, {OUT => "q\a\n"}], ['q-qs-sh', '--quoting=shell', $q_bell, {OUT => "q\a\n"}], ['q-qs-sh-a', '--quoting=shell-always', $q_bell, {OUT => "'q\a'\n"}], ['q-qs-c', '--quoting=c', $q_bell, {OUT => "\"q\\a\"\n"}], ['q-qs-esc', '--quoting=escape', $q_bell, {OUT => "q\\a\n"}], ); my $save_temps = 0; my $verbose = 0; my $prog = $ENV{LS} || 'ls'; my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose); exit $fail;