146 lines · python
1# RUN: %{python} %s2 3import unittest4 5from lit.ShUtil import Command, Pipeline, Seq, ShLexer, ShParser6 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(14 self.lex("a|b>c&d<e;f"),15 ["a", ("|",), "b", (">",), "c", ("&",), "d", ("<",), "e", (";",), "f"],16 )17 18 def test_redirection_tokens(self):19 self.assertEqual(self.lex("a2>c"), ["a2", (">",), "c"])20 self.assertEqual(self.lex("a 2>c"), ["a", (">", 2), "c"])21 22 def test_quoting(self):23 self.assertEqual(self.lex(""" 'a' """), ["a"])24 self.assertEqual(self.lex(""" "hello\\"world" """), ['hello"world'])25 self.assertEqual(self.lex(""" "hello\\'world" """), ["hello\\'world"])26 self.assertEqual(self.lex(""" "hello\\\\world" """), ["hello\\world"])27 self.assertEqual(self.lex(""" he"llo wo"rld """), ["hello world"])28 self.assertEqual(self.lex(""" a\\ b a\\\\b """), ["a b", "a\\b"])29 self.assertEqual(self.lex(""" "" "" """), ["", ""])30 self.assertEqual(self.lex(""" a\\ b """, win32Escapes=True), ["a\\", "b"])31 self.assertEqual(self.lex('"\\$y = 11"'), ["$y = 11"])32 self.assertEqual(self.lex('"expr \\$y = 11"'), ["expr $y = 11"])33 self.assertEqual(self.lex("'\\$y = 11'"), ["\\$y = 11"])34 self.assertEqual(self.lex("'expr \\$y = 11'"), ["expr \\$y = 11"])35 36class TestShParse(unittest.TestCase):37 def parse(self, str):38 return ShParser(str).parse()39 40 def test_basic(self):41 self.assertEqual(42 self.parse("echo hello"), Pipeline([Command(["echo", "hello"], [])], False)43 )44 self.assertEqual(45 self.parse('echo ""'), Pipeline([Command(["echo", ""], [])], False)46 )47 self.assertEqual(48 self.parse("""echo -DFOO='a'"""),49 Pipeline([Command(["echo", "-DFOO=a"], [])], False),50 )51 self.assertEqual(52 self.parse('echo -DFOO="a"'),53 Pipeline([Command(["echo", "-DFOO=a"], [])], False),54 )55 56 def test_redirection(self):57 self.assertEqual(58 self.parse("echo hello > c"),59 Pipeline([Command(["echo", "hello"], [(((">"),), "c")])], False),60 )61 self.assertEqual(62 self.parse("echo hello > c >> d"),63 Pipeline(64 [Command(["echo", "hello"], [((">",), "c"), ((">>",), "d")])], False65 ),66 )67 self.assertEqual(68 self.parse("a 2>&1"), Pipeline([Command(["a"], [((">&", 2), "1")])], False)69 )70 71 def test_pipeline(self):72 self.assertEqual(73 self.parse("a | b"),74 Pipeline([Command(["a"], []), Command(["b"], [])], False),75 )76 77 self.assertEqual(78 self.parse("a | b | c"),79 Pipeline(80 [Command(["a"], []), Command(["b"], []), Command(["c"], [])], False81 ),82 )83 84 def test_list(self):85 self.assertEqual(86 self.parse("a ; b"),87 Seq(88 Pipeline([Command(["a"], [])], False),89 ";",90 Pipeline([Command(["b"], [])], False),91 ),92 )93 94 self.assertEqual(95 self.parse("a & b"),96 Seq(97 Pipeline([Command(["a"], [])], False),98 "&",99 Pipeline([Command(["b"], [])], False),100 ),101 )102 103 self.assertEqual(104 self.parse("a && b"),105 Seq(106 Pipeline([Command(["a"], [])], False),107 "&&",108 Pipeline([Command(["b"], [])], False),109 ),110 )111 112 self.assertEqual(113 self.parse("a || b"),114 Seq(115 Pipeline([Command(["a"], [])], False),116 "||",117 Pipeline([Command(["b"], [])], False),118 ),119 )120 121 self.assertEqual(122 self.parse("a && b || c"),123 Seq(124 Seq(125 Pipeline([Command(["a"], [])], False),126 "&&",127 Pipeline([Command(["b"], [])], False),128 ),129 "||",130 Pipeline([Command(["c"], [])], False),131 ),132 )133 134 self.assertEqual(135 self.parse("a; b"),136 Seq(137 Pipeline([Command(["a"], [])], False),138 ";",139 Pipeline([Command(["b"], [])], False),140 ),141 )142 143 144if __name__ == "__main__":145 unittest.main()146