42
43
a_circle_c = u'\xe5'
44
a_circle_d = u'a\u030a'
44
a_circle_d = u'a\u030a'
45
46
a_dots_d = u'a\u0308'
46
47
z_umlat_c = u'\u017d'
47
48
z_umlat_d = u'Z\u030c'
50
class UnicodeFilename(TestCaseWithTransport):
51
"""Test that UnicodeFilename returns the expected values."""
51
class TestNormalization(TestCase):
52
"""Verify that we have our normalizations correct."""
53
def test_a_circle(self):
54
def test_normalize(self):
54
55
self.assertEqual(a_circle_d, normalize('NFKD', a_circle_c))
55
56
self.assertEqual(a_circle_c, normalize('NFKC', a_circle_d))
57
self.assertEqual((a_circle_c, True), unicode_filename(a_circle_c))
58
if normalizes_filenames():
59
self.assertEqual((a_circle_c, True), unicode_filename(a_circle_d))
57
self.assertEqual(a_dots_d, normalize('NFKD', a_dots_c))
58
self.assertEqual(a_dots_c, normalize('NFKC', a_dots_d))
59
self.assertEqual(z_umlat_d, normalize('NFKD', z_umlat_c))
60
self.assertEqual(z_umlat_c, normalize('NFKC', z_umlat_d))
63
class NormalizedFilename(TestCaseWithTransport):
64
"""Test normalized_filename and associated helpers"""
66
def test__accessible_normalized_filename(self):
67
anf = osutils._accessible_normalized_filename
68
# normalized_filename should allow plain ascii strings
69
# not just unicode strings
70
self.assertEqual((u'ascii', True), anf('ascii'))
71
self.assertEqual((a_circle_c, True), anf(a_circle_c))
72
self.assertEqual((a_circle_c, True), anf(a_circle_d))
73
self.assertEqual((a_dots_c, True), anf(a_dots_c))
74
self.assertEqual((a_dots_c, True), anf(a_dots_d))
75
self.assertEqual((z_umlat_c, True), anf(z_umlat_c))
76
self.assertEqual((z_umlat_c, True), anf(z_umlat_d))
78
def test__inaccessible_normalized_filename(self):
79
inf = osutils._inaccessible_normalized_filename
80
# normalized_filename should allow plain ascii strings
81
# not just unicode strings
82
self.assertEqual((u'ascii', True), inf('ascii'))
83
self.assertEqual((a_circle_c, True), inf(a_circle_c))
84
self.assertEqual((a_circle_c, False), inf(a_circle_d))
85
self.assertEqual((a_dots_c, True), inf(a_dots_c))
86
self.assertEqual((a_dots_c, False), inf(a_dots_d))
87
self.assertEqual((z_umlat_c, True), inf(z_umlat_c))
88
self.assertEqual((z_umlat_c, False), inf(z_umlat_d))
90
def test_functions(self):
91
if osutils.normalizes_filenames():
92
self.assertEqual(osutils.normalized_filename,
93
osutils._accessible_normalized_filename)
61
self.assertEqual((a_circle_d, False), unicode_filename(a_circle_d))
95
self.assertEqual(osutils.normalized_filename,
96
osutils._inaccessible_normalized_filename)
63
98
def test_platform(self):
99
# With FAT32 and certain encodings on win32
100
# a_circle_c and a_dots_c actually map to the same file
101
# adding a suffix kicks in the 'preserving but insensitive'
102
# route, and maintains the right files
103
files = [a_circle_c+'.1', a_dots_c+'.2', z_umlat_c+'.3']
65
self.build_tree([a_circle_c, a_dots_c, z_umlat_c])
105
self.build_tree(files)
66
106
except UnicodeError:
67
107
raise TestSkipped("filesystem cannot create unicode files")
69
109
if sys.platform == 'darwin':
70
expected = sorted([a_circle_d, a_dots_d, z_umlat_d])
110
expected = sorted([a_circle_d+'.1', a_dots_d+'.2', z_umlat_d+'.3'])
72
expected = sorted([a_circle_c, a_dots_c, z_umlat_c])
112
expected = sorted(files)
74
114
present = sorted(os.listdir(u'.'))
75
115
self.assertEqual(expected, present)
77
def test_access(self):
78
# We should always be able to access files by the path returned
79
# from unicode_filename
80
files = [a_circle_c, a_dots_c, z_umlat_c]
117
def test_access_normalized(self):
118
# We should always be able to access files created with
119
# normalized filenames
120
# With FAT32 and certain encodings on win32
121
# a_circle_c and a_dots_c actually map to the same file
122
# adding a suffix kicks in the 'preserving but insensitive'
123
# route, and maintains the right files
124
files = [a_circle_c+'.1', a_dots_c+'.2', z_umlat_c+'.3']
82
126
self.build_tree(files)
83
127
except UnicodeError:
84
128
raise TestSkipped("filesystem cannot create unicode files")
86
130
for fname in files:
87
path = unicode_filename(fname)[0]
88
131
# We should get an exception if we can't open the file at
133
path, can_access = osutils.normalized_filename(fname)
135
self.assertEqual(path, fname)
136
self.assertTrue(can_access)
90
138
f = open(path, 'rb')
141
shouldbe = 'contents of %s%s' % (path.encode('utf8'),
146
self.assertEqual(shouldbe, actual,
147
'contents of %s is incorrect: %r != %r'
148
% (path, shouldbe, actual))
150
def test_access_non_normalized(self):
151
# Sometimes we can access non-normalized files by their normalized
152
# path, verify that normalized_filename returns the right info
153
files = [a_circle_d+'.1', a_dots_d+'.2', z_umlat_d+'.3']
156
self.build_tree(files)
158
raise TestSkipped("filesystem cannot create unicode files")
161
# We should get an exception if we can't open the file at
163
path, can_access = osutils.normalized_filename(fname)
165
self.assertNotEqual(path, fname)
167
# We should always be able to access them from the name
168
# they were created with
169
f = open(fname, 'rb')
172
# And normalized_filename sholud tell us correctly if we can
173
# access them by an alternate name
178
self.assertRaises(IOError, open, path, 'rb')