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