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()
 | 
						|
 |