1
# Copyright (C) 2005, 2006, 2008, 2009, 2011 Canonical Ltd
1
# Copyright (C) 2005 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
"""Test that various operations work in a non-ASCII environment."""
23
23
from bzrlib import osutils
24
24
from bzrlib.osutils import pathjoin
25
25
from bzrlib.tests import TestCase, TestCaseWithTransport, TestSkipped
26
from bzrlib.workingtree import WorkingTree
28
29
class NonAsciiTest(TestCaseWithTransport):
35
36
except UnicodeEncodeError:
36
37
raise TestSkipped("filesystem can't accomodate nonascii names")
38
with file(pathjoin(br_dir, "a"), "w") as f: f.write("hello")
39
file(pathjoin(br_dir, "a"), "w").write("hello")
39
40
wt.add(["a"], ["a-id"])
45
46
a_dots_d = u'a\u0308'
46
47
z_umlat_c = u'\u017d'
47
48
z_umlat_d = u'Z\u030c'
48
squared_c = u'\xbc' # This gets mapped to '2' if we use NFK[CD]
50
quarter_c = u'\xb2' # Gets mapped to u'1\u20444' (1/4) if we use NFK[CD]
54
51
class TestNormalization(TestCase):
55
52
"""Verify that we have our normalizations correct."""
57
54
def test_normalize(self):
58
self.assertEqual(a_circle_d, normalize('NFD', a_circle_c))
59
self.assertEqual(a_circle_c, normalize('NFC', a_circle_d))
60
self.assertEqual(a_dots_d, normalize('NFD', a_dots_c))
61
self.assertEqual(a_dots_c, normalize('NFC', a_dots_d))
62
self.assertEqual(z_umlat_d, normalize('NFD', z_umlat_c))
63
self.assertEqual(z_umlat_c, normalize('NFC', z_umlat_d))
64
self.assertEqual(squared_d, normalize('NFC', squared_c))
65
self.assertEqual(squared_c, normalize('NFD', squared_d))
66
self.assertEqual(quarter_d, normalize('NFC', quarter_c))
67
self.assertEqual(quarter_c, normalize('NFD', quarter_d))
55
self.assertEqual(a_circle_d, normalize('NFKD', a_circle_c))
56
self.assertEqual(a_circle_c, normalize('NFKC', 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))
70
63
class NormalizedFilename(TestCaseWithTransport):
81
74
self.assertEqual((a_dots_c, True), anf(a_dots_d))
82
75
self.assertEqual((z_umlat_c, True), anf(z_umlat_c))
83
76
self.assertEqual((z_umlat_c, True), anf(z_umlat_d))
84
self.assertEqual((squared_c, True), anf(squared_c))
85
self.assertEqual((squared_c, True), anf(squared_d))
86
self.assertEqual((quarter_c, True), anf(quarter_c))
87
self.assertEqual((quarter_c, True), anf(quarter_d))
89
78
def test__inaccessible_normalized_filename(self):
90
79
inf = osutils._inaccessible_normalized_filename
97
86
self.assertEqual((a_dots_c, False), inf(a_dots_d))
98
87
self.assertEqual((z_umlat_c, True), inf(z_umlat_c))
99
88
self.assertEqual((z_umlat_c, False), inf(z_umlat_d))
100
self.assertEqual((squared_c, True), inf(squared_c))
101
self.assertEqual((squared_c, True), inf(squared_d))
102
self.assertEqual((quarter_c, True), inf(quarter_c))
103
self.assertEqual((quarter_c, True), inf(quarter_d))
105
90
def test_functions(self):
106
91
if osutils.normalizes_filenames():
130
115
self.assertEqual(expected, present)
132
117
def test_access_normalized(self):
133
# We should always be able to access files created with
118
# We should always be able to access files created with
134
119
# normalized filenames
135
120
# With FAT32 and certain encodings on win32
136
121
# a_circle_c and a_dots_c actually map to the same file
137
122
# adding a suffix kicks in the 'preserving but insensitive'
138
123
# route, and maintains the right files
139
files = [a_circle_c+'.1', a_dots_c+'.2', z_umlat_c+'.3',
140
squared_c+'.4', quarter_c+'.5']
124
files = [a_circle_c+'.1', a_dots_c+'.2', z_umlat_c+'.3']
142
126
self.build_tree(files, line_endings='native')
143
127
except UnicodeError:
159
143
actual = f.read()
162
self.assertEqual(shouldbe, actual,
146
self.assertEqual(shouldbe, actual,
163
147
'contents of %r is incorrect: %r != %r'
164
148
% (path, shouldbe, actual))