summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MANIFEST1
-rw-r--r--lib/Term/Complete.t101
2 files changed, 102 insertions, 0 deletions
diff --git a/MANIFEST b/MANIFEST
index 1806ad0e63..60fa6f753a 100644
--- 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
index 0000000000..ff62d1d871
--- /dev/null
+++ b/lib/Term/Complete.t
@@ -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;
+}