113 lines
4.6 KiB
Python
113 lines
4.6 KiB
Python
|
# RUN: %{python} %s
|
||
|
|
||
|
import unittest
|
||
|
|
||
|
from lit.ShUtil import Command, Pipeline, Seq, ShLexer, ShParser
|
||
|
|
||
|
|
||
|
class TestShLexer(unittest.TestCase):
|
||
|
def lex(self, str, *args, **kwargs):
|
||
|
return list(ShLexer(str, *args, **kwargs).lex())
|
||
|
|
||
|
def test_basic(self):
|
||
|
self.assertEqual(self.lex('a|b>c&d<e;f'),
|
||
|
['a', ('|',), 'b', ('>',), 'c', ('&',), 'd',
|
||
|
('<',), 'e', (';',), 'f'])
|
||
|
|
||
|
def test_redirection_tokens(self):
|
||
|
self.assertEqual(self.lex('a2>c'),
|
||
|
['a2', ('>',), 'c'])
|
||
|
self.assertEqual(self.lex('a 2>c'),
|
||
|
['a', ('>',2), 'c'])
|
||
|
|
||
|
def test_quoting(self):
|
||
|
self.assertEqual(self.lex(""" 'a' """),
|
||
|
['a'])
|
||
|
self.assertEqual(self.lex(""" "hello\\"world" """),
|
||
|
['hello"world'])
|
||
|
self.assertEqual(self.lex(""" "hello\\'world" """),
|
||
|
["hello\\'world"])
|
||
|
self.assertEqual(self.lex(""" "hello\\\\world" """),
|
||
|
["hello\\world"])
|
||
|
self.assertEqual(self.lex(""" he"llo wo"rld """),
|
||
|
["hello world"])
|
||
|
self.assertEqual(self.lex(""" a\\ b a\\\\b """),
|
||
|
["a b", "a\\b"])
|
||
|
self.assertEqual(self.lex(""" "" "" """),
|
||
|
["", ""])
|
||
|
self.assertEqual(self.lex(""" a\\ b """, win32Escapes = True),
|
||
|
['a\\', 'b'])
|
||
|
|
||
|
class TestShParse(unittest.TestCase):
|
||
|
def parse(self, str):
|
||
|
return ShParser(str).parse()
|
||
|
|
||
|
def test_basic(self):
|
||
|
self.assertEqual(self.parse('echo hello'),
|
||
|
Pipeline([Command(['echo', 'hello'], [])], False))
|
||
|
self.assertEqual(self.parse('echo ""'),
|
||
|
Pipeline([Command(['echo', ''], [])], False))
|
||
|
self.assertEqual(self.parse("""echo -DFOO='a'"""),
|
||
|
Pipeline([Command(['echo', '-DFOO=a'], [])], False))
|
||
|
self.assertEqual(self.parse('echo -DFOO="a"'),
|
||
|
Pipeline([Command(['echo', '-DFOO=a'], [])], False))
|
||
|
|
||
|
def test_redirection(self):
|
||
|
self.assertEqual(self.parse('echo hello > c'),
|
||
|
Pipeline([Command(['echo', 'hello'],
|
||
|
[((('>'),), 'c')])], False))
|
||
|
self.assertEqual(self.parse('echo hello > c >> d'),
|
||
|
Pipeline([Command(['echo', 'hello'], [(('>',), 'c'),
|
||
|
(('>>',), 'd')])], False))
|
||
|
self.assertEqual(self.parse('a 2>&1'),
|
||
|
Pipeline([Command(['a'], [(('>&',2), '1')])], False))
|
||
|
|
||
|
def test_pipeline(self):
|
||
|
self.assertEqual(self.parse('a | b'),
|
||
|
Pipeline([Command(['a'], []),
|
||
|
Command(['b'], [])],
|
||
|
False))
|
||
|
|
||
|
self.assertEqual(self.parse('a | b | c'),
|
||
|
Pipeline([Command(['a'], []),
|
||
|
Command(['b'], []),
|
||
|
Command(['c'], [])],
|
||
|
False))
|
||
|
|
||
|
def test_list(self):
|
||
|
self.assertEqual(self.parse('a ; b'),
|
||
|
Seq(Pipeline([Command(['a'], [])], False),
|
||
|
';',
|
||
|
Pipeline([Command(['b'], [])], False)))
|
||
|
|
||
|
self.assertEqual(self.parse('a & b'),
|
||
|
Seq(Pipeline([Command(['a'], [])], False),
|
||
|
'&',
|
||
|
Pipeline([Command(['b'], [])], False)))
|
||
|
|
||
|
self.assertEqual(self.parse('a && b'),
|
||
|
Seq(Pipeline([Command(['a'], [])], False),
|
||
|
'&&',
|
||
|
Pipeline([Command(['b'], [])], False)))
|
||
|
|
||
|
self.assertEqual(self.parse('a || b'),
|
||
|
Seq(Pipeline([Command(['a'], [])], False),
|
||
|
'||',
|
||
|
Pipeline([Command(['b'], [])], False)))
|
||
|
|
||
|
self.assertEqual(self.parse('a && b || c'),
|
||
|
Seq(Seq(Pipeline([Command(['a'], [])], False),
|
||
|
'&&',
|
||
|
Pipeline([Command(['b'], [])], False)),
|
||
|
'||',
|
||
|
Pipeline([Command(['c'], [])], False)))
|
||
|
|
||
|
self.assertEqual(self.parse('a; b'),
|
||
|
Seq(Pipeline([Command(['a'], [])], False),
|
||
|
';',
|
||
|
Pipeline([Command(['b'], [])], False)))
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main()
|
||
|
|