1# RUN: %{python} %s 2 3import unittest 4 5from lit.ShUtil import Command, Pipeline, Seq, ShLexer, ShParser 6 7 8class TestShLexer(unittest.TestCase): 9 def lex(self, str, *args, **kwargs): 10 return list(ShLexer(str, *args, **kwargs).lex()) 11 12 def test_basic(self): 13 self.assertEqual(self.lex('a|b>c&d<e;f'), 14 ['a', ('|',), 'b', ('>',), 'c', ('&',), 'd', 15 ('<',), 'e', (';',), 'f']) 16 17 def test_redirection_tokens(self): 18 self.assertEqual(self.lex('a2>c'), 19 ['a2', ('>',), 'c']) 20 self.assertEqual(self.lex('a 2>c'), 21 ['a', ('>',2), 'c']) 22 23 def test_quoting(self): 24 self.assertEqual(self.lex(""" 'a' """), 25 ['a']) 26 self.assertEqual(self.lex(""" "hello\\"world" """), 27 ['hello"world']) 28 self.assertEqual(self.lex(""" "hello\\'world" """), 29 ["hello\\'world"]) 30 self.assertEqual(self.lex(""" "hello\\\\world" """), 31 ["hello\\world"]) 32 self.assertEqual(self.lex(""" he"llo wo"rld """), 33 ["hello world"]) 34 self.assertEqual(self.lex(""" a\\ b a\\\\b """), 35 ["a b", "a\\b"]) 36 self.assertEqual(self.lex(""" "" "" """), 37 ["", ""]) 38 self.assertEqual(self.lex(""" a\\ b """, win32Escapes = True), 39 ['a\\', 'b']) 40 41class TestShParse(unittest.TestCase): 42 def parse(self, str): 43 return ShParser(str).parse() 44 45 def test_basic(self): 46 self.assertEqual(self.parse('echo hello'), 47 Pipeline([Command(['echo', 'hello'], [])], False)) 48 self.assertEqual(self.parse('echo ""'), 49 Pipeline([Command(['echo', ''], [])], False)) 50 self.assertEqual(self.parse("""echo -DFOO='a'"""), 51 Pipeline([Command(['echo', '-DFOO=a'], [])], False)) 52 self.assertEqual(self.parse('echo -DFOO="a"'), 53 Pipeline([Command(['echo', '-DFOO=a'], [])], False)) 54 55 def test_redirection(self): 56 self.assertEqual(self.parse('echo hello > c'), 57 Pipeline([Command(['echo', 'hello'], 58 [((('>'),), 'c')])], False)) 59 self.assertEqual(self.parse('echo hello > c >> d'), 60 Pipeline([Command(['echo', 'hello'], [(('>',), 'c'), 61 (('>>',), 'd')])], False)) 62 self.assertEqual(self.parse('a 2>&1'), 63 Pipeline([Command(['a'], [(('>&',2), '1')])], False)) 64 65 def test_pipeline(self): 66 self.assertEqual(self.parse('a | b'), 67 Pipeline([Command(['a'], []), 68 Command(['b'], [])], 69 False)) 70 71 self.assertEqual(self.parse('a | b | c'), 72 Pipeline([Command(['a'], []), 73 Command(['b'], []), 74 Command(['c'], [])], 75 False)) 76 77 def test_list(self): 78 self.assertEqual(self.parse('a ; b'), 79 Seq(Pipeline([Command(['a'], [])], False), 80 ';', 81 Pipeline([Command(['b'], [])], False))) 82 83 self.assertEqual(self.parse('a & b'), 84 Seq(Pipeline([Command(['a'], [])], False), 85 '&', 86 Pipeline([Command(['b'], [])], False))) 87 88 self.assertEqual(self.parse('a && b'), 89 Seq(Pipeline([Command(['a'], [])], False), 90 '&&', 91 Pipeline([Command(['b'], [])], False))) 92 93 self.assertEqual(self.parse('a || b'), 94 Seq(Pipeline([Command(['a'], [])], False), 95 '||', 96 Pipeline([Command(['b'], [])], False))) 97 98 self.assertEqual(self.parse('a && b || c'), 99 Seq(Seq(Pipeline([Command(['a'], [])], False), 100 '&&', 101 Pipeline([Command(['b'], [])], False)), 102 '||', 103 Pipeline([Command(['c'], [])], False))) 104 105 self.assertEqual(self.parse('a; b'), 106 Seq(Pipeline([Command(['a'], [])], False), 107 ';', 108 Pipeline([Command(['b'], [])], False))) 109 110if __name__ == '__main__': 111 unittest.main() 112 113