ttytest2 0.9.11 → 0.9.13

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,790 @@
1
+ # !/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # this is from my personal project, ncsh.
5
+ # it is an example of integration/acceptance tests using ttytest2.
6
+ # ncsh is a noncanonical shell which I use ttytest2 to integration test.
7
+
8
+ require 'ttytest'
9
+
10
+ START_COL = 20
11
+ WC_C_LENGTH = '225'
12
+ SLEEP_TIME = 0.2
13
+ LS_LINES = 3
14
+ LS_ITEMS = 19
15
+ LS_FIRST_ITEM = 'CMakeLists.txt'
16
+ TAB_AUTOCOMPLETE_ROWS = 10
17
+
18
+ def assert_check_new_row(row)
19
+ @tty.assert_row_starts_with(row, "#{ENV['USER']} ")
20
+ @tty.assert_row_like(row, 'ncsh')
21
+ @tty.assert_row_ends_with(row, ' ❱ ')
22
+ @tty.assert_cursor_position(START_COL, row)
23
+ end
24
+
25
+ def starting_tests(test)
26
+ puts "===== Starting #{test} tests ====="
27
+ end
28
+
29
+ def z_database_new_test(row)
30
+ @tty.assert_row(row, 'Error opening z database file: No such file or directory')
31
+ row += 1
32
+ @tty.assert_row(row, 'Trying to create z database file.')
33
+ row += 1
34
+ @tty.assert_row(row, 'Created z database file.')
35
+ row += 1
36
+ puts 'New z database test passed'
37
+ row
38
+ end
39
+
40
+ def startup_test(row)
41
+ @tty.assert_row_starts_with(row, 'ncsh: startup time: ')
42
+ row += 1
43
+ puts 'Startup time test passed'
44
+ row
45
+ end
46
+
47
+ def newline_sanity_test(row)
48
+ assert_check_new_row(row)
49
+ @tty.send_newline
50
+ row += 1
51
+ assert_check_new_row(row)
52
+ @tty.send_newline
53
+ row += 1
54
+ puts 'Newline sanity test passed'
55
+ row
56
+ end
57
+
58
+ def empty_line_arrow_check(row)
59
+ @tty.send_left_arrow
60
+ assert_check_new_row(row)
61
+ @tty.send_right_arrow
62
+ assert_check_new_row(row)
63
+ end
64
+
65
+ def empty_line_sanity_test(row)
66
+ assert_check_new_row(row)
67
+ empty_line_arrow_check(row)
68
+ @tty.send_backspace
69
+ assert_check_new_row(row)
70
+ @tty.send_delete
71
+ assert_check_new_row(row)
72
+ puts 'Empty line sanity test passed'
73
+ row
74
+ end
75
+
76
+ def startup_tests(row, run_z_database_new_tests)
77
+ starting_tests 'startup tests'
78
+
79
+ row = z_database_new_test row if run_z_database_new_tests
80
+ row = startup_test row
81
+ row = newline_sanity_test row
82
+
83
+ empty_line_sanity_test row
84
+ end
85
+
86
+ def basic_ls_test(row)
87
+ assert_check_new_row(row)
88
+ @tty.send_keys_one_at_a_time(%(ls))
89
+ @tty.assert_cursor_position(START_COL + 2, row)
90
+ @tty.send_newline
91
+ @tty.assert_row_ends_with(row, 'ls')
92
+ row += 1
93
+ @tty.assert_row_starts_with(row, LS_FIRST_ITEM)
94
+ row += LS_LINES
95
+ puts 'Basic input (ls) test passed'
96
+ row
97
+ end
98
+
99
+ def basic_bad_command_test(row)
100
+ assert_check_new_row(row)
101
+ @tty.send_keys_one_at_a_time(%(lss)) # send a bad command
102
+ @tty.assert_cursor_position(START_COL + 3, row)
103
+ @tty.send_newline
104
+ @tty.assert_row_ends_with(row, 'lss')
105
+ row += 1
106
+ @tty.assert_row(row, 'ncsh: Could not find command or directory: No such file or directory')
107
+ row += 1
108
+ puts 'Bad command test passed'
109
+ row
110
+ end
111
+
112
+ def basic_tests(row)
113
+ starting_tests 'basic'
114
+
115
+ row = basic_ls_test row
116
+ basic_bad_command_test row
117
+ end
118
+
119
+ def home_and_end_tests(row)
120
+ starting_tests 'home and end'
121
+
122
+ assert_check_new_row(row)
123
+ @tty.send_keys_one_at_a_time(%(ss))
124
+ @tty.send_home
125
+ @tty.assert_cursor_position(START_COL, row)
126
+ @tty.send_end
127
+ @tty.assert_cursor_position(START_COL + 2, row)
128
+ @tty.send_backspaces(2)
129
+
130
+ puts 'Home and End tests passed'
131
+ row
132
+ end
133
+
134
+ def end_of_line_backspace_test(row)
135
+ assert_check_new_row(row)
136
+ @tty.send_keys_one_at_a_time(%(l))
137
+ @tty.send_backspace
138
+ assert_check_new_row(row)
139
+ puts 'End of line backspace test passed'
140
+ row
141
+ end
142
+
143
+ def multiple_end_of_line_backspace_test(row)
144
+ @tty.send_keys_one_at_a_time(%(lsssss))
145
+ @tty.assert_row_ends_with(row, %(lsssss))
146
+ @tty.send_backspaces(4)
147
+ @tty.assert_row_ends_with(row, 'ls')
148
+ @tty.send_backspaces(2)
149
+ assert_check_new_row(row)
150
+ @tty.send_keys_one_at_a_time(%(echo hello)) # make sure buffer is properly formed after backspaces
151
+ @tty.send_backspace
152
+ @tty.send_keys_one_at_a_time(%(o))
153
+ @tty.send_newline
154
+ row += 1
155
+ @tty.assert_row(row, 'hello')
156
+ row += 1
157
+ puts 'Multiple end of line backspace test passed'
158
+ row
159
+ end
160
+
161
+ def midline_backspace_test(row)
162
+ assert_check_new_row(row)
163
+ @tty.send_keys_one_at_a_time(%(lsssss))
164
+ @tty.assert_cursor_position(START_COL + 6, row)
165
+ @tty.send_left_arrows(2)
166
+ @tty.assert_cursor_position(START_COL + 4, row)
167
+ @tty.send_backspaces(4)
168
+ @tty.assert_cursor_position(START_COL, row)
169
+ @tty.assert_row_ends_with(row, 'ss')
170
+ @tty.send_right_arrows(2)
171
+ @tty.assert_cursor_position(START_COL + 2, row)
172
+ @tty.send_backspaces(2)
173
+ @tty.assert_cursor_position(START_COL, row)
174
+ @tty.send_keys_one_at_a_time(%(echo hello)) # make sure buffer is properly formed after backspaces
175
+ @tty.send_newline
176
+ row += 1
177
+ @tty.assert_row(row, 'hello')
178
+ row += 1
179
+ puts 'Midline backspace test passed'
180
+ row
181
+ end
182
+
183
+ def backspace_tests(row)
184
+ starting_tests 'backspace'
185
+
186
+ row = end_of_line_backspace_test row
187
+ row = multiple_end_of_line_backspace_test row
188
+
189
+ midline_backspace_test row
190
+ end
191
+
192
+ def end_of_line_delete_test(row)
193
+ assert_check_new_row(row)
194
+ @tty.send_keys_one_at_a_time('s')
195
+ @tty.assert_cursor_position(START_COL + 1, row)
196
+ @tty.send_left_arrow
197
+ @tty.assert_cursor_position(START_COL, row)
198
+ @tty.send_delete
199
+ assert_check_new_row(row)
200
+ puts 'End of line delete test passed'
201
+ row
202
+ end
203
+
204
+ def midline_delete_test(row)
205
+ assert_check_new_row(row)
206
+ @tty.send_keys_one_at_a_time(%(lssss))
207
+ @tty.assert_cursor_position(START_COL + 5, row)
208
+ @tty.send_left_arrows(4)
209
+ @tty.assert_cursor_position(START_COL + 1, row)
210
+ @tty.send_delete
211
+ @tty.assert_cursor_position(START_COL + 1, row)
212
+ @tty.send_deletes(3)
213
+ @tty.send_left_arrow
214
+ @tty.send_delete
215
+ assert_check_new_row(row)
216
+ @tty.send_keys_one_at_a_time(%(echo hello))
217
+ @tty.send_newline
218
+ row += 1
219
+ @tty.assert_row(row, 'hello')
220
+ row += 1
221
+ puts 'Midline delete test passed'
222
+ row
223
+ end
224
+
225
+ def delete_tests(row)
226
+ starting_tests 'delete'
227
+
228
+ row = end_of_line_delete_test row
229
+ midline_delete_test row
230
+ end
231
+
232
+ def pipe_test(row)
233
+ assert_check_new_row(row)
234
+ @tty.send_keys_one_at_a_time(%(ls | wc -c))
235
+ @tty.send_newline
236
+ row += 1
237
+ @tty.assert_row_ends_with(row, WC_C_LENGTH)
238
+ row += 1
239
+ puts 'Simple pipe test passed'
240
+ row
241
+ end
242
+
243
+ def multiple_pipes_test(row)
244
+ assert_check_new_row(row)
245
+ @tty.send_keys_one_at_a_time(%(ls | sort | wc -c))
246
+ @tty.send_newline
247
+ row += 1
248
+ @tty.assert_row_ends_with(row, WC_C_LENGTH)
249
+ row += 1
250
+ puts 'Multiple pipes test passed'
251
+ row
252
+ end
253
+
254
+ def pipe_tests(row)
255
+ starting_tests 'pipe'
256
+
257
+ row = pipe_test row
258
+ multiple_pipes_test row
259
+ end
260
+
261
+ def basic_history_test(row)
262
+ assert_check_new_row(row)
263
+ @tty.send_up_arrow
264
+ @tty.assert_row_ends_with(row, 'ls | sort | wc -c')
265
+ @tty.send_up_arrow
266
+ @tty.assert_row_ends_with(row, 'ls | wc -c')
267
+ @tty.send_down_arrow
268
+ @tty.assert_row_ends_with(row, 'ls | sort | wc -c')
269
+ @tty.send_newline
270
+ row += 1
271
+ @tty.assert_row_ends_with(row, WC_C_LENGTH)
272
+ row += 1
273
+ puts 'Basic history test passed'
274
+ row
275
+ end
276
+
277
+ def history_delete_test(row)
278
+ assert_check_new_row(row)
279
+ @tty.send_up_arrow
280
+ @tty.assert_row_ends_with(row, 'ls | sort | wc -c')
281
+ @tty.send_left_arrows(12)
282
+ @tty.send_deletes(7)
283
+ @tty.send_newline
284
+ row += 1
285
+ @tty.assert_row_ends_with(row, WC_C_LENGTH)
286
+ row += 1
287
+ puts 'History delete test passed'
288
+ row
289
+ end
290
+
291
+ def history_backspace_test(row)
292
+ # TODO: implementation
293
+ puts 'History backspace test passed'
294
+ row
295
+ end
296
+
297
+ def history_clear_test(row)
298
+ # TODO: implementation
299
+ puts 'History clear test passed'
300
+ row
301
+ end
302
+
303
+ def history_tests(row)
304
+ starting_tests 'history'
305
+
306
+ row = basic_history_test row
307
+ # row =
308
+ history_delete_test row
309
+ # row = history_backspace_test
310
+ # history_clear_test
311
+ end
312
+
313
+ def basic_stdout_redirection_test(row)
314
+ assert_check_new_row(row)
315
+ @tty.send_keys_one_at_a_time(%(ls > t.txt))
316
+ @tty.send_newline
317
+ sleep SLEEP_TIME
318
+ row += 1
319
+ assert_check_new_row(row)
320
+ @tty.send_keys_one_at_a_time(%(head -1 t.txt))
321
+ @tty.send_newline
322
+ sleep SLEEP_TIME
323
+ row += 1
324
+ @tty.assert_row_starts_with(row, LS_FIRST_ITEM)
325
+ row += 1
326
+ assert_check_new_row(row)
327
+ @tty.send_keys_one_at_a_time(%(rm t.txt))
328
+ @tty.send_newline
329
+ row += 1
330
+ puts 'Basic output redirection test passed'
331
+ row
332
+ end
333
+
334
+ def piped_stdout_redirection_test(row)
335
+ assert_check_new_row(row)
336
+ @tty.send_keys_one_at_a_time(%(ls | sort -r > t2.txt))
337
+ @tty.assert_row_ends_with(row, %(ls | sort -r > t2.txt))
338
+ @tty.send_newline
339
+ sleep SLEEP_TIME
340
+ row += 1
341
+ assert_check_new_row(row)
342
+ @tty.send_keys_one_at_a_time(%(head -1 t2.txt))
343
+ @tty.assert_row_ends_with(row, %(head -1 t2.txt))
344
+ @tty.send_newline
345
+ sleep SLEEP_TIME
346
+ row += 1
347
+ @tty.assert_row_starts_with(row, 'tests_z.sh')
348
+ row += 1
349
+ assert_check_new_row(row)
350
+ @tty.send_keys_one_at_a_time(%(rm t2.txt))
351
+ @tty.send_newline
352
+ row += 1
353
+ puts 'Piped output redirection test passed'
354
+ row
355
+ end
356
+
357
+ def multiple_piped_stdout_redirection_test(row)
358
+ assert_check_new_row(row)
359
+ @tty.send_keys_one_at_a_time(%(ls | sort | wc -c > t3.txt))
360
+ @tty.assert_row_ends_with(row, %(ls | sort | wc -c > t3.txt))
361
+ @tty.send_newline
362
+ sleep SLEEP_TIME
363
+ row += 1
364
+ assert_check_new_row(row)
365
+ @tty.send_keys_one_at_a_time(%(head -1 t3.txt))
366
+ @tty.assert_row_ends_with(row, %(head -1 t3.txt))
367
+ @tty.send_newline
368
+ sleep SLEEP_TIME
369
+ row += 1
370
+ @tty.assert_row_starts_with(row, (WC_C_LENGTH.to_i + 't3.txt'.length + 1).to_s)
371
+ row += 1
372
+ assert_check_new_row(row)
373
+ @tty.send_keys_one_at_a_time(%(rm t3.txt))
374
+ @tty.send_newline
375
+ row += 1
376
+ puts 'Multiple piped output redirection test passed'
377
+ row
378
+ end
379
+
380
+ def stdout_redirection_tests(row)
381
+ starting_tests 'stdout redirection'
382
+
383
+ row = basic_stdout_redirection_test row
384
+ row = piped_stdout_redirection_test row
385
+ multiple_piped_stdout_redirection_test row
386
+ end
387
+
388
+ def z_add_tests(row)
389
+ starting_tests 'z_add'
390
+ assert_check_new_row(row)
391
+ @tty.send_keys_one_at_a_time(%(z add ~/.config\n))
392
+ row += 1
393
+ @tty.assert_row_ends_with(row, %(Added new entry to z database.))
394
+ row += 1
395
+ @tty.send_keys_one_at_a_time(%(z add ~/.config\n))
396
+ row += 1
397
+ @tty.assert_row_ends_with(row, 'Entry already exists in z database.')
398
+ row += 1
399
+ puts 'z add tests passed'
400
+ row
401
+ end
402
+
403
+ def basic_stdin_redirection_test(row)
404
+ assert_check_new_row(row)
405
+ @tty.send_keys_one_at_a_time(%(ls > t.txt))
406
+ @tty.send_newline
407
+ sleep SLEEP_TIME
408
+ row += 1
409
+ assert_check_new_row(row)
410
+ @tty.send_keys_one_at_a_time(%(sort < t.txt))
411
+ @tty.send_newline
412
+ sleep SLEEP_TIME
413
+ row += 1
414
+ @tty.assert_row_starts_with(row, LS_FIRST_ITEM)
415
+ row += LS_ITEMS
416
+ assert_check_new_row(row)
417
+ @tty.send_keys_one_at_a_time(%(rm t.txt))
418
+ @tty.send_newline
419
+ row += 1
420
+ puts 'Basic input redirection test passed'
421
+ row
422
+ end
423
+
424
+ def piped_stdin_redirection_test(row)
425
+ assert_check_new_row(row)
426
+ @tty.send_keys_one_at_a_time(%(ls > t2.txt))
427
+ @tty.assert_row_ends_with(row, %(ls > t2.txt))
428
+ @tty.send_newline
429
+ sleep SLEEP_TIME
430
+ row += 1
431
+ assert_check_new_row(row)
432
+ @tty.send_keys_one_at_a_time(%(sort | wc -c < t2.txt))
433
+ @tty.assert_row_ends_with(row, %(sort | wc -c < t2.txt))
434
+ @tty.send_newline
435
+ sleep SLEEP_TIME
436
+ row += 1
437
+ @tty.assert_row_starts_with(row, (WC_C_LENGTH.to_i + 't2.txt'.length + 1).to_s)
438
+ row += 1
439
+ assert_check_new_row(row)
440
+ @tty.send_keys_one_at_a_time(%(rm t2.txt))
441
+ @tty.send_newline
442
+ row += 1
443
+ puts 'Piped input redirection test passed'
444
+ row
445
+ end
446
+
447
+ def multiple_piped_stdin_redirection_test(row)
448
+ assert_check_new_row(row)
449
+ @tty.send_keys_one_at_a_time(%(ls > t3.txt))
450
+ @tty.assert_row_ends_with(row, %(ls > t3.txt))
451
+ @tty.send_newline
452
+ sleep SLEEP_TIME
453
+ row += 1
454
+ @tty.send_keys_one_at_a_time(%(sort | head -1 | wc -l < t3.txt))
455
+ @tty.assert_row_ends_with(row, %(sort | head -1 | wc -l < t3.txt))
456
+ @tty.send_newline
457
+ sleep SLEEP_TIME
458
+ row += 1
459
+ @tty.assert_row(row, '1')
460
+ row += 1
461
+ assert_check_new_row(row)
462
+ @tty.send_keys_one_at_a_time(%(rm t3.txt))
463
+ @tty.send_newline
464
+ row += 1
465
+ puts 'Multiple piped input redirection test passed'
466
+ row
467
+ end
468
+
469
+ def stdin_redirection_tests(row)
470
+ starting_tests 'stdin redirection'
471
+
472
+ row = basic_stdin_redirection_test row
473
+ row = piped_stdin_redirection_test row
474
+ multiple_piped_stdin_redirection_test row
475
+ end
476
+
477
+ def basic_autocompletion_test(row)
478
+ assert_check_new_row(row)
479
+ @tty.send_keys_one_at_a_time(%(l))
480
+ @tty.send_right_arrow
481
+ @tty.assert_row_ends_with(row, %(ls))
482
+ @tty.send_backspaces(2)
483
+
484
+ puts 'Basic autocompletion test passed'
485
+ row
486
+ end
487
+
488
+ def backspace_and_delete_autocompletion_test(row)
489
+ assert_check_new_row(row)
490
+ @tty.send_keys_one_at_a_time(%(ls |))
491
+ @tty.send_right_arrow
492
+ @tty.assert_row_ends_with(row, %(ls | sort))
493
+
494
+ @tty.send_left_arrows(6)
495
+ @tty.send_deletes(6)
496
+ @tty.send_keys_one_at_a_time(%(|))
497
+ @tty.send_right_arrow
498
+ @tty.assert_row_ends_with(row, %(ls | sort))
499
+
500
+ @tty.send_keys_one_at_a_time(%( |))
501
+ @tty.send_right_arrow
502
+ @tty.assert_row_ends_with(row, %(ls | sort | wc -c))
503
+ @tty.send_newline
504
+ row += 1
505
+ @tty.assert_row(row, WC_C_LENGTH)
506
+ row += 1
507
+
508
+ puts 'Backspace and delete autocompletion test passed'
509
+ row
510
+ end
511
+
512
+ def autocompletion_tests(row)
513
+ starting_tests 'autocompletion'
514
+
515
+ row = basic_autocompletion_test row
516
+ backspace_and_delete_autocompletion_test row
517
+ end
518
+
519
+ def help_test(row)
520
+ assert_check_new_row(row)
521
+ @tty.send_keys_one_at_a_time(%(help\n))
522
+ row += 1
523
+ @tty.assert_contents_at row, row + 6, <<~TERM
524
+ ncsh by Alex Eski: help
525
+
526
+ Builtin Commands {command} {args}
527
+ q: To exit, type q, exit, or quit and press enter. You can also use Ctrl+D to exit.
528
+ cd/z: You can change directory with cd or z.
529
+ echo: You can write things to the screen using echo.
530
+ history: You can see your command history using the history command.
531
+ alex /shells/ncsh ❱
532
+ TERM
533
+ row += 7
534
+ puts 'Help test passed'
535
+ row
536
+ end
537
+
538
+ def basic_echo_test(row)
539
+ assert_check_new_row(row)
540
+ @tty.send_keys_one_at_a_time(%(echo hello))
541
+ @tty.assert_cursor_position(START_COL + 10, row)
542
+ @tty.send_newline
543
+ @tty.assert_row_ends_with(row, 'echo hello')
544
+ row += 1
545
+ @tty.assert_row(row, 'hello')
546
+ row += 1
547
+ puts 'echo hello test passed'
548
+ row
549
+ end
550
+
551
+ def builtin_tests(row)
552
+ starting_tests 'builtin'
553
+
554
+ row = help_test row
555
+ basic_echo_test row
556
+ end
557
+
558
+ def delete_line_tests(row)
559
+ starting_tests 'delete line'
560
+ assert_check_new_row(row)
561
+ @tty.send_keys_one_at_a_time(%(ls | sort ))
562
+ @tty.send_keys_exact(TTYtest::CTRLU)
563
+ assert_check_new_row(row)
564
+ @tty.send_keys_exact(TTYtest::CTRLU)
565
+ puts 'Delete line test passed'
566
+ row
567
+ end
568
+
569
+ def delete_word_tests(row)
570
+ starting_tests 'delete word'
571
+ assert_check_new_row(row)
572
+ @tty.send_keys_one_at_a_time(%(ls | sort ))
573
+ @tty.send_keys(TTYtest::CTRLW)
574
+ @tty.assert_row_ends_with(row, %(ls | sort))
575
+ @tty.send_keys(TTYtest::CTRLW)
576
+ @tty.assert_row_ends_with(row, %(ls |))
577
+ @tty.send_keys(TTYtest::CTRLW)
578
+ @tty.assert_row_ends_with(row, %(ls))
579
+ @tty.send_keys(TTYtest::CTRLW)
580
+ puts 'Delete word test passed'
581
+ row
582
+ end
583
+
584
+ def tab_out_autocompletion_test(row)
585
+ assert_check_new_row(row)
586
+ @tty.send_keys_one_at_a_time(%(ls))
587
+ @tty.send_keys(TTYtest::TAB)
588
+ row += 1
589
+ @tty.assert_row_ends_with(row, %(ls > t.txt))
590
+ @tty.send_keys(TTYtest::TAB)
591
+ row += TAB_AUTOCOMPLETE_ROWS
592
+ assert_check_new_row(row)
593
+
594
+ puts 'Tab out of autocompletion test passed'
595
+ row
596
+ end
597
+
598
+ def arrows_move_tab_autocompletion_test(row)
599
+ assert_check_new_row(row)
600
+ @tty.send_keys_one_at_a_time(%(ls))
601
+ @tty.send_keys(TTYtest::TAB)
602
+ row += 1
603
+ cursor_x_before = @tty.cursor_x
604
+ cursor_y_before = @tty.cursor_y
605
+ @tty.send_up_arrow
606
+ @tty.assert_cursor_position(cursor_x_before, cursor_y_before)
607
+ @tty.send_down_arrow
608
+ @tty.assert_cursor_position(cursor_x_before, cursor_y_before + 1)
609
+ @tty.send_down_arrows(TAB_AUTOCOMPLETE_ROWS + 1)
610
+ @tty.assert_cursor_position(cursor_x_before, cursor_y_before + 8)
611
+ @tty.send_keys(TTYtest::TAB)
612
+ row += TAB_AUTOCOMPLETE_ROWS
613
+
614
+ puts 'Arrows autocompletion test passed'
615
+ row
616
+ end
617
+
618
+ def select_tab_autocompletion_test(row)
619
+ assert_check_new_row(row)
620
+ @tty.send_keys_one_at_a_time(%(ls))
621
+ @tty.send_keys(TTYtest::TAB)
622
+ row += 1
623
+ @tty.send_down_arrows(5)
624
+ @tty.send_newline
625
+ row += TAB_AUTOCOMPLETE_ROWS + 1
626
+ @tty.assert_row_ends_with(row, WC_C_LENGTH)
627
+ row += 1
628
+
629
+ puts 'Select tab autocompletion test passed'
630
+ row
631
+ end
632
+
633
+ def tab_autocompletion_tests(row)
634
+ starting_tests 'tab autocompletion'
635
+
636
+ row = tab_out_autocompletion_test row
637
+ row = arrows_move_tab_autocompletion_test row
638
+ select_tab_autocompletion_test row
639
+ end
640
+
641
+ def assert_check_syntax_error(row, input)
642
+ assert_check_new_row(row)
643
+ @tty.send_keys_one_at_a_time(input)
644
+ @tty.send_newline
645
+ row += 1
646
+ @tty.assert_row_starts_with(row, 'ncsh: Invalid syntax:')
647
+ row += 1
648
+ row
649
+ end
650
+
651
+ def operators_invalid_syntax_first_position_test(row)
652
+ # tries sending operator as only character to ensure invalid syntax is shown to user
653
+ row = assert_check_syntax_error(row, '|') # pipe
654
+ row = assert_check_syntax_error(row, '>') # output redirection
655
+ row = assert_check_syntax_error(row, '>>') # output redirection append
656
+ row = assert_check_syntax_error(row, '<') # input redirection
657
+ row = assert_check_syntax_error(row, '2>') # error redirection
658
+ row = assert_check_syntax_error(row, '2>>') # error redirection append
659
+ row = assert_check_syntax_error(row, '&>') # output and error redirection
660
+ row = assert_check_syntax_error(row, '&>>') # output and error redirection append
661
+ row = assert_check_syntax_error(row, '&') # background job
662
+ puts 'Invalid syntax in first position test passed'
663
+ row
664
+ end
665
+
666
+ def operators_invalid_syntax_last_position_test(row)
667
+ row = assert_check_syntax_error(row, 'ls |') # pipe
668
+ row = assert_check_syntax_error(row, 'ls >') # output redirection
669
+ row = assert_check_syntax_error(row, 'ls >>') # output redirection append
670
+ row = assert_check_syntax_error(row, 'sort <') # input redirection
671
+ row = assert_check_syntax_error(row, 'ls 2>') # error redirection
672
+ row = assert_check_syntax_error(row, 'ls 2>>') # error redirection append
673
+ row = assert_check_syntax_error(row, 'ls &>') # output and error redirection
674
+ row = assert_check_syntax_error(row, 'ls &>>') # output and error redirection append
675
+ puts 'Invalid syntax in last position test passed'
676
+ row
677
+ end
678
+
679
+ # invalid operator usage to ensure invalid syntax is shown to user
680
+ def syntax_error_tests(row)
681
+ starting_tests 'syntax errors'
682
+
683
+ row = operators_invalid_syntax_first_position_test row
684
+ operators_invalid_syntax_last_position_test row
685
+ end
686
+
687
+ def basic_stderr_redirection_test(row)
688
+ assert_check_new_row(row)
689
+ @tty.send_keys_one_at_a_time(%(lss 2> t4.txt))
690
+ @tty.send_newline
691
+ sleep SLEEP_TIME
692
+ row += 1
693
+ @tty.send_keys_one_at_a_time(%(cat t4.txt))
694
+ @tty.send_newline
695
+ row += 1
696
+ @tty.assert_row_ends_with(row, 'No such file or directory')
697
+ row += 1
698
+ @tty.send_keys_one_at_a_time(%(rm t4.txt))
699
+ @tty.send_newline
700
+ row += 1
701
+
702
+ puts 'Basic stderr redirection test passed'
703
+ row
704
+ end
705
+
706
+ def stderr_redirection_tests(row)
707
+ starting_tests 'sterr redirection'
708
+
709
+ basic_stderr_redirection_test row
710
+ end
711
+
712
+ def basic_stdout_and_stderr_redirection_stderr_test(row)
713
+ assert_check_new_row(row)
714
+ @tty.send_keys_one_at_a_time(%(lss &> t4.txt))
715
+ @tty.send_newline
716
+ sleep SLEEP_TIME
717
+ row += 1
718
+ @tty.send_keys_one_at_a_time(%(cat t4.txt))
719
+ @tty.send_newline
720
+ row += 1
721
+ @tty.assert_row_ends_with(row, 'No such file or directory')
722
+ row += 1
723
+ @tty.send_keys_one_at_a_time(%(rm t4.txt))
724
+ @tty.send_newline
725
+ row += 1
726
+
727
+ puts 'Basic stdout and stderr redirection stderr test passed'
728
+ row
729
+ end
730
+
731
+ def basic_stdout_and_stderr_redirection_stdout_test(row)
732
+ assert_check_new_row(row)
733
+ @tty.send_keys_one_at_a_time(%(ls &> t4.txt))
734
+ @tty.send_newline
735
+ sleep SLEEP_TIME
736
+ row += 1
737
+ @tty.send_keys_one_at_a_time(%(cat t4.txt | head -1))
738
+ @tty.send_newline
739
+ row += 1
740
+ @tty.assert_row_ends_with(row, LS_FIRST_ITEM)
741
+ row += 1
742
+ @tty.send_keys_one_at_a_time(%(rm t4.txt))
743
+ @tty.send_newline
744
+ row += 1
745
+
746
+ puts 'Basic stdout and stderr redirection stdout test passed'
747
+ row
748
+ end
749
+
750
+ def stdout_and_stderr_redirection_tests(row)
751
+ starting_tests 'stdout and sterr redirection'
752
+
753
+ row = basic_stdout_and_stderr_redirection_stderr_test row
754
+ basic_stdout_and_stderr_redirection_stdout_test row
755
+ end
756
+
757
+ row = 0
758
+ @tty = TTYtest.new_terminal(%(PS1='$ ' ./bin/ncsh), width: 120, height: 120)
759
+
760
+ row = startup_tests(row, true)
761
+ row = basic_tests row
762
+ row = home_and_end_tests row
763
+ row = backspace_tests row
764
+ row = delete_tests row
765
+ row = pipe_tests row
766
+ row = history_tests row
767
+ row = stdout_redirection_tests row
768
+ row = z_add_tests row
769
+ row = stdin_redirection_tests row
770
+ row = autocompletion_tests row
771
+ row = builtin_tests row
772
+ row = delete_line_tests row
773
+ row = delete_word_tests row
774
+ tab_autocompletion_tests row
775
+ @tty.send_keys_exact(%(quit))
776
+ @tty.send_newline
777
+
778
+ row = 0
779
+ @tty = TTYtest.new_terminal(%(PS1='$ ' ./bin/ncsh), width: 180, height: 150)
780
+ row = startup_tests(row, false)
781
+ row = syntax_error_tests row
782
+ row = stderr_redirection_tests row
783
+ stdout_and_stderr_redirection_tests row
784
+
785
+ # troubleshooting
786
+ # @tty.print
787
+ # @tty.print_rows
788
+ # p @tty.to_s
789
+
790
+ puts 'All tests passed!'