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