1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
12 var upperTest
= []rune
{
36 var notupperTest
= []rune
{
49 var letterTest
= []rune
{
85 var notletterTest
= []rune
{
96 // Contains all the special cased Latin-1 chars.
97 var spaceTest
= []rune
{
115 var caseTest
= []caseT
{
119 {UpperCase
, 1 << 30, 1 << 30},
121 // ASCII (special-cased so test carefully)
122 {UpperCase
, '\n', '\n'},
123 {UpperCase
, 'a', 'A'},
124 {UpperCase
, 'A', 'A'},
125 {UpperCase
, '7', '7'},
126 {LowerCase
, '\n', '\n'},
127 {LowerCase
, 'a', 'a'},
128 {LowerCase
, 'A', 'a'},
129 {LowerCase
, '7', '7'},
130 {TitleCase
, '\n', '\n'},
131 {TitleCase
, 'a', 'A'},
132 {TitleCase
, 'A', 'A'},
133 {TitleCase
, '7', '7'},
135 // Latin-1: easy to read the tests!
136 {UpperCase
, 0x80, 0x80},
137 {UpperCase
, 'Å', 'Å'},
138 {UpperCase
, 'å', 'Å'},
139 {LowerCase
, 0x80, 0x80},
140 {LowerCase
, 'Å', 'å'},
141 {LowerCase
, 'å', 'å'},
142 {TitleCase
, 0x80, 0x80},
143 {TitleCase
, 'Å', 'Å'},
144 {TitleCase
, 'å', 'Å'},
146 // 0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049
147 {UpperCase
, 0x0131, 'I'},
148 {LowerCase
, 0x0131, 0x0131},
149 {TitleCase
, 0x0131, 'I'},
151 // 0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132
152 {UpperCase
, 0x0133, 0x0132},
153 {LowerCase
, 0x0133, 0x0133},
154 {TitleCase
, 0x0133, 0x0132},
156 // 212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B;
157 {UpperCase
, 0x212A, 0x212A},
158 {LowerCase
, 0x212A, 'k'},
159 {TitleCase
, 0x212A, 0x212A},
161 // From an UpperLower sequence
162 // A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641;
163 {UpperCase
, 0xA640, 0xA640},
164 {LowerCase
, 0xA640, 0xA641},
165 {TitleCase
, 0xA640, 0xA640},
166 // A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640
167 {UpperCase
, 0xA641, 0xA640},
168 {LowerCase
, 0xA641, 0xA641},
169 {TitleCase
, 0xA641, 0xA640},
170 // A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F;
171 {UpperCase
, 0xA64E, 0xA64E},
172 {LowerCase
, 0xA64E, 0xA64F},
173 {TitleCase
, 0xA64E, 0xA64E},
174 // A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E
175 {UpperCase
, 0xA65F, 0xA65E},
176 {LowerCase
, 0xA65F, 0xA65F},
177 {TitleCase
, 0xA65F, 0xA65E},
179 // From another UpperLower sequence
180 // 0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A;
181 {UpperCase
, 0x0139, 0x0139},
182 {LowerCase
, 0x0139, 0x013A},
183 {TitleCase
, 0x0139, 0x0139},
184 // 013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140;
185 {UpperCase
, 0x013f, 0x013f},
186 {LowerCase
, 0x013f, 0x0140},
187 {TitleCase
, 0x013f, 0x013f},
188 // 0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147
189 {UpperCase
, 0x0148, 0x0147},
190 {LowerCase
, 0x0148, 0x0148},
191 {TitleCase
, 0x0148, 0x0147},
193 // Last block in the 5.1.0 table
194 // 10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428;
195 {UpperCase
, 0x10400, 0x10400},
196 {LowerCase
, 0x10400, 0x10428},
197 {TitleCase
, 0x10400, 0x10400},
198 // 10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F;
199 {UpperCase
, 0x10427, 0x10427},
200 {LowerCase
, 0x10427, 0x1044F},
201 {TitleCase
, 0x10427, 0x10427},
202 // 10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400
203 {UpperCase
, 0x10428, 0x10400},
204 {LowerCase
, 0x10428, 0x10428},
205 {TitleCase
, 0x10428, 0x10400},
206 // 1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427
207 {UpperCase
, 0x1044F, 0x10427},
208 {LowerCase
, 0x1044F, 0x1044F},
209 {TitleCase
, 0x1044F, 0x10427},
211 // First one not in the 5.1.0 table
212 // 10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;;
213 {UpperCase
, 0x10450, 0x10450},
214 {LowerCase
, 0x10450, 0x10450},
215 {TitleCase
, 0x10450, 0x10450},
217 // Non-letters with case.
218 {LowerCase
, 0x2161, 0x2171},
219 {UpperCase
, 0x0345, 0x0399},
222 func TestIsLetter(t
*testing
.T
) {
223 for _
, r
:= range upperTest
{
225 t
.Errorf("IsLetter(U+%04X) = false, want true", r
)
228 for _
, r
:= range letterTest
{
230 t
.Errorf("IsLetter(U+%04X) = false, want true", r
)
233 for _
, r
:= range notletterTest
{
235 t
.Errorf("IsLetter(U+%04X) = true, want false", r
)
240 func TestIsUpper(t
*testing
.T
) {
241 for _
, r
:= range upperTest
{
243 t
.Errorf("IsUpper(U+%04X) = false, want true", r
)
246 for _
, r
:= range notupperTest
{
248 t
.Errorf("IsUpper(U+%04X) = true, want false", r
)
251 for _
, r
:= range notletterTest
{
253 t
.Errorf("IsUpper(U+%04X) = true, want false", r
)
258 func caseString(c
int) string {
270 func TestTo(t
*testing
.T
) {
271 for _
, c
:= range caseTest
{
274 t
.Errorf("To(U+%04X, %s) = U+%04X want U+%04X", c
.in
, caseString(c
.cas
), r
, c
.out
)
279 func TestToUpperCase(t
*testing
.T
) {
280 for _
, c
:= range caseTest
{
281 if c
.cas
!= UpperCase
{
286 t
.Errorf("ToUpper(U+%04X) = U+%04X want U+%04X", c
.in
, r
, c
.out
)
291 func TestToLowerCase(t
*testing
.T
) {
292 for _
, c
:= range caseTest
{
293 if c
.cas
!= LowerCase
{
298 t
.Errorf("ToLower(U+%04X) = U+%04X want U+%04X", c
.in
, r
, c
.out
)
303 func TestToTitleCase(t
*testing
.T
) {
304 for _
, c
:= range caseTest
{
305 if c
.cas
!= TitleCase
{
310 t
.Errorf("ToTitle(U+%04X) = U+%04X want U+%04X", c
.in
, r
, c
.out
)
315 func TestIsSpace(t
*testing
.T
) {
316 for _
, c
:= range spaceTest
{
318 t
.Errorf("IsSpace(U+%04X) = false; want true", c
)
321 for _
, c
:= range letterTest
{
323 t
.Errorf("IsSpace(U+%04X) = true; want false", c
)
328 // Check that the optimizations for IsLetter etc. agree with the tables.
329 // We only need to check the Latin-1 range.
330 func TestLetterOptimizations(t
*testing
.T
) {
331 for i
:= rune(0); i
<= MaxLatin1
; i
++ {
332 if Is(Letter
, i
) != IsLetter(i
) {
333 t
.Errorf("IsLetter(U+%04X) disagrees with Is(Letter)", i
)
335 if Is(Upper
, i
) != IsUpper(i
) {
336 t
.Errorf("IsUpper(U+%04X) disagrees with Is(Upper)", i
)
338 if Is(Lower
, i
) != IsLower(i
) {
339 t
.Errorf("IsLower(U+%04X) disagrees with Is(Lower)", i
)
341 if Is(Title
, i
) != IsTitle(i
) {
342 t
.Errorf("IsTitle(U+%04X) disagrees with Is(Title)", i
)
344 if Is(White_Space
, i
) != IsSpace(i
) {
345 t
.Errorf("IsSpace(U+%04X) disagrees with Is(White_Space)", i
)
347 if To(UpperCase
, i
) != ToUpper(i
) {
348 t
.Errorf("ToUpper(U+%04X) disagrees with To(Upper)", i
)
350 if To(LowerCase
, i
) != ToLower(i
) {
351 t
.Errorf("ToLower(U+%04X) disagrees with To(Lower)", i
)
353 if To(TitleCase
, i
) != ToTitle(i
) {
354 t
.Errorf("ToTitle(U+%04X) disagrees with To(Title)", i
)
359 func TestTurkishCase(t
*testing
.T
) {
360 lower
:= []rune("abcçdefgğhıijklmnoöprsştuüvyz")
361 upper
:= []rune("ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ")
362 for i
, l
:= range lower
{
364 if TurkishCase
.ToLower(l
) != l
{
365 t
.Errorf("lower(U+%04X) is U+%04X not U+%04X", l
, TurkishCase
.ToLower(l
), l
)
367 if TurkishCase
.ToUpper(u
) != u
{
368 t
.Errorf("upper(U+%04X) is U+%04X not U+%04X", u
, TurkishCase
.ToUpper(u
), u
)
370 if TurkishCase
.ToUpper(l
) != u
{
371 t
.Errorf("upper(U+%04X) is U+%04X not U+%04X", l
, TurkishCase
.ToUpper(l
), u
)
373 if TurkishCase
.ToLower(u
) != l
{
374 t
.Errorf("lower(U+%04X) is U+%04X not U+%04X", u
, TurkishCase
.ToLower(l
), l
)
376 if TurkishCase
.ToTitle(u
) != u
{
377 t
.Errorf("title(U+%04X) is U+%04X not U+%04X", u
, TurkishCase
.ToTitle(u
), u
)
379 if TurkishCase
.ToTitle(l
) != u
{
380 t
.Errorf("title(U+%04X) is U+%04X not U+%04X", l
, TurkishCase
.ToTitle(l
), u
)
385 var simpleFoldTests
= []string{
386 // SimpleFold could order its returned slices in any order it wants,
387 // but we know it orders them in increasing order starting at in
388 // and looping around from MaxRune to 0.
396 // ASCII special cases.
404 // Non-ASCII special cases.
413 // Extra special cases: has lower/upper but no case fold.
418 func TestSimpleFold(t
*testing
.T
) {
419 for _
, tt
:= range simpleFoldTests
{
421 r
:= cycle
[len(cycle
)-1]
422 for _
, out
:= range cycle
{
423 if r
:= SimpleFold(r
); r
!= out
{
424 t
.Errorf("SimpleFold(%#U) = %#U, want %#U", r
, r
, out
)