brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · 2904125 Raw
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