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