blob: f8ef88c9420d4646057a341de5bb253fd35106c3 [file] [log] [blame]
Gustavo Niemeyer68d8cef2003-04-17 21:31:33 +00001# -*- coding: iso-8859-1 -*-
2import unittest
3import os, sys
4import shlex
5
6try:
7 from cStringIO import StringIO
8except ImportError:
9 from StringIO import StringIO
10
11
12# The original test data set was from shellwords, by Hartmut Goebel.
13
14data = r"""x|x|
15foo bar|foo|bar|
16 foo bar|foo|bar|
17 foo bar |foo|bar|
18foo bar bla fasel|foo|bar|bla|fasel|
19x y z xxxx|x|y|z|xxxx|
20\x bar|\|x|bar|
21\ x bar|\|x|bar|
22\ bar|\|bar|
23foo \x bar|foo|\|x|bar|
24foo \ x bar|foo|\|x|bar|
25foo \ bar|foo|\|bar|
26foo "bar" bla|foo|"bar"|bla|
27"foo" "bar" "bla"|"foo"|"bar"|"bla"|
28"foo" bar "bla"|"foo"|bar|"bla"|
29"foo" bar bla|"foo"|bar|bla|
30foo 'bar' bla|foo|'bar'|bla|
31'foo' 'bar' 'bla'|'foo'|'bar'|'bla'|
32'foo' bar 'bla'|'foo'|bar|'bla'|
33'foo' bar bla|'foo'|bar|bla|
34blurb foo"bar"bar"fasel" baz|blurb|foo"bar"bar"fasel"|baz|
35blurb foo'bar'bar'fasel' baz|blurb|foo'bar'bar'fasel'|baz|
36""|""|
37''|''|
38foo "" bar|foo|""|bar|
39foo '' bar|foo|''|bar|
40foo "" "" "" bar|foo|""|""|""|bar|
41foo '' '' '' bar|foo|''|''|''|bar|
42\""|\|""|
43"\"|"\"|
44"foo\ bar"|"foo\ bar"|
45"foo\\ bar"|"foo\\ bar"|
46"foo\\ bar\"|"foo\\ bar\"|
47"foo\\" bar\""|"foo\\"|bar|\|""|
48"foo\\ bar\" dfadf"|"foo\\ bar\"|dfadf"|
49"foo\\\ bar\" dfadf"|"foo\\\ bar\"|dfadf"|
50"foo\\\x bar\" dfadf"|"foo\\\x bar\"|dfadf"|
51"foo\x bar\" dfadf"|"foo\x bar\"|dfadf"|
52\''|\|''|
53'foo\ bar'|'foo\ bar'|
54'foo\\ bar'|'foo\\ bar'|
55"foo\\\x bar\" df'a\ 'df'|"foo\\\x bar\"|df'a|\|'df'|
56\"foo"|\|"foo"|
57\"foo"\x|\|"foo"|\|x|
58"foo\x"|"foo\x"|
59"foo\ "|"foo\ "|
60foo\ xx|foo|\|xx|
61foo\ x\x|foo|\|x|\|x|
62foo\ x\x\""|foo|\|x|\|x|\|""|
63"foo\ x\x"|"foo\ x\x"|
64"foo\ x\x\\"|"foo\ x\x\\"|
65"foo\ x\x\\""foobar"|"foo\ x\x\\"|"foobar"|
66"foo\ x\x\\"\''"foobar"|"foo\ x\x\\"|\|''|"foobar"|
67"foo\ x\x\\"\'"fo'obar"|"foo\ x\x\\"|\|'"fo'|obar"|
68"foo\ x\x\\"\'"fo'obar" 'don'\''t'|"foo\ x\x\\"|\|'"fo'|obar"|'don'|\|''|t'|
69'foo\ bar'|'foo\ bar'|
70'foo\\ bar'|'foo\\ bar'|
71foo\ bar|foo|\|bar|
72foo#bar\nbaz|foobaz|
73:-) ;-)|:|-|)|;|-|)|
74áéíóú|á|é|í|ó|ú|
75"""
76
77posix_data = r"""x|x|
78foo bar|foo|bar|
79 foo bar|foo|bar|
80 foo bar |foo|bar|
81foo bar bla fasel|foo|bar|bla|fasel|
82x y z xxxx|x|y|z|xxxx|
83\x bar|x|bar|
84\ x bar| x|bar|
85\ bar| bar|
86foo \x bar|foo|x|bar|
87foo \ x bar|foo| x|bar|
88foo \ bar|foo| bar|
89foo "bar" bla|foo|bar|bla|
90"foo" "bar" "bla"|foo|bar|bla|
91"foo" bar "bla"|foo|bar|bla|
92"foo" bar bla|foo|bar|bla|
93foo 'bar' bla|foo|bar|bla|
94'foo' 'bar' 'bla'|foo|bar|bla|
95'foo' bar 'bla'|foo|bar|bla|
96'foo' bar bla|foo|bar|bla|
97blurb foo"bar"bar"fasel" baz|blurb|foobarbarfasel|baz|
98blurb foo'bar'bar'fasel' baz|blurb|foobarbarfasel|baz|
99""||
100''||
101foo "" bar|foo||bar|
102foo '' bar|foo||bar|
103foo "" "" "" bar|foo||||bar|
104foo '' '' '' bar|foo||||bar|
105\"|"|
106"\""|"|
107"foo\ bar"|foo\ bar|
108"foo\\ bar"|foo\ bar|
109"foo\\ bar\""|foo\ bar"|
110"foo\\" bar\"|foo\|bar"|
111"foo\\ bar\" dfadf"|foo\ bar" dfadf|
112"foo\\\ bar\" dfadf"|foo\\ bar" dfadf|
113"foo\\\x bar\" dfadf"|foo\\x bar" dfadf|
114"foo\x bar\" dfadf"|foo\x bar" dfadf|
115\'|'|
116'foo\ bar'|foo\ bar|
117'foo\\ bar'|foo\\ bar|
118"foo\\\x bar\" df'a\ 'df"|foo\\x bar" df'a\ 'df|
119\"foo|"foo|
120\"foo\x|"foox|
121"foo\x"|foo\x|
122"foo\ "|foo\ |
123foo\ xx|foo xx|
124foo\ x\x|foo xx|
125foo\ x\x\"|foo xx"|
126"foo\ x\x"|foo\ x\x|
127"foo\ x\x\\"|foo\ x\x\|
128"foo\ x\x\\""foobar"|foo\ x\x\foobar|
129"foo\ x\x\\"\'"foobar"|foo\ x\x\'foobar|
130"foo\ x\x\\"\'"fo'obar"|foo\ x\x\'fo'obar|
131"foo\ x\x\\"\'"fo'obar" 'don'\''t'|foo\ x\x\'fo'obar|don't|
132"foo\ x\x\\"\'"fo'obar" 'don'\''t' \\|foo\ x\x\'fo'obar|don't|\|
133'foo\ bar'|foo\ bar|
134'foo\\ bar'|foo\\ bar|
135foo\ bar|foo bar|
136foo#bar\nbaz|foo|baz|
137:-) ;-)|:-)|;-)|
138áéíóú|áéíóú|
139"""
140
141class ShlexTest(unittest.TestCase):
142 def setUp(self):
143 self.data = [x.split("|")[:-1]
144 for x in data.splitlines()]
145 self.posix_data = [x.split("|")[:-1]
146 for x in posix_data.splitlines()]
147 for item in self.data:
148 item[0] = item[0].replace(r"\n", "\n")
149 for item in self.posix_data:
150 item[0] = item[0].replace(r"\n", "\n")
151
152 def splitTest(self, data, posix, spaces):
153 for i in range(len(data)):
154 l = shlex.split(data[i][0], posix=posix, spaces=spaces)
155 self.assertEqual(l, data[i][1:],
156 "%s: %s != %s" %
157 (data[i][0], l, data[i][1:]))
158
159 def oldSplit(self, s):
160 ret = []
161 lex = shlex.shlex(StringIO(s))
162 tok = lex.get_token()
163 while tok:
164 ret.append(tok)
165 tok = lex.get_token()
166 return ret
167
168 def testSplit(self):
169 """Test data splitting with non-posix parser"""
170 self.splitTest(self.data, posix=0, spaces=0)
171
172 def testSplitPosix(self):
173 """Test data splitting with posix parser"""
174 self.splitTest(self.posix_data, posix=1, spaces=1)
175
176 def testCompat(self):
177 """Test compatibility interface"""
178 for i in range(len(self.data)):
179 l = self.oldSplit(self.data[i][0])
180 self.assertEqual(l, self.data[i][1:],
181 "%s: %s != %s" %
182 (self.data[i][0], l, self.data[i][1:]))
183
184# Allow this test to be used with old shlex.py
185if not getattr(shlex, "split", None):
186 for methname in dir(ShlexTest):
187 if methname.startswith("test") and methname != "testCompat":
188 delattr(ShlexTest, methname)
189
190if __name__ == "__main__":
191 unittest.main()