/Lib/test/test_pep277.py

http://unladen-swallow.googlecode.com/ · Python · 114 lines · 93 code · 13 blank · 8 comment · 18 complexity · d6397660f489a1480d8c4c8121b7da20 MD5 · raw file

  1. # Test the Unicode versions of normal file functions
  2. # open, os.open, os.stat. os.listdir, os.rename, os.remove, os.mkdir, os.chdir, os.rmdir
  3. import sys, os, unittest
  4. from test import test_support
  5. if not os.path.supports_unicode_filenames:
  6. raise test_support.TestSkipped, "test works only on NT+"
  7. filenames = [
  8. 'abc',
  9. u'ascii',
  10. u'Gr\xfc\xdf-Gott',
  11. u'\u0393\u03b5\u03b9\u03ac-\u03c3\u03b1\u03c2',
  12. u'\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435',
  13. u'\u306b\u307d\u3093',
  14. u'\u05d4\u05e9\u05e7\u05e6\u05e5\u05e1',
  15. u'\u66e8\u66e9\u66eb',
  16. u'\u66e8\u05e9\u3093\u0434\u0393\xdf',
  17. ]
  18. # Destroy directory dirname and all files under it, to one level.
  19. def deltree(dirname):
  20. # Don't hide legitimate errors: if one of these suckers exists, it's
  21. # an error if we can't remove it.
  22. if os.path.exists(dirname):
  23. # must pass unicode to os.listdir() so we get back unicode results.
  24. for fname in os.listdir(unicode(dirname)):
  25. os.unlink(os.path.join(dirname, fname))
  26. os.rmdir(dirname)
  27. class UnicodeFileTests(unittest.TestCase):
  28. files = [os.path.join(test_support.TESTFN, f) for f in filenames]
  29. def setUp(self):
  30. try:
  31. os.mkdir(test_support.TESTFN)
  32. except OSError:
  33. pass
  34. for name in self.files:
  35. f = open(name, 'w')
  36. f.write((name+'\n').encode("utf-8"))
  37. f.close()
  38. os.stat(name)
  39. def tearDown(self):
  40. deltree(test_support.TESTFN)
  41. def _apply_failure(self, fn, filename, expected_exception,
  42. check_fn_in_exception = True):
  43. try:
  44. fn(filename)
  45. raise test_support.TestFailed("Expected to fail calling '%s(%r)'"
  46. % (fn.__name__, filename))
  47. except expected_exception, details:
  48. if check_fn_in_exception and details.filename != filename:
  49. raise test_support.TestFailed("Function '%s(%r) failed with "
  50. "bad filename in the exception: %r"
  51. % (fn.__name__, filename,
  52. details.filename))
  53. def test_failures(self):
  54. # Pass non-existing Unicode filenames all over the place.
  55. for name in self.files:
  56. name = "not_" + name
  57. self._apply_failure(open, name, IOError)
  58. self._apply_failure(os.stat, name, OSError)
  59. self._apply_failure(os.chdir, name, OSError)
  60. self._apply_failure(os.rmdir, name, OSError)
  61. self._apply_failure(os.remove, name, OSError)
  62. # listdir may append a wildcard to the filename, so dont check
  63. self._apply_failure(os.listdir, name, OSError, False)
  64. def test_open(self):
  65. for name in self.files:
  66. f = open(name, 'w')
  67. f.write((name+'\n').encode("utf-8"))
  68. f.close()
  69. os.stat(name)
  70. def test_listdir(self):
  71. f1 = os.listdir(test_support.TESTFN)
  72. f2 = os.listdir(unicode(test_support.TESTFN,
  73. sys.getfilesystemencoding()))
  74. sf2 = set(u"\\".join((unicode(test_support.TESTFN), f))
  75. for f in f2)
  76. self.failUnlessEqual(len(f1), len(self.files))
  77. self.failUnlessEqual(sf2, set(self.files))
  78. def test_rename(self):
  79. for name in self.files:
  80. os.rename(name,"tmp")
  81. os.rename("tmp",name)
  82. def test_directory(self):
  83. dirname = os.path.join(test_support.TESTFN,u'Gr\xfc\xdf-\u66e8\u66e9\u66eb')
  84. filename = u'\xdf-\u66e8\u66e9\u66eb'
  85. oldwd = os.getcwd()
  86. os.mkdir(dirname)
  87. os.chdir(dirname)
  88. f = open(filename, 'w')
  89. f.write((filename + '\n').encode("utf-8"))
  90. f.close()
  91. os.access(filename,os.R_OK)
  92. os.remove(filename)
  93. os.chdir(oldwd)
  94. os.rmdir(dirname)
  95. def test_main():
  96. try:
  97. test_support.run_unittest(UnicodeFileTests)
  98. finally:
  99. deltree(test_support.TESTFN)
  100. if __name__ == "__main__":
  101. test_main()