1 /****************************************************************************
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the test suite of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file. Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights. These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
40 ****************************************************************************/
43 #include <QtTest/QtTest>
46 #include <private/qunicodetables_p.h>
47 #if defined(Q_OS_WINCE)
48 #include <qcoreapplication.h>
56 class tst_QChar
: public QObject
67 void cleanupTestCase();
80 void combiningClass();
84 void lineBreakClass();
86 void normalizationCorrections();
87 void unicodeVersion();
88 #if defined(Q_OS_WINCE)
90 QCoreApplication
* app
;
94 tst_QChar::tst_QChar()
97 tst_QChar::~tst_QChar()
100 void tst_QChar::initTestCase()
103 void tst_QChar::cleanupTestCase()
106 void tst_QChar::init()
108 #if defined(Q_OS_WINCE)
110 app
= new QCoreApplication(argc
, NULL
);
114 void tst_QChar::cleanup()
116 #if defined(Q_OS_WINCE)
121 void tst_QChar::toUpper()
123 QVERIFY(QChar('a').toUpper() == 'A');
124 QVERIFY(QChar('A').toUpper() == 'A');
125 QVERIFY(QChar((ushort
)0x1c7).toUpper().unicode() == 0x1c7);
126 QVERIFY(QChar((ushort
)0x1c8).toUpper().unicode() == 0x1c7);
127 QVERIFY(QChar((ushort
)0x1c9).toUpper().unicode() == 0x1c7);
129 QVERIFY(QChar::toUpper((ushort
)'a') == 'A');
130 QVERIFY(QChar::toUpper((ushort
)'A') == 'A');
131 QVERIFY(QChar::toUpper((ushort
)0x1c7) == 0x1c7);
132 QVERIFY(QChar::toUpper((ushort
)0x1c8) == 0x1c7);
133 QVERIFY(QChar::toUpper((ushort
)0x1c9) == 0x1c7);
135 QVERIFY(QChar::toUpper((uint
)'a') == 'A');
136 QVERIFY(QChar::toUpper((uint
)'A') == 'A');
137 QVERIFY(QChar::toUpper((uint
)0x1c7) == 0x1c7);
138 QVERIFY(QChar::toUpper((uint
)0x1c8) == 0x1c7);
139 QVERIFY(QChar::toUpper((uint
)0x1c9) == 0x1c7);
141 QVERIFY(QChar::toUpper((uint
)0x10400) == 0x10400);
142 QVERIFY(QChar::toUpper((uint
)0x10428) == 0x10400);
146 void tst_QChar::toLower()
148 QVERIFY(QChar('A').toLower() == 'a');
149 QVERIFY(QChar('a').toLower() == 'a');
150 QVERIFY(QChar((ushort
)0x1c7).toLower().unicode() == 0x1c9);
151 QVERIFY(QChar((ushort
)0x1c8).toLower().unicode() == 0x1c9);
152 QVERIFY(QChar((ushort
)0x1c9).toLower().unicode() == 0x1c9);
154 QVERIFY(QChar::toLower((ushort
)'a') == 'a');
155 QVERIFY(QChar::toLower((ushort
)'A') == 'a');
156 QVERIFY(QChar::toLower((ushort
)0x1c7) == 0x1c9);
157 QVERIFY(QChar::toLower((ushort
)0x1c8) == 0x1c9);
158 QVERIFY(QChar::toLower((ushort
)0x1c9) == 0x1c9);
160 QVERIFY(QChar::toLower((uint
)'a') == 'a');
161 QVERIFY(QChar::toLower((uint
)'A') == 'a');
162 QVERIFY(QChar::toLower((uint
)0x1c7) == 0x1c9);
163 QVERIFY(QChar::toLower((uint
)0x1c8) == 0x1c9);
164 QVERIFY(QChar::toLower((uint
)0x1c9) == 0x1c9);
166 QVERIFY(QChar::toLower((uint
)0x10400) == 0x10428);
167 QVERIFY(QChar::toLower((uint
)0x10428) == 0x10428);
170 void tst_QChar::toTitle()
172 QVERIFY(QChar('a').toTitleCase() == 'A');
173 QVERIFY(QChar('A').toTitleCase() == 'A');
174 QVERIFY(QChar((ushort
)0x1c7).toTitleCase().unicode() == 0x1c8);
175 QVERIFY(QChar((ushort
)0x1c8).toTitleCase().unicode() == 0x1c8);
176 QVERIFY(QChar((ushort
)0x1c9).toTitleCase().unicode() == 0x1c8);
178 QVERIFY(QChar::toTitleCase((ushort
)'a') == 'A');
179 QVERIFY(QChar::toTitleCase((ushort
)'A') == 'A');
180 QVERIFY(QChar::toTitleCase((ushort
)0x1c7) == 0x1c8);
181 QVERIFY(QChar::toTitleCase((ushort
)0x1c8) == 0x1c8);
182 QVERIFY(QChar::toTitleCase((ushort
)0x1c9) == 0x1c8);
184 QVERIFY(QChar::toTitleCase((uint
)'a') == 'A');
185 QVERIFY(QChar::toTitleCase((uint
)'A') == 'A');
186 QVERIFY(QChar::toTitleCase((uint
)0x1c7) == 0x1c8);
187 QVERIFY(QChar::toTitleCase((uint
)0x1c8) == 0x1c8);
188 QVERIFY(QChar::toTitleCase((uint
)0x1c9) == 0x1c8);
190 QVERIFY(QChar::toTitleCase((uint
)0x10400) == 0x10400);
191 QVERIFY(QChar::toTitleCase((uint
)0x10428) == 0x10400);
195 void tst_QChar::toCaseFolded()
197 QVERIFY(QChar('a').toCaseFolded() == 'a');
198 QVERIFY(QChar('A').toCaseFolded() == 'a');
199 QVERIFY(QChar((ushort
)0x1c7).toCaseFolded().unicode() == 0x1c9);
200 QVERIFY(QChar((ushort
)0x1c8).toCaseFolded().unicode() == 0x1c9);
201 QVERIFY(QChar((ushort
)0x1c9).toCaseFolded().unicode() == 0x1c9);
203 QVERIFY(QChar::toCaseFolded((ushort
)'a') == 'a');
204 QVERIFY(QChar::toCaseFolded((ushort
)'A') == 'a');
205 QVERIFY(QChar::toCaseFolded((ushort
)0x1c7) == 0x1c9);
206 QVERIFY(QChar::toCaseFolded((ushort
)0x1c8) == 0x1c9);
207 QVERIFY(QChar::toCaseFolded((ushort
)0x1c9) == 0x1c9);
209 QVERIFY(QChar::toCaseFolded((uint
)'a') == 'a');
210 QVERIFY(QChar::toCaseFolded((uint
)'A') == 'a');
211 QVERIFY(QChar::toCaseFolded((uint
)0x1c7) == 0x1c9);
212 QVERIFY(QChar::toCaseFolded((uint
)0x1c8) == 0x1c9);
213 QVERIFY(QChar::toCaseFolded((uint
)0x1c9) == 0x1c9);
215 QVERIFY(QChar::toCaseFolded((uint
)0x10400) == 0x10428);
216 QVERIFY(QChar::toCaseFolded((uint
)0x10428) == 0x10428);
218 QVERIFY(QChar::toCaseFolded((ushort
)0xb5) == 0x3bc);
221 void tst_QChar::isUpper()
223 QVERIFY(QChar('A').isUpper());
224 QVERIFY(QChar('Z').isUpper());
225 QVERIFY(!QChar('a').isUpper());
226 QVERIFY(!QChar('z').isUpper());
227 QVERIFY(!QChar('?').isUpper());
228 QVERIFY(QChar(0xC2).isUpper()); // A with ^
229 QVERIFY(!QChar(0xE2).isUpper()); // a with ^
232 void tst_QChar::isLower()
234 QVERIFY(!QChar('A').isLower());
235 QVERIFY(!QChar('Z').isLower());
236 QVERIFY(QChar('a').isLower());
237 QVERIFY(QChar('z').isLower());
238 QVERIFY(!QChar('?').isLower());
239 QVERIFY(!QChar(0xC2).isLower()); // A with ^
240 QVERIFY(QChar(0xE2).isLower()); // a with ^
243 void tst_QChar::category()
245 QVERIFY(QChar('a').category() == QChar::Letter_Lowercase
);
246 QVERIFY(QChar('A').category() == QChar::Letter_Uppercase
);
248 QVERIFY(QChar::category((ushort
)'a') == QChar::Letter_Lowercase
);
249 QVERIFY(QChar::category((ushort
)'A') == QChar::Letter_Uppercase
);
251 QVERIFY(QChar::category((uint
)'a') == QChar::Letter_Lowercase
);
252 QVERIFY(QChar::category((uint
)'A') == QChar::Letter_Uppercase
);
254 QVERIFY(QChar::category(0xe0100u
) == QChar::Mark_NonSpacing
);
255 QVERIFY(QChar::category(0xeffffu
) != QChar::Other_PrivateUse
);
256 QVERIFY(QChar::category(0xf0000u
) == QChar::Other_PrivateUse
);
257 QVERIFY(QChar::category(0xf0001u
) == QChar::Other_PrivateUse
);
259 QVERIFY(QChar::category(0xd900u
) == QChar::Other_Surrogate
);
260 QVERIFY(QChar::category(0xdc00u
) == QChar::Other_Surrogate
);
261 QVERIFY(QChar::category(0xdc01u
) == QChar::Other_Surrogate
);
264 void tst_QChar::direction()
266 QVERIFY(QChar('a').direction() == QChar::DirL
);
267 QVERIFY(QChar('0').direction() == QChar::DirEN
);
268 QVERIFY(QChar((ushort
)0x627).direction() == QChar::DirAL
);
269 QVERIFY(QChar((ushort
)0x5d0).direction() == QChar::DirR
);
271 QVERIFY(QChar::direction((ushort
)'a') == QChar::DirL
);
272 QVERIFY(QChar::direction((ushort
)'0') == QChar::DirEN
);
273 QVERIFY(QChar::direction((ushort
)0x627) == QChar::DirAL
);
274 QVERIFY(QChar::direction((ushort
)0x5d0) == QChar::DirR
);
276 QVERIFY(QChar::direction((uint
)'a') == QChar::DirL
);
277 QVERIFY(QChar::direction((uint
)'0') == QChar::DirEN
);
278 QVERIFY(QChar::direction((uint
)0x627) == QChar::DirAL
);
279 QVERIFY(QChar::direction((uint
)0x5d0) == QChar::DirR
);
281 QVERIFY(QChar::direction(0xE01DAu
) == QChar::DirNSM
);
282 QVERIFY(QChar::direction(0xf0000u
) == QChar::DirL
);
283 QVERIFY(QChar::direction(0xE0030u
) == QChar::DirBN
);
284 QVERIFY(QChar::direction(0x2FA17u
) == QChar::DirL
);
287 void tst_QChar::joining()
289 QVERIFY(QChar('a').joining() == QChar::OtherJoining
);
290 QVERIFY(QChar('0').joining() == QChar::OtherJoining
);
291 QVERIFY(QChar((ushort
)0x627).joining() == QChar::Right
);
292 QVERIFY(QChar((ushort
)0x5d0).joining() == QChar::OtherJoining
);
294 QVERIFY(QChar::joining((ushort
)'a') == QChar::OtherJoining
);
295 QVERIFY(QChar::joining((ushort
)'0') == QChar::OtherJoining
);
296 QVERIFY(QChar::joining((ushort
)0x627) == QChar::Right
);
297 QVERIFY(QChar::joining((ushort
)0x5d0) == QChar::OtherJoining
);
299 QVERIFY(QChar::joining((uint
)'a') == QChar::OtherJoining
);
300 QVERIFY(QChar::joining((uint
)'0') == QChar::OtherJoining
);
301 QVERIFY(QChar::joining((uint
)0x627) == QChar::Right
);
302 QVERIFY(QChar::joining((uint
)0x5d0) == QChar::OtherJoining
);
304 QVERIFY(QChar::joining(0xE01DAu
) == QChar::OtherJoining
);
305 QVERIFY(QChar::joining(0xf0000u
) == QChar::OtherJoining
);
306 QVERIFY(QChar::joining(0xE0030u
) == QChar::OtherJoining
);
307 QVERIFY(QChar::joining(0x2FA17u
) == QChar::OtherJoining
);
310 void tst_QChar::combiningClass()
312 QVERIFY(QChar('a').combiningClass() == 0);
313 QVERIFY(QChar('0').combiningClass() == 0);
314 QVERIFY(QChar((ushort
)0x627).combiningClass() == 0);
315 QVERIFY(QChar((ushort
)0x5d0).combiningClass() == 0);
317 QVERIFY(QChar::combiningClass((ushort
)'a') == 0);
318 QVERIFY(QChar::combiningClass((ushort
)'0') == 0);
319 QVERIFY(QChar::combiningClass((ushort
)0x627) == 0);
320 QVERIFY(QChar::combiningClass((ushort
)0x5d0) == 0);
322 QVERIFY(QChar::combiningClass((uint
)'a') == 0);
323 QVERIFY(QChar::combiningClass((uint
)'0') == 0);
324 QVERIFY(QChar::combiningClass((uint
)0x627) == 0);
325 QVERIFY(QChar::combiningClass((uint
)0x5d0) == 0);
327 QVERIFY(QChar::combiningClass(0xE01DAu
) == 0);
328 QVERIFY(QChar::combiningClass(0xf0000u
) == 0);
329 QVERIFY(QChar::combiningClass(0xE0030u
) == 0);
330 QVERIFY(QChar::combiningClass(0x2FA17u
) == 0);
332 QVERIFY(QChar::combiningClass((ushort
)0x300) == 230);
333 QVERIFY(QChar::combiningClass((uint
)0x300) == 230);
335 QVERIFY(QChar::combiningClass((uint
)0x1d244) == 230);
339 void tst_QChar::unicodeVersion()
341 QVERIFY(QChar('a').unicodeVersion() == QChar::Unicode_1_1
);
342 QVERIFY(QChar('0').unicodeVersion() == QChar::Unicode_1_1
);
343 QVERIFY(QChar((ushort
)0x627).unicodeVersion() == QChar::Unicode_1_1
);
344 QVERIFY(QChar((ushort
)0x5d0).unicodeVersion() == QChar::Unicode_1_1
);
346 QVERIFY(QChar::unicodeVersion((ushort
)'a') == QChar::Unicode_1_1
);
347 QVERIFY(QChar::unicodeVersion((ushort
)'0') == QChar::Unicode_1_1
);
348 QVERIFY(QChar::unicodeVersion((ushort
)0x627) == QChar::Unicode_1_1
);
349 QVERIFY(QChar::unicodeVersion((ushort
)0x5d0) == QChar::Unicode_1_1
);
351 QVERIFY(QChar::unicodeVersion((uint
)'a') == QChar::Unicode_1_1
);
352 QVERIFY(QChar::unicodeVersion((uint
)'0') == QChar::Unicode_1_1
);
353 QVERIFY(QChar::unicodeVersion((uint
)0x627) == QChar::Unicode_1_1
);
354 QVERIFY(QChar::unicodeVersion((uint
)0x5d0) == QChar::Unicode_1_1
);
356 QVERIFY(QChar(0x0591).unicodeVersion() == QChar::Unicode_2_0
);
357 QVERIFY(QChar::unicodeVersion((ushort
)0x0591) == QChar::Unicode_2_0
);
358 QVERIFY(QChar::unicodeVersion((uint
)0x0591) == QChar::Unicode_2_0
);
360 QVERIFY(QChar(0x20AC).unicodeVersion() == QChar::Unicode_2_1_2
);
361 QVERIFY(QChar::unicodeVersion((ushort
)0x020AC) == QChar::Unicode_2_1_2
);
362 QVERIFY(QChar::unicodeVersion((uint
)0x20AC) == QChar::Unicode_2_1_2
);
363 QVERIFY(QChar(0xfffc).unicodeVersion() == QChar::Unicode_2_1_2
);
364 QVERIFY(QChar::unicodeVersion((ushort
)0x0fffc) == QChar::Unicode_2_1_2
);
365 QVERIFY(QChar::unicodeVersion((uint
)0xfffc) == QChar::Unicode_2_1_2
);
367 QVERIFY(QChar(0x01f6).unicodeVersion() == QChar::Unicode_3_0
);
368 QVERIFY(QChar::unicodeVersion((ushort
)0x01f6) == QChar::Unicode_3_0
);
369 QVERIFY(QChar::unicodeVersion((uint
)0x01f6) == QChar::Unicode_3_0
);
371 QVERIFY(QChar(0x03F4).unicodeVersion() == QChar::Unicode_3_1
);
372 QVERIFY(QChar::unicodeVersion((ushort
)0x03F4) == QChar::Unicode_3_1
);
373 QVERIFY(QChar::unicodeVersion((uint
)0x03F4) == QChar::Unicode_3_1
);
374 QVERIFY(QChar::unicodeVersion((uint
)0x10300) == QChar::Unicode_3_1
);
376 QVERIFY(QChar(0x0220).unicodeVersion() == QChar::Unicode_3_2
);
377 QVERIFY(QChar::unicodeVersion((ushort
)0x0220) == QChar::Unicode_3_2
);
378 QVERIFY(QChar::unicodeVersion((uint
)0x0220) == QChar::Unicode_3_2
);
379 QVERIFY(QChar::unicodeVersion((uint
)0xFF5F) == QChar::Unicode_3_2
);
381 QVERIFY(QChar(0x0221).unicodeVersion() == QChar::Unicode_4_0
);
382 QVERIFY(QChar::unicodeVersion((ushort
)0x0221) == QChar::Unicode_4_0
);
383 QVERIFY(QChar::unicodeVersion((uint
)0x0221) == QChar::Unicode_4_0
);
384 QVERIFY(QChar::unicodeVersion((uint
)0x10000) == QChar::Unicode_4_0
);
386 QVERIFY(QChar(0x0237).unicodeVersion() == QChar::Unicode_4_1
);
387 QVERIFY(QChar::unicodeVersion((ushort
)0x0237) == QChar::Unicode_4_1
);
388 QVERIFY(QChar::unicodeVersion((uint
)0x0237) == QChar::Unicode_4_1
);
389 QVERIFY(QChar::unicodeVersion((uint
)0x10140) == QChar::Unicode_4_1
);
391 QVERIFY(QChar(0x0242).unicodeVersion() == QChar::Unicode_5_0
);
392 QVERIFY(QChar::unicodeVersion((ushort
)0x0242) == QChar::Unicode_5_0
);
393 QVERIFY(QChar::unicodeVersion((uint
)0x0242) == QChar::Unicode_5_0
);
394 QVERIFY(QChar::unicodeVersion((uint
)0x12000) == QChar::Unicode_5_0
);
399 void tst_QChar::digitValue()
401 QVERIFY(QChar('9').digitValue() == 9);
402 QVERIFY(QChar('0').digitValue() == 0);
403 QVERIFY(QChar('a').digitValue() == -1);
405 QVERIFY(QChar::digitValue((ushort
)'9') == 9);
406 QVERIFY(QChar::digitValue((ushort
)'0') == 0);
407 QVERIFY(QChar::digitValue((uint
)'9') == 9);
408 QVERIFY(QChar::digitValue((uint
)'0') == 0);
410 QVERIFY(QChar::digitValue((ushort
)0x1049) == 9);
411 QVERIFY(QChar::digitValue((ushort
)0x1040) == 0);
412 QVERIFY(QChar::digitValue((uint
)0x1049) == 9);
413 QVERIFY(QChar::digitValue((uint
)0x1040) == 0);
416 void tst_QChar::decomposition()
418 QVERIFY(QChar((ushort
)0xa0).decompositionTag() == QChar::NoBreak
);
419 QVERIFY(QChar((ushort
)0xa8).decompositionTag() == QChar::Compat
);
420 QVERIFY(QChar((ushort
)0x41).decompositionTag() == QChar::NoDecomposition
);
422 QVERIFY(QChar::decompositionTag(0xa0) == QChar::NoBreak
);
423 QVERIFY(QChar::decompositionTag(0xa8) == QChar::Compat
);
424 QVERIFY(QChar::decompositionTag(0x41) == QChar::NoDecomposition
);
426 QVERIFY(QChar::decomposition(0xa0) == QString(QChar(0x20)));
427 QVERIFY(QChar::decomposition(0xc0) == (QString(QChar(0x41)) + QString(QChar(0x300))));
431 str
+= QChar( (0x1D157 - 0x10000) / 0x400 + 0xd800 );
432 str
+= QChar( ((0x1D157 - 0x10000) % 0x400) + 0xdc00 );
433 str
+= QChar( (0x1D165 - 0x10000) / 0x400 + 0xd800 );
434 str
+= QChar( ((0x1D165 - 0x10000) % 0x400) + 0xdc00 );
435 QVERIFY(QChar::decomposition(0x1D15e) == str
);
440 str
+= QChar(0x1100);
441 str
+= QChar(0x1161);
442 QVERIFY(QChar::decomposition(0xac00) == str
);
446 str
+= QChar(0x110c);
447 str
+= QChar(0x1165);
448 str
+= QChar(0x11b7);
449 QVERIFY(QChar::decomposition(0xc810) == str
);
454 void tst_QChar::ligature()
456 QVERIFY(QChar::ligature(0x0041, 0x00300) == 0xc0);
457 QVERIFY(QChar::ligature(0x0049, 0x00308) == 0xcf);
458 QVERIFY(QChar::ligature(0x0391, 0x00301) == 0x386);
459 QVERIFY(QChar::ligature(0x0627, 0x00653) == 0x622);
461 QVERIFY(QChar::ligature(0x1100, 0x1161) == 0xac00);
462 QVERIFY(QChar::ligature(0xac00, 0x11a8) == 0xac01);
466 void tst_QChar::lineBreakClass()
468 QVERIFY(QUnicodeTables::lineBreakClass(0x0041u
) == QUnicodeTables::LineBreak_AL
);
469 QVERIFY(QUnicodeTables::lineBreakClass(0x0033u
) == QUnicodeTables::LineBreak_NU
);
470 QVERIFY(QUnicodeTables::lineBreakClass(0xe0164u
) == QUnicodeTables::LineBreak_CM
);
471 QVERIFY(QUnicodeTables::lineBreakClass(0x2f9a4u
) == QUnicodeTables::LineBreak_ID
);
472 QVERIFY(QUnicodeTables::lineBreakClass(0x10000u
) == QUnicodeTables::LineBreak_AL
);
473 QVERIFY(QUnicodeTables::lineBreakClass(0x0fffdu
) == QUnicodeTables::LineBreak_AL
);
476 void tst_QChar::normalization()
480 composed
+= QChar(0xc0);
482 decomposed
+= QChar(0x41);
483 decomposed
+= QChar(0x300);
485 QVERIFY(composed
.normalized(QString::NormalizationForm_D
) == decomposed
);
486 QVERIFY(composed
.normalized(QString::NormalizationForm_C
) == composed
);
487 QVERIFY(composed
.normalized(QString::NormalizationForm_KD
) == decomposed
);
488 QVERIFY(composed
.normalized(QString::NormalizationForm_KC
) == composed
);
492 composed
+= QChar(0xa0);
494 decomposed
+= QChar(0x20);
496 QVERIFY(composed
.normalized(QString::NormalizationForm_D
) == composed
);
497 QVERIFY(composed
.normalized(QString::NormalizationForm_C
) == composed
);
498 QVERIFY(composed
.normalized(QString::NormalizationForm_KD
) == decomposed
);
499 QVERIFY(composed
.normalized(QString::NormalizationForm_KC
) == decomposed
);
502 QFile
f("NormalizationTest.txt");
503 // Windows - current directory is the debug/release subdirectory where the executable is located
505 f
.setFileName("../NormalizationTest.txt");;
507 QFAIL("Couldn't find NormalizationTest.txt");
511 f
.open(QIODevice::ReadOnly
);
516 int len
= f
.readLine(line
.data(), 1024);
519 int comment
= line
.indexOf('#');
521 line
= line
.left(comment
);
523 if (line
.startsWith("@"))
529 line
= line
.trimmed();
530 if (line
.endsWith(';'))
531 line
.truncate(line
.length()-1);
533 QList
<QByteArray
> l
= line
.split(';');
535 Q_ASSERT(l
.size() == 5);
538 for (int i
= 0; i
< 5; ++i
) {
539 QList
<QByteArray
> c
= l
.at(i
).split(' ');
540 Q_ASSERT(!c
.isEmpty());
542 for (int j
= 0; j
< c
.size(); ++j
) {
544 uint uc
= c
.at(j
).toInt(&ok
, 16);
546 columns
[i
].append(QChar(uc
));
550 ushort high
= uc
/0x400 + 0xd800;
551 ushort low
= uc
%0x400 + 0xdc00;
552 columns
[i
].append(QChar(high
));
553 columns
[i
].append(QChar(low
));
559 // 1. The following invariants must be true for all conformant implementations
562 // c2 == NFC(c1) == NFC(c2) == NFC(c3)
563 // c4 == NFC(c4) == NFC(c5)
565 QVERIFY(columns
[1] == columns
[0].normalized(QString::NormalizationForm_C
));
566 QVERIFY(columns
[1] == columns
[1].normalized(QString::NormalizationForm_C
));
567 QVERIFY(columns
[1] == columns
[2].normalized(QString::NormalizationForm_C
));
568 QVERIFY(columns
[3] == columns
[3].normalized(QString::NormalizationForm_C
));
569 QVERIFY(columns
[3] == columns
[4].normalized(QString::NormalizationForm_C
));
572 // c3 == NFD(c1) == NFD(c2) == NFD(c3)
573 // c5 == NFD(c4) == NFD(c5)
575 QVERIFY(columns
[2] == columns
[0].normalized(QString::NormalizationForm_D
));
576 QVERIFY(columns
[2] == columns
[1].normalized(QString::NormalizationForm_D
));
577 QVERIFY(columns
[2] == columns
[2].normalized(QString::NormalizationForm_D
));
578 QVERIFY(columns
[4] == columns
[3].normalized(QString::NormalizationForm_D
));
579 QVERIFY(columns
[4] == columns
[4].normalized(QString::NormalizationForm_D
));
582 // c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5)
584 QVERIFY(columns
[3] == columns
[0].normalized(QString::NormalizationForm_KC
));
585 QVERIFY(columns
[3] == columns
[1].normalized(QString::NormalizationForm_KC
));
586 QVERIFY(columns
[3] == columns
[2].normalized(QString::NormalizationForm_KC
));
587 QVERIFY(columns
[3] == columns
[3].normalized(QString::NormalizationForm_KC
));
588 QVERIFY(columns
[3] == columns
[4].normalized(QString::NormalizationForm_KC
));
591 // c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5)
593 QVERIFY(columns
[4] == columns
[0].normalized(QString::NormalizationForm_KD
));
594 QVERIFY(columns
[4] == columns
[1].normalized(QString::NormalizationForm_KD
));
595 QVERIFY(columns
[4] == columns
[2].normalized(QString::NormalizationForm_KD
));
596 QVERIFY(columns
[4] == columns
[3].normalized(QString::NormalizationForm_KD
));
597 QVERIFY(columns
[4] == columns
[4].normalized(QString::NormalizationForm_KD
));
599 // 2. For every code point X assigned in this version of Unicode that is not specifically
600 // listed in Part 1, the following invariants must be true for all conformant
603 // X == NFC(X) == NFD(X) == NFKC(X) == NFKD(X)
610 void tst_QChar::normalizationCorrections()
613 s
.append(QChar(0xf951));
615 QString n
= s
.normalized(QString::NormalizationForm_D
);
617 res
.append(QChar(0x964b));
620 n
= s
.normalized(QString::NormalizationForm_D
, QChar::Unicode_3_1
);
622 res
.append(QChar(0x96fb));
626 s
+= QChar(QChar::highSurrogate(0x2f868));
627 s
+= QChar(QChar::lowSurrogate(0x2f868));
629 n
= s
.normalized(QString::NormalizationForm_C
);
631 res
+= QChar(0x36fc);
634 n
= s
.normalized(QString::NormalizationForm_C
, QChar::Unicode_3_1
);
636 res
+= QChar(0xd844);
637 res
+= QChar(0xdf6a);
640 n
= s
.normalized(QString::NormalizationForm_C
, QChar::Unicode_3_2
);
645 QTEST_APPLESS_MAIN(tst_QChar
)
646 #include "tst_qchar.moc"