|
@@ -0,0 +1,112 @@
|
|
|
+# 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()
|
|
|
+
|