forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			113 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
| # 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()
 | |
| 
 |