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