OILS / opy / _regtest / src / test / sh_spec_test.py View on Github | oilshell.org

104 lines, 56 significant
1#!/usr/bin/env python
2"""
3sh_spec_test.py: Tests for sh_spec.py
4"""
5
6import cStringIO
7import pprint
8import unittest
9
10from sh_spec import * # module under test
11
12TEST1 = cStringIO.StringIO("""\
13### Env binding in readonly/declare disallowed
14FOO=foo readonly v=$(tests/printenv.py FOO)
15echo "v=$v"
16# Shells allow this misleading construct, but the correct behavior is to
17# disallow it at parse time.
18# OK bash/dash/mksh stdout: v=None
19# OK bash/dash/mksh status: 0
20# status: 2
21""")
22
23TOKENS1 = list(LineIter(TEST1))
24CASE1 = ParseTestCase(Tokenizer(iter(TOKENS1)))
25
26
27TEST2 = cStringIO.StringIO("""\
28### Multiline test case
29echo one
30echo two
31# status: 1
32# stderr-json: ""
33# STDOUT:
34one
35two
36# OK dash STDOUT:
37dash1
38dash2
39# END
40# OK mksh STDOUT:
41mksh1
42mksh2
43# END
44""")
45TOKENS2 = list(LineIter(TEST2))
46CASE2 = ParseTestCase(Tokenizer(iter(TOKENS2)))
47
48
49class ShSpecTest(unittest.TestCase):
50
51 def testLineIter(self):
52 #pprint.pprint(TOKENS1)
53
54 types = [type_ for line_num, type_, value in TOKENS1]
55 self.assertEqual(
56 [ TEST_CASE_BEGIN, PLAIN_LINE, PLAIN_LINE,
57 KEY_VALUE, KEY_VALUE, KEY_VALUE,
58 EOF], types)
59
60 #pprint.pprint(TOKENS2)
61 types2 = [type_ for line_num, type_, value in TOKENS2]
62 self.assertEqual(
63 [ TEST_CASE_BEGIN, PLAIN_LINE, PLAIN_LINE,
64 KEY_VALUE, KEY_VALUE,
65 KEY_VALUE_MULTILINE, PLAIN_LINE, PLAIN_LINE,
66 KEY_VALUE_MULTILINE, PLAIN_LINE, PLAIN_LINE, END_MULTILINE,
67 KEY_VALUE_MULTILINE, PLAIN_LINE, PLAIN_LINE, END_MULTILINE,
68 EOF], types2)
69
70 def testParsed(self):
71 print('CASE1')
72 pprint.pprint(CASE1)
73 print()
74
75 expected = {'status': '0', 'stdout': 'v=None\n', 'qualifier': 'OK'}
76 self.assertEqual(expected, CASE1['bash'])
77 self.assertEqual(expected, CASE1['dash'])
78 self.assertEqual(expected, CASE1['mksh'])
79 self.assertEqual('2', CASE1['status'])
80 self.assertEqual(
81 'Env binding in readonly/declare disallowed', CASE1['desc'])
82
83 print('CASE2')
84 pprint.pprint(CASE2)
85 print()
86 print(CreateAssertions(CASE2, 'bash'))
87 self.assertEqual('one\ntwo\n', CASE2['stdout'])
88 self.assertEqual(
89 {'qualifier': 'OK', 'stdout': 'dash1\ndash2\n'}, CASE2['dash'])
90 self.assertEqual(
91 {'qualifier': 'OK', 'stdout': 'mksh1\nmksh2\n'}, CASE2['mksh'])
92
93 def testCreateAssertions(self):
94 print(CreateAssertions(CASE1, 'bash'))
95
96 def testRunCases(self):
97 shells = [('bash', '/bin/bash'), ('osh', 'bin/osh')]
98 env = {}
99 out = AnsiOutput(sys.stdout, False)
100 RunCases([CASE1], lambda i, case: True, shells, env, out)
101
102
103if __name__ == '__main__':
104 unittest.main()