OILS / spec / stateful / interactive.py View on Github | oilshell.org

94 lines, 47 significant
1#!/usr/bin/env python3
2"""
3interactive.py
4"""
5from __future__ import print_function
6
7import sys
8import time
9
10import harness
11from harness import register, expect_prompt
12
13
14@register()
15def syntax_error(sh):
16 'syntax error makes status=2'
17
18 sh.sendline('syntax ) error')
19
20 #time.sleep(0.1)
21
22 expect_prompt(sh)
23
24 sh.sendline('echo status=$?')
25
26 if sh.shell_label == 'mksh':
27 # mksh gives status=1, and zsh doesn't give anything?
28 sh.expect('status=1')
29 else:
30 sh.expect('status=2') # osh, bash, dash
31
32
33@register()
34def bg_proc_notify(sh):
35 'notification about background process (issue 1093)'
36
37 expect_prompt(sh)
38
39 sh.sendline('sleep 0.1 &')
40 if sh.shell_label == 'bash':
41 # e.g. [1] 12345
42 # not using trailing + because pexpect doc warns about that case
43 # dash doesn't print this
44 sh.expect(r'\[\d+\]')
45
46 sh.sendline('sleep 0.2 &')
47 if sh.shell_label == 'bash':
48 # e.g. [1] 12345
49 # not using trailing + because pexpect doc warns about that case
50 # dash doesn't print this
51 sh.expect(r'\[\d+\]')
52
53 expect_prompt(sh)
54
55 # Wait until after it stops and then hit enter
56 time.sleep(0.4)
57 sh.sendline('')
58 sh.expect(r'.*Done.*Done.*')
59
60 sh.sendline('echo status=$?')
61 sh.expect('status=0')
62
63
64@register()
65def bg_pipeline_notify(sh):
66 'notification about background pipeline (issue 1093)'
67
68 expect_prompt(sh)
69
70 sh.sendline('sleep 0.1 | cat &')
71
72 if sh.shell_label == 'bash':
73 # e.g. [1] 12345
74 # not using trailing + because pexpect doc warns about that case
75 # dash doesn't print this
76 sh.expect(r'\[\d+\]')
77
78 expect_prompt(sh)
79
80 time.sleep(0.2)
81 sh.sendline('')
82
83 sh.expect(r'.*Done.*')
84
85 sh.sendline('echo status=$?')
86 sh.expect('status=0')
87
88
89if __name__ == '__main__':
90 try:
91 sys.exit(harness.main(sys.argv))
92 except RuntimeError as e:
93 print('FATAL: %s' % e, file=sys.stderr)
94 sys.exit(1)