| # 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() | |