blob: d4463f300481c40766e1921799dd8cb9731367af [file] [log] [blame]
Éric Araujo9bce3112011-07-27 18:29:31 +02001import io
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +00002import shlex
Éric Araujo9bce3112011-07-27 18:29:31 +02003import string
4import unittest
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +00005
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006from test import support
Neal Norwitzaa1ac542003-04-17 23:04:22 +00007
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +00008
9# The original test data set was from shellwords, by Hartmut Goebel.
10
11data = r"""x|x|
12foo bar|foo|bar|
13 foo bar|foo|bar|
14 foo bar |foo|bar|
15foo bar bla fasel|foo|bar|bla|fasel|
16x y z xxxx|x|y|z|xxxx|
17\x bar|\|x|bar|
18\ x bar|\|x|bar|
19\ bar|\|bar|
20foo \x bar|foo|\|x|bar|
21foo \ x bar|foo|\|x|bar|
22foo \ bar|foo|\|bar|
23foo "bar" bla|foo|"bar"|bla|
24"foo" "bar" "bla"|"foo"|"bar"|"bla"|
25"foo" bar "bla"|"foo"|bar|"bla"|
26"foo" bar bla|"foo"|bar|bla|
27foo 'bar' bla|foo|'bar'|bla|
28'foo' 'bar' 'bla'|'foo'|'bar'|'bla'|
29'foo' bar 'bla'|'foo'|bar|'bla'|
30'foo' bar bla|'foo'|bar|bla|
31blurb foo"bar"bar"fasel" baz|blurb|foo"bar"bar"fasel"|baz|
32blurb foo'bar'bar'fasel' baz|blurb|foo'bar'bar'fasel'|baz|
33""|""|
34''|''|
35foo "" bar|foo|""|bar|
36foo '' bar|foo|''|bar|
37foo "" "" "" bar|foo|""|""|""|bar|
38foo '' '' '' bar|foo|''|''|''|bar|
39\""|\|""|
40"\"|"\"|
41"foo\ bar"|"foo\ bar"|
42"foo\\ bar"|"foo\\ bar"|
43"foo\\ bar\"|"foo\\ bar\"|
44"foo\\" bar\""|"foo\\"|bar|\|""|
45"foo\\ bar\" dfadf"|"foo\\ bar\"|dfadf"|
46"foo\\\ bar\" dfadf"|"foo\\\ bar\"|dfadf"|
47"foo\\\x bar\" dfadf"|"foo\\\x bar\"|dfadf"|
48"foo\x bar\" dfadf"|"foo\x bar\"|dfadf"|
49\''|\|''|
50'foo\ bar'|'foo\ bar'|
51'foo\\ bar'|'foo\\ bar'|
52"foo\\\x bar\" df'a\ 'df'|"foo\\\x bar\"|df'a|\|'df'|
53\"foo"|\|"foo"|
54\"foo"\x|\|"foo"|\|x|
55"foo\x"|"foo\x"|
56"foo\ "|"foo\ "|
57foo\ xx|foo|\|xx|
58foo\ x\x|foo|\|x|\|x|
59foo\ x\x\""|foo|\|x|\|x|\|""|
60"foo\ x\x"|"foo\ x\x"|
61"foo\ x\x\\"|"foo\ x\x\\"|
62"foo\ x\x\\""foobar"|"foo\ x\x\\"|"foobar"|
63"foo\ x\x\\"\''"foobar"|"foo\ x\x\\"|\|''|"foobar"|
64"foo\ x\x\\"\'"fo'obar"|"foo\ x\x\\"|\|'"fo'|obar"|
65"foo\ x\x\\"\'"fo'obar" 'don'\''t'|"foo\ x\x\\"|\|'"fo'|obar"|'don'|\|''|t'|
66'foo\ bar'|'foo\ bar'|
67'foo\\ bar'|'foo\\ bar'|
68foo\ bar|foo|\|bar|
69foo#bar\nbaz|foobaz|
70:-) ;-)|:|-|)|;|-|)|
Antoine Pitroud72402e2010-10-27 18:52:48 +000071áéíóú|á|é|í|ó|ú|
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +000072"""
73
74posix_data = r"""x|x|
75foo bar|foo|bar|
76 foo bar|foo|bar|
77 foo bar |foo|bar|
78foo bar bla fasel|foo|bar|bla|fasel|
79x y z xxxx|x|y|z|xxxx|
80\x bar|x|bar|
81\ x bar| x|bar|
82\ bar| bar|
83foo \x bar|foo|x|bar|
84foo \ x bar|foo| x|bar|
85foo \ bar|foo| bar|
86foo "bar" bla|foo|bar|bla|
87"foo" "bar" "bla"|foo|bar|bla|
88"foo" bar "bla"|foo|bar|bla|
89"foo" bar bla|foo|bar|bla|
90foo 'bar' bla|foo|bar|bla|
91'foo' 'bar' 'bla'|foo|bar|bla|
92'foo' bar 'bla'|foo|bar|bla|
93'foo' bar bla|foo|bar|bla|
94blurb foo"bar"bar"fasel" baz|blurb|foobarbarfasel|baz|
95blurb foo'bar'bar'fasel' baz|blurb|foobarbarfasel|baz|
96""||
97''||
98foo "" bar|foo||bar|
99foo '' bar|foo||bar|
100foo "" "" "" bar|foo||||bar|
101foo '' '' '' bar|foo||||bar|
102\"|"|
103"\""|"|
104"foo\ bar"|foo\ bar|
105"foo\\ bar"|foo\ bar|
106"foo\\ bar\""|foo\ bar"|
107"foo\\" bar\"|foo\|bar"|
108"foo\\ bar\" dfadf"|foo\ bar" dfadf|
109"foo\\\ bar\" dfadf"|foo\\ bar" dfadf|
110"foo\\\x bar\" dfadf"|foo\\x bar" dfadf|
111"foo\x bar\" dfadf"|foo\x bar" dfadf|
112\'|'|
113'foo\ bar'|foo\ bar|
114'foo\\ bar'|foo\\ bar|
115"foo\\\x bar\" df'a\ 'df"|foo\\x bar" df'a\ 'df|
116\"foo|"foo|
117\"foo\x|"foox|
118"foo\x"|foo\x|
119"foo\ "|foo\ |
120foo\ xx|foo xx|
121foo\ x\x|foo xx|
122foo\ x\x\"|foo xx"|
123"foo\ x\x"|foo\ x\x|
124"foo\ x\x\\"|foo\ x\x\|
125"foo\ x\x\\""foobar"|foo\ x\x\foobar|
126"foo\ x\x\\"\'"foobar"|foo\ x\x\'foobar|
127"foo\ x\x\\"\'"fo'obar"|foo\ x\x\'fo'obar|
128"foo\ x\x\\"\'"fo'obar" 'don'\''t'|foo\ x\x\'fo'obar|don't|
129"foo\ x\x\\"\'"fo'obar" 'don'\''t' \\|foo\ x\x\'fo'obar|don't|\|
130'foo\ bar'|foo\ bar|
131'foo\\ bar'|foo\\ bar|
132foo\ bar|foo bar|
133foo#bar\nbaz|foo|baz|
134:-) ;-)|:-)|;-)|
Antoine Pitroud72402e2010-10-27 18:52:48 +0000135áéíóú|áéíóú|
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +0000136"""
137
138class ShlexTest(unittest.TestCase):
139 def setUp(self):
140 self.data = [x.split("|")[:-1]
141 for x in data.splitlines()]
142 self.posix_data = [x.split("|")[:-1]
143 for x in posix_data.splitlines()]
144 for item in self.data:
145 item[0] = item[0].replace(r"\n", "\n")
146 for item in self.posix_data:
147 item[0] = item[0].replace(r"\n", "\n")
148
Gustavo Niemeyer48f3dcc2003-04-20 01:57:03 +0000149 def splitTest(self, data, comments):
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +0000150 for i in range(len(data)):
Gustavo Niemeyer48f3dcc2003-04-20 01:57:03 +0000151 l = shlex.split(data[i][0], comments=comments)
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +0000152 self.assertEqual(l, data[i][1:],
153 "%s: %s != %s" %
154 (data[i][0], l, data[i][1:]))
155
156 def oldSplit(self, s):
157 ret = []
Walter Dörwald2c849f22007-06-12 17:43:43 +0000158 lex = shlex.shlex(io.StringIO(s))
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +0000159 tok = lex.get_token()
160 while tok:
161 ret.append(tok)
162 tok = lex.get_token()
163 return ret
Tim Peters0eadaac2003-04-24 16:02:54 +0000164
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +0000165 def testSplitPosix(self):
166 """Test data splitting with posix parser"""
Tim Peters0eadaac2003-04-24 16:02:54 +0000167 self.splitTest(self.posix_data, comments=True)
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +0000168
169 def testCompat(self):
170 """Test compatibility interface"""
171 for i in range(len(self.data)):
172 l = self.oldSplit(self.data[i][0])
173 self.assertEqual(l, self.data[i][1:],
174 "%s: %s != %s" %
175 (self.data[i][0], l, self.data[i][1:]))
176
Éric Araujo9bce3112011-07-27 18:29:31 +0200177 def testQuote(self):
178 safeunquoted = string.ascii_letters + string.digits + '@%_-+=:,./'
Éric Araujo7fc03942011-08-09 23:18:06 +0200179 unicode_sample = '\xe9\xe0\xdf' # e + acute accent, a + grave, sharp s
180 unsafe = '"`$\\!' + unicode_sample
Éric Araujo9bce3112011-07-27 18:29:31 +0200181
182 self.assertEqual(shlex.quote(''), "''")
183 self.assertEqual(shlex.quote(safeunquoted), safeunquoted)
184 self.assertEqual(shlex.quote('test file name'), "'test file name'")
185 for u in unsafe:
186 self.assertEqual(shlex.quote('test%sname' % u),
187 "'test%sname'" % u)
188 for u in unsafe:
189 self.assertEqual(shlex.quote("test%s'name'" % u),
190 "'test%s'\"'\"'name'\"'\"''" % u)
191
192
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +0000193# Allow this test to be used with old shlex.py
194if not getattr(shlex, "split", None):
195 for methname in dir(ShlexTest):
196 if methname.startswith("test") and methname != "testCompat":
197 delattr(ShlexTest, methname)
198
Neal Norwitzaa1ac542003-04-17 23:04:22 +0000199def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000200 support.run_unittest(ShlexTest)
Neal Norwitzaa1ac542003-04-17 23:04:22 +0000201
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +0000202if __name__ == "__main__":
Neal Norwitzaa1ac542003-04-17 23:04:22 +0000203 test_main()