test_shlex.py 5.2 KB

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