| 
									
										
										
										
											2003-04-17 21:31:33 +00:00
										 |  |  |  | # -*- coding: iso-8859-1 -*- | 
					
						
							|  |  |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2007-06-12 17:43:43 +00:00
										 |  |  |  | import os, sys, io | 
					
						
							| 
									
										
										
										
											2003-04-17 21:31:33 +00:00
										 |  |  |  | import shlex | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  |  | from test import support | 
					
						
							| 
									
										
										
										
											2003-04-17 23:04:22 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-17 21:31:33 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | # The original test data set was from shellwords, by Hartmut Goebel. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | data = r"""x|x|
 | 
					
						
							|  |  |  |  | foo bar|foo|bar| | 
					
						
							|  |  |  |  |  foo bar|foo|bar| | 
					
						
							|  |  |  |  |  foo bar |foo|bar| | 
					
						
							|  |  |  |  | foo   bar    bla     fasel|foo|bar|bla|fasel| | 
					
						
							|  |  |  |  | x y  z              xxxx|x|y|z|xxxx| | 
					
						
							|  |  |  |  | \x bar|\|x|bar| | 
					
						
							|  |  |  |  | \ x bar|\|x|bar| | 
					
						
							|  |  |  |  | \ bar|\|bar| | 
					
						
							|  |  |  |  | foo \x bar|foo|\|x|bar| | 
					
						
							|  |  |  |  | foo \ x bar|foo|\|x|bar| | 
					
						
							|  |  |  |  | foo \ bar|foo|\|bar| | 
					
						
							|  |  |  |  | foo "bar" bla|foo|"bar"|bla| | 
					
						
							|  |  |  |  | "foo" "bar" "bla"|"foo"|"bar"|"bla"| | 
					
						
							|  |  |  |  | "foo" bar "bla"|"foo"|bar|"bla"| | 
					
						
							|  |  |  |  | "foo" bar bla|"foo"|bar|bla| | 
					
						
							|  |  |  |  | foo 'bar' bla|foo|'bar'|bla| | 
					
						
							|  |  |  |  | 'foo' 'bar' 'bla'|'foo'|'bar'|'bla'| | 
					
						
							|  |  |  |  | 'foo' bar 'bla'|'foo'|bar|'bla'| | 
					
						
							|  |  |  |  | 'foo' bar bla|'foo'|bar|bla| | 
					
						
							|  |  |  |  | blurb foo"bar"bar"fasel" baz|blurb|foo"bar"bar"fasel"|baz| | 
					
						
							|  |  |  |  | blurb foo'bar'bar'fasel' baz|blurb|foo'bar'bar'fasel'|baz| | 
					
						
							|  |  |  |  | ""|""| | 
					
						
							|  |  |  |  | ''|''| | 
					
						
							|  |  |  |  | foo "" bar|foo|""|bar| | 
					
						
							|  |  |  |  | foo '' bar|foo|''|bar| | 
					
						
							|  |  |  |  | foo "" "" "" bar|foo|""|""|""|bar| | 
					
						
							|  |  |  |  | foo '' '' '' bar|foo|''|''|''|bar| | 
					
						
							|  |  |  |  | \""|\|""| | 
					
						
							|  |  |  |  | "\"|"\"| | 
					
						
							|  |  |  |  | "foo\ bar"|"foo\ bar"| | 
					
						
							|  |  |  |  | "foo\\ bar"|"foo\\ bar"| | 
					
						
							|  |  |  |  | "foo\\ bar\"|"foo\\ bar\"| | 
					
						
							|  |  |  |  | "foo\\" bar\""|"foo\\"|bar|\|""| | 
					
						
							|  |  |  |  | "foo\\ bar\" dfadf"|"foo\\ bar\"|dfadf"| | 
					
						
							|  |  |  |  | "foo\\\ bar\" dfadf"|"foo\\\ bar\"|dfadf"| | 
					
						
							|  |  |  |  | "foo\\\x bar\" dfadf"|"foo\\\x bar\"|dfadf"| | 
					
						
							|  |  |  |  | "foo\x bar\" dfadf"|"foo\x bar\"|dfadf"| | 
					
						
							|  |  |  |  | \''|\|''| | 
					
						
							|  |  |  |  | 'foo\ bar'|'foo\ bar'| | 
					
						
							|  |  |  |  | 'foo\\ bar'|'foo\\ bar'| | 
					
						
							|  |  |  |  | "foo\\\x bar\" df'a\ 'df'|"foo\\\x bar\"|df'a|\|'df'| | 
					
						
							|  |  |  |  | \"foo"|\|"foo"| | 
					
						
							|  |  |  |  | \"foo"\x|\|"foo"|\|x| | 
					
						
							|  |  |  |  | "foo\x"|"foo\x"| | 
					
						
							|  |  |  |  | "foo\ "|"foo\ "| | 
					
						
							|  |  |  |  | foo\ xx|foo|\|xx| | 
					
						
							|  |  |  |  | foo\ x\x|foo|\|x|\|x| | 
					
						
							|  |  |  |  | foo\ x\x\""|foo|\|x|\|x|\|""| | 
					
						
							|  |  |  |  | "foo\ x\x"|"foo\ x\x"| | 
					
						
							|  |  |  |  | "foo\ x\x\\"|"foo\ x\x\\"| | 
					
						
							|  |  |  |  | "foo\ x\x\\""foobar"|"foo\ x\x\\"|"foobar"| | 
					
						
							|  |  |  |  | "foo\ x\x\\"\''"foobar"|"foo\ x\x\\"|\|''|"foobar"| | 
					
						
							|  |  |  |  | "foo\ x\x\\"\'"fo'obar"|"foo\ x\x\\"|\|'"fo'|obar"| | 
					
						
							|  |  |  |  | "foo\ x\x\\"\'"fo'obar" 'don'\''t'|"foo\ x\x\\"|\|'"fo'|obar"|'don'|\|''|t'| | 
					
						
							|  |  |  |  | 'foo\ bar'|'foo\ bar'| | 
					
						
							|  |  |  |  | 'foo\\ bar'|'foo\\ bar'| | 
					
						
							|  |  |  |  | foo\ bar|foo|\|bar| | 
					
						
							|  |  |  |  | foo#bar\nbaz|foobaz| | 
					
						
							|  |  |  |  | :-) ;-)|:|-|)|;|-|)| | 
					
						
							|  |  |  |  | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD>|<EFBFBD>|<EFBFBD>|<EFBFBD>|<EFBFBD>| | 
					
						
							|  |  |  |  | """
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | posix_data = r"""x|x|
 | 
					
						
							|  |  |  |  | foo bar|foo|bar| | 
					
						
							|  |  |  |  |  foo bar|foo|bar| | 
					
						
							|  |  |  |  |  foo bar |foo|bar| | 
					
						
							|  |  |  |  | foo   bar    bla     fasel|foo|bar|bla|fasel| | 
					
						
							|  |  |  |  | x y  z              xxxx|x|y|z|xxxx| | 
					
						
							|  |  |  |  | \x bar|x|bar| | 
					
						
							|  |  |  |  | \ x bar| x|bar| | 
					
						
							|  |  |  |  | \ bar| bar| | 
					
						
							|  |  |  |  | foo \x bar|foo|x|bar| | 
					
						
							|  |  |  |  | foo \ x bar|foo| x|bar| | 
					
						
							|  |  |  |  | foo \ bar|foo| bar| | 
					
						
							|  |  |  |  | foo "bar" bla|foo|bar|bla| | 
					
						
							|  |  |  |  | "foo" "bar" "bla"|foo|bar|bla| | 
					
						
							|  |  |  |  | "foo" bar "bla"|foo|bar|bla| | 
					
						
							|  |  |  |  | "foo" bar bla|foo|bar|bla| | 
					
						
							|  |  |  |  | foo 'bar' bla|foo|bar|bla| | 
					
						
							|  |  |  |  | 'foo' 'bar' 'bla'|foo|bar|bla| | 
					
						
							|  |  |  |  | 'foo' bar 'bla'|foo|bar|bla| | 
					
						
							|  |  |  |  | 'foo' bar bla|foo|bar|bla| | 
					
						
							|  |  |  |  | blurb foo"bar"bar"fasel" baz|blurb|foobarbarfasel|baz| | 
					
						
							|  |  |  |  | blurb foo'bar'bar'fasel' baz|blurb|foobarbarfasel|baz| | 
					
						
							|  |  |  |  | ""|| | 
					
						
							|  |  |  |  | ''|| | 
					
						
							|  |  |  |  | foo "" bar|foo||bar| | 
					
						
							|  |  |  |  | foo '' bar|foo||bar| | 
					
						
							|  |  |  |  | foo "" "" "" bar|foo||||bar| | 
					
						
							|  |  |  |  | foo '' '' '' bar|foo||||bar| | 
					
						
							|  |  |  |  | \"|"| | 
					
						
							|  |  |  |  | "\""|"| | 
					
						
							|  |  |  |  | "foo\ bar"|foo\ bar| | 
					
						
							|  |  |  |  | "foo\\ bar"|foo\ bar| | 
					
						
							|  |  |  |  | "foo\\ bar\""|foo\ bar"| | 
					
						
							|  |  |  |  | "foo\\" bar\"|foo\|bar"| | 
					
						
							|  |  |  |  | "foo\\ bar\" dfadf"|foo\ bar" dfadf| | 
					
						
							|  |  |  |  | "foo\\\ bar\" dfadf"|foo\\ bar" dfadf| | 
					
						
							|  |  |  |  | "foo\\\x bar\" dfadf"|foo\\x bar" dfadf| | 
					
						
							|  |  |  |  | "foo\x bar\" dfadf"|foo\x bar" dfadf| | 
					
						
							|  |  |  |  | \'|'| | 
					
						
							|  |  |  |  | 'foo\ bar'|foo\ bar| | 
					
						
							|  |  |  |  | 'foo\\ bar'|foo\\ bar| | 
					
						
							|  |  |  |  | "foo\\\x bar\" df'a\ 'df"|foo\\x bar" df'a\ 'df| | 
					
						
							|  |  |  |  | \"foo|"foo| | 
					
						
							|  |  |  |  | \"foo\x|"foox| | 
					
						
							|  |  |  |  | "foo\x"|foo\x| | 
					
						
							|  |  |  |  | "foo\ "|foo\ | | 
					
						
							|  |  |  |  | foo\ xx|foo xx| | 
					
						
							|  |  |  |  | foo\ x\x|foo xx| | 
					
						
							|  |  |  |  | foo\ x\x\"|foo xx"| | 
					
						
							|  |  |  |  | "foo\ x\x"|foo\ x\x| | 
					
						
							|  |  |  |  | "foo\ x\x\\"|foo\ x\x\| | 
					
						
							|  |  |  |  | "foo\ x\x\\""foobar"|foo\ x\x\foobar| | 
					
						
							|  |  |  |  | "foo\ x\x\\"\'"foobar"|foo\ x\x\'foobar| | 
					
						
							|  |  |  |  | "foo\ x\x\\"\'"fo'obar"|foo\ x\x\'fo'obar| | 
					
						
							|  |  |  |  | "foo\ x\x\\"\'"fo'obar" 'don'\''t'|foo\ x\x\'fo'obar|don't| | 
					
						
							|  |  |  |  | "foo\ x\x\\"\'"fo'obar" 'don'\''t' \\|foo\ x\x\'fo'obar|don't|\| | 
					
						
							|  |  |  |  | 'foo\ bar'|foo\ bar| | 
					
						
							|  |  |  |  | 'foo\\ bar'|foo\\ bar| | 
					
						
							|  |  |  |  | foo\ bar|foo bar| | 
					
						
							|  |  |  |  | foo#bar\nbaz|foo|baz| | 
					
						
							|  |  |  |  | :-) ;-)|:-)|;-)| | 
					
						
							|  |  |  |  | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>| | 
					
						
							|  |  |  |  | """
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | class ShlexTest(unittest.TestCase): | 
					
						
							|  |  |  |  |     def setUp(self): | 
					
						
							|  |  |  |  |         self.data = [x.split("|")[:-1] | 
					
						
							|  |  |  |  |                      for x in data.splitlines()] | 
					
						
							|  |  |  |  |         self.posix_data = [x.split("|")[:-1] | 
					
						
							|  |  |  |  |                            for x in posix_data.splitlines()] | 
					
						
							|  |  |  |  |         for item in self.data: | 
					
						
							|  |  |  |  |             item[0] = item[0].replace(r"\n", "\n") | 
					
						
							|  |  |  |  |         for item in self.posix_data: | 
					
						
							|  |  |  |  |             item[0] = item[0].replace(r"\n", "\n") | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-20 01:57:03 +00:00
										 |  |  |  |     def splitTest(self, data, comments): | 
					
						
							| 
									
										
										
										
											2003-04-17 21:31:33 +00:00
										 |  |  |  |         for i in range(len(data)): | 
					
						
							| 
									
										
										
										
											2003-04-20 01:57:03 +00:00
										 |  |  |  |             l = shlex.split(data[i][0], comments=comments) | 
					
						
							| 
									
										
										
										
											2003-04-17 21:31:33 +00:00
										 |  |  |  |             self.assertEqual(l, data[i][1:], | 
					
						
							|  |  |  |  |                              "%s: %s != %s" % | 
					
						
							|  |  |  |  |                              (data[i][0], l, data[i][1:])) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     def oldSplit(self, s): | 
					
						
							|  |  |  |  |         ret = [] | 
					
						
							| 
									
										
										
										
											2007-06-12 17:43:43 +00:00
										 |  |  |  |         lex = shlex.shlex(io.StringIO(s)) | 
					
						
							| 
									
										
										
										
											2003-04-17 21:31:33 +00:00
										 |  |  |  |         tok = lex.get_token() | 
					
						
							|  |  |  |  |         while tok: | 
					
						
							|  |  |  |  |             ret.append(tok) | 
					
						
							|  |  |  |  |             tok = lex.get_token() | 
					
						
							|  |  |  |  |         return ret | 
					
						
							| 
									
										
										
										
											2003-04-24 16:02:54 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-17 21:31:33 +00:00
										 |  |  |  |     def testSplitPosix(self): | 
					
						
							|  |  |  |  |         """Test data splitting with posix parser""" | 
					
						
							| 
									
										
										
										
											2003-04-24 16:02:54 +00:00
										 |  |  |  |         self.splitTest(self.posix_data, comments=True) | 
					
						
							| 
									
										
										
										
											2003-04-17 21:31:33 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     def testCompat(self): | 
					
						
							|  |  |  |  |         """Test compatibility interface""" | 
					
						
							|  |  |  |  |         for i in range(len(self.data)): | 
					
						
							|  |  |  |  |             l = self.oldSplit(self.data[i][0]) | 
					
						
							|  |  |  |  |             self.assertEqual(l, self.data[i][1:], | 
					
						
							|  |  |  |  |                              "%s: %s != %s" % | 
					
						
							|  |  |  |  |                              (self.data[i][0], l, self.data[i][1:])) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | # Allow this test to be used with old shlex.py | 
					
						
							|  |  |  |  | if not getattr(shlex, "split", None): | 
					
						
							|  |  |  |  |     for methname in dir(ShlexTest): | 
					
						
							|  |  |  |  |         if methname.startswith("test") and methname != "testCompat": | 
					
						
							|  |  |  |  |             delattr(ShlexTest, methname) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-17 23:04:22 +00:00
										 |  |  |  | def test_main(): | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  |  |     support.run_unittest(ShlexTest) | 
					
						
							| 
									
										
										
										
											2003-04-17 23:04:22 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-17 21:31:33 +00:00
										 |  |  |  | if __name__ == "__main__": | 
					
						
							| 
									
										
										
										
											2003-04-17 23:04:22 +00:00
										 |  |  |  |     test_main() |