Add Test for Term::Complete
authorchromatic <chromatic@wgz.org>
Sat, 8 Sep 2001 19:33:42 +0000 (13:33 -0600)
committerJarkko Hietaniemi <jhi@iki.fi>
Sun, 9 Sep 2001 13:16:43 +0000 (13:16 +0000)
Message-ID: <20010909013810.11522.qmail@onion.perl.org>

p4raw-id: //depot/perl@11959

MANIFEST
lib/Term/Complete.t [new file with mode: 0644]

index 1806ad0..60fa6f7 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1124,6 +1124,7 @@ lib/Term/ANSIColor/README Term::ANSIColor
 lib/Term/ANSIColor/test.pl     See if Term::ANSIColor works
 lib/Term/Cap.pm                        Perl module supporting termcap usage
 lib/Term/Complete.pm           A command completion subroutine
+lib/Term/Complete.t            See if Term::Complete works
 lib/Term/ReadLine.pm           Stub readline library
 lib/termcap.pl                 Perl library supporting termcap usage
 lib/Test.pm                    A simple framework for writing test scripts
diff --git a/lib/Term/Complete.t b/lib/Term/Complete.t
new file mode 100644 (file)
index 0000000..ff62d1d
--- /dev/null
@@ -0,0 +1,101 @@
+#!./perl
+
+BEGIN {
+       chdir 't' unless -d 't';
+       @INC = '../lib';
+}
+
+use warnings;
+use Test::More tests => 8;
+use vars qw( $Term::Complete::complete $complete );
+
+use_ok( 'Term::Complete' );
+
+*complete = \$Term::Complete::complete;
+
+my $in = tie *STDIN, 'FakeIn', "fro\t";
+my $out = tie *STDOUT, 'FakeOut';
+my @words = ( 'frobnitz', 'frobozz', 'frostychocolatemilkshakes' );
+
+Complete('', \@words);
+my $data = get_expected('fro', @words);
+
+# there should be an \a after our word
+like( $$out, qr/fro\a/, 'found bell character' );
+
+# now remove the \a -- there should be only one
+is( $out->scrub(), 1, '(single) bell removed');
+
+# 'fro' should match all three words
+like( $$out, qr/$data/, 'all three words possible' );
+$out->clear();
+
+# should only find 'frobnitz' and 'frobozz'
+$in->add('frob');
+Complete('', @words);
+$out->scrub();
+is( $$out, get_expected('frob', 'frobnitz', 'frobozz'), 'expected frob*' );
+$out->clear();
+
+# should only do 'frobozz'
+$in->add('frobo');
+Complete('', @words);
+$out->scrub();
+is( $$out, get_expected( 'frobo', 'frobozz' ), 'only frobozz possible' );
+$out->clear();
+
+# change the completion character
+$complete = "!";
+$in->add('frobn');
+Complete('prompt:', @words);
+$out->scrub();
+like( $$out, qr/prompt:frobn/, 'prompt is okay' );
+
+# now remove the prompt and we should be okay
+$$out =~ s/prompt://g;
+is( $$out, get_expected('frobn', 'frobnitz' ), 'works with new $complete' );
+
+# easier than matching space characters
+sub get_expected {
+       my $word = shift;
+       return join('.', $word, @_, $word, '.');
+}
+
+package FakeIn;
+
+sub TIEHANDLE {
+       my ($class, $text) = @_;
+       $text .= "$main::complete\025";
+       bless(\$text, $class);
+}
+
+sub add {
+       my ($self, $text) = @_;
+       $$self = $text . "$main::complete\025";
+}
+
+sub GETC {
+       my $self = shift;
+       return length $$self ? substr($$self, 0, 1, '') : "\r";
+}
+
+package FakeOut;
+
+sub TIEHANDLE {
+       bless(\(my $text), $_[0]);
+}
+
+sub clear {
+       ${ $_[0] } = '';
+}
+
+# remove the bell character
+sub scrub {
+       ${ $_[0] } =~ tr/\a//d;
+}
+
+# must shift off self
+sub PRINT {
+       my $self = shift;
+       ($$self .= join('', @_)) =~ s/\s+/./gm;
+}