1use strict; 2use Test::More tests => 48; 3use Term::ReadLine::Zoid; 4 5$|++; 6 7# C<new($appname, $IN, $OUT)> 8 9$ENV{PERL_RL} = 'Zoid'; 10if (eval 'use Term::ReadLine; 1') { 11 my $t = Term::ReadLine->new('test'); 12 ok $t->ReadLine eq 'Term::ReadLine::Zoid', 'rl:zoid loaded'; 13} 14else { ok 1, 'skip Term::ReadLine NOT installed, this *might* be a problem' } 15 16my $t = Term::ReadLine::Zoid->new('test'); 17$t->{config}{bell} = sub {}; # Else the "\cG" fucks up test harness 18 19#use Data::Dumper; print Dumper $t; 20 21# test routines 22sub test_reset { 23 $_[0]->reset(); 24 $_[0]->{lines} = [ 'duss ja', 'nou ja', 'test 123' ]; # 3 X 7,6,8 25 $_[0]->{pos} = [5, 1]; 26} 27 28print "# delete && backspace\n"; 29test_reset $t; 30$t->delete_char; 31$t->delete_char; 32ok $t->{lines}[1] eq 'nou jtest 123', 'delete \n'; 33 34test_reset $t; 35$t->press("\c?\c?\c?"); 36ok $t->{lines}[1] eq 'noa', 'backspace'; 37 38print "# control-U\n"; 39test_reset $t; 40$t->press("\cU"); 41is_deeply $t->{lines}, [''], '^U'; 42 43print "# left && right\n"; 44test_reset $t; 45ok $t->forward_char, 'right 1'; 46ok $t->forward_char, 'right 2'; 47is_deeply $t->{pos}, [0,2], 'pos 1'; 48ok $t->backward_char, 'left 1'; 49is_deeply $t->{pos}, [6,1], 'pos 2'; 50$t->backward_char for 1 .. 14; # 6 + \n + 7 51is_deeply $t->{pos}, [0,0], 'pos 3'; 52ok ! $t->backward_char(), 'left 2'; 53$t->{pos} = [8, 2]; 54ok ! $t->forward_char(), 'right 3'; 55 56print "# up && down\n"; 57$t->{lines} = [ 'entry0' ]; 58$t->{history} = ['entry1', "entry2\ntest123", 'entry3']; 59$t->previous_history; 60$t->previous_history; 61is_deeply $t->{lines}, ['entry2', 'test123'], 'hist 1'; 62$t->previous_history; 63ok $t->{lines}[0] eq 'entry3', 'hist 2'; 64ok ! $t->previous_history, 'hist 3'; 65$t->next_history; 66$t->next_history; 67ok $t->{lines}[0] eq 'entry1', 'hist 4'; 68$t->next_history; 69ok $t->{lines}[0] eq 'entry0', 'hist 5'; 70ok ! $t->next_history, 'hist 6'; 71 72print "# control-W\n"; 73$t->{lines} = ['word1 word2 word3']; 74$t->{pos} = [13, 0]; 75$t->press("\cW"); 76ok $t->{lines}[0] eq 'word1 word2 ord3', '^W 1'; 77$t->press("\cW"); 78ok $t->{lines}[0] eq 'word1 ord3', '^W 2'; 79 80print "# control-V\n"; 81@$t{'pos','lines'} = ([0,0], ['']); 82push @Term::ReadLine::Zoid::Base::_key_buffer, "\cV", "\cW"; 83$t->do_key(); 84ok $t->{lines}[0] eq "\cW", '^V'; 85 86print "# save and restore\n"; 87test_reset $t; 88my $save = $t->save(); 89$t->{lines} = ['duss', 'ja']; 90$t->{pos} = [333,444]; 91$t->restore($save); 92is_deeply [[ 'duss ja', 'nou ja', 'test 123' ], [5, 1]], [@$t{'lines', 'pos'}], 'save n restore'; 93 94print "# escape\n"; 95$t->press("\e"); 96ok ref($t) eq 'Term::ReadLine::Zoid::ViCommand', 'escape to command mode'; 97 98if (eval 'Term::ReadKey::GetTerminalSize() and 1') { 99 print "# readline && continue\n"; 100 my $prompt = "# readline() test !> "; # Test::Harness might choke without the "#" 101 $t->unread_key("test 1 2 3\n"); 102 ok $t->readline($prompt) eq 'test 1 2 3', 'readline \n'; 103 104 $t->unread_key("test\cH\cH\cH\cH\cD"); 105 ok ! defined( $t->readline($prompt) ), 'readline \cD'; 106 107 $t->unread_key("test 1 2 3\cC"); 108 ok $t->readline($prompt) eq '', 'readline \cC'; 109 110 $t->Attribs()->{PS2} = "# ps2> "; 111 $t->unread_key("test 1 2 3\n"); 112 $t->readline($prompt); 113 $t->unread_key("ok\n"); 114 ok $t->continue() eq "test 1 2 3\nok", 'readline continue'; 115} 116else { 117 ok 1, 'skip - No TermSize, cross your fingers' for 1 .. 4; 118} 119 120print "# bindkey() and bindchr()\n"; 121$t->switch_mode(); 122 123test_reset $t; 124$t->bindchr('^B', 'backspace'); 125$t->press("\cB\cB\cB"); 126ok $t->{lines}[1] eq 'noa', 'bindchr'; 127 128test_reset $t; 129$t->bindkey('^Q', sub { $t->press('abc') }); 130$t->press("\cQ"); 131ok $t->{lines}[1] eq 'nou jabca', 'bindkey'; 132 133test_reset $t; 134$t->bindkey('backspace', sub { $_[0]->press("\cQ") }); 135$t->press("\cB"); 136ok $t->{lines}[1] eq 'nou jabca', 'another bindkey'; 137 138test_reset $t; 139$t->bindkey('^Q', 'backward_delete_char'); 140$t->press("\cQ\cQ\cQ"); 141ok $t->{lines}[1] eq 'noa', 'scalar bindkey'; 142 143print "# substring()\n"; 144test_reset $t; 145$t->{lines} = ['test 123, dit is test data'] ; 146 147$t->substring('dus ', [17,0]); 148ok( $$t{lines}[0] eq 'test 123, dit is dus test data', 'simple insert'); 149 150$t->substring("\nduss ", [30,0]); 151$t->substring('ja', [5,1]); 152 153is_deeply( 154 $$t{lines}, 155 ['test 123, dit is dus test data', 'duss ja'], 156 'more inserts' 157); 158 159my $re = $t->substring(undef, [21,0], [30,0]); 160ok( ($re eq 'test data') && ($$t{lines}[0] eq 'test 123, dit is dus test data'), 'copy'); 161 162$re = $t->substring('een test', [21,0], [30,0]); 163ok( ($re eq 'test data') && ($$t{lines}[0] eq 'test 123, dit is dus een test'), 'simple replace'); 164 165$re = $t->substring(",\ntest 123, test 123 .. ok", [29,0], [4,1]); 166is_deeply( 167 [$re, $$t{lines}], 168 ["\nduss", ['test 123, dit is dus een test,', 'test 123, test 123 .. ok ja'] ], 169 'multiline replace'); 170 171push @{$$t{lines}}, '?'; 172$re = $t->substring('', [27,1], [0,2]); 173ok( ($re eq "\n") && ($$t{lines}[1] eq 'test 123, test 123 .. ok ja?'), 'delete \n'); 174 175$t->{lines} = ['test 123']; 176$t->substring(" duss\n", [8,0]); 177is_deeply $t->{lines}, ['test 123 duss', ''], 'insert empty line'; 178 179print "# up & down -- very simple regression test\n"; 180 181$$t{lines} = [ 182 'test 123, dit is dus een test', 183 'test 123, test 123 .. ok ja?', 184 'test 123' 185]; 186$$t{pos} = [5, 0]; 187 188ok ! $t->backward_line, 'up 1'; 189ok $t->forward_line, 'down 1'; 190ok $t->forward_line, 'down 2'; 191is_deeply $t->{pos}, [5, 2], 'pos 1'; 192ok ! $t->forward_line, 'down 3'; 193ok ! $t->forward_line, 'down 4'; 194ok $t->backward_line, 'up 2'; 195ok $t->backward_line, 'up 3'; 196ok ! $t->backward_line, 'up 4'; 197is_deeply $t->{pos}, [5, 0], 'pos 2'; 198