]> git.saurik.com Git - apple/icu.git/blob - icuSources/test/intltest/tstnrapi.cpp
ICU-461.12.tar.gz
[apple/icu.git] / icuSources / test / intltest / tstnrapi.cpp
1 /********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 1997-2010, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6
7 #include "unicode/utypes.h"
8 #include "unicode/uchar.h"
9 #include "unicode/normlzr.h"
10 #include "unicode/uniset.h"
11 #include "unicode/usetiter.h"
12 #include "unicode/schriter.h"
13 #include "tstnorm.h"
14
15 #if !UCONFIG_NO_NORMALIZATION
16
17 static UErrorCode status = U_ZERO_ERROR;
18
19 // test APIs that are not otherwise used - improve test coverage
20 void
21 BasicNormalizerTest::TestNormalizerAPI() {
22 // instantiate a Normalizer from a CharacterIterator
23 UnicodeString s=UnicodeString("a\\u0308\\uac00\\U0002f800", "").unescape();
24 s.append(s); // make s a bit longer and more interesting
25 StringCharacterIterator iter(s);
26 Normalizer norm(iter, UNORM_NFC);
27 if(norm.next()!=0xe4) {
28 dataerrln("error in Normalizer(CharacterIterator).next()");
29 }
30
31 // test copy constructor
32 Normalizer copy(norm);
33 if(copy.next()!=0xac00) {
34 dataerrln("error in Normalizer(Normalizer(CharacterIterator)).next()");
35 }
36
37 // test clone(), ==, and hashCode()
38 Normalizer *clone=copy.clone();
39 if(*clone!=copy) {
40 errln("error in Normalizer(Normalizer(CharacterIterator)).clone()!=copy");
41 }
42 // clone must have the same hashCode()
43 if(clone->hashCode()!=copy.hashCode()) {
44 errln("error in Normalizer(Normalizer(CharacterIterator)).clone()->hashCode()!=copy.hashCode()");
45 }
46 if(clone->next()!=0x4e3d) {
47 dataerrln("error in Normalizer(Normalizer(CharacterIterator)).clone()->next()");
48 }
49 // position changed, must change hashCode()
50 if(clone->hashCode()==copy.hashCode()) {
51 errln("error in Normalizer(Normalizer(CharacterIterator)).clone()->next().hashCode()==copy.hashCode()");
52 }
53 delete clone;
54 clone=0;
55
56 // test compose() and decompose()
57 UnicodeString tel, nfkc, nfkd;
58 tel=UnicodeString(1, (UChar32)0x2121, 10);
59 tel.insert(1, (UChar)0x301);
60
61 UErrorCode errorCode=U_ZERO_ERROR;
62 Normalizer::compose(tel, TRUE, 0, nfkc, errorCode);
63 Normalizer::decompose(tel, TRUE, 0, nfkd, errorCode);
64 if(U_FAILURE(errorCode)) {
65 dataerrln("error in Normalizer::(de)compose(): %s", u_errorName(errorCode));
66 } else if(
67 nfkc!=UnicodeString("TE\\u0139TELTELTELTELTELTELTELTELTEL", "").unescape() ||
68 nfkd!=UnicodeString("TEL\\u0301TELTELTELTELTELTELTELTELTEL", "").unescape()
69 ) {
70 errln("error in Normalizer::(de)compose(): wrong result(s)");
71 }
72
73 // test setIndex()
74 norm.setIndexOnly(3);
75 if(norm.current()!=0x4e3d) {
76 dataerrln("error in Normalizer(CharacterIterator).setIndex(3)");
77 }
78
79 // test setText(CharacterIterator) and getText()
80 UnicodeString out, out2;
81 errorCode=U_ZERO_ERROR;
82 copy.setText(iter, errorCode);
83 if(U_FAILURE(errorCode)) {
84 errln("error Normalizer::setText() failed: %s", u_errorName(errorCode));
85 } else {
86 copy.getText(out);
87 iter.getText(out2);
88 if( out!=out2 ||
89 copy.startIndex()!=iter.startIndex() ||
90 copy.endIndex()!=iter.endIndex()
91 ) {
92 errln("error in Normalizer::setText() or Normalizer::getText()");
93 }
94 }
95
96 // test setText(UChar *), getUMode() and setMode()
97 errorCode=U_ZERO_ERROR;
98 copy.setText(s.getBuffer()+1, s.length()-1, errorCode);
99 copy.setMode(UNORM_NFD);
100 if(copy.getUMode()!=UNORM_NFD) {
101 errln("error in Normalizer::setMode() or Normalizer::getUMode()");
102 }
103 if(copy.next()!=0x308 || copy.next()!=0x1100) {
104 dataerrln("error in Normalizer::setText(UChar *) or Normalizer::setMode()");
105 }
106
107 // test setText(UChar *, length=-1)
108 errorCode=U_ZERO_ERROR;
109
110 // NUL-terminate s
111 s.append((UChar)0); // append NUL
112 s.truncate(s.length()-1); // undo length change
113
114 copy.setText(s.getBuffer()+1, -1, errorCode);
115 if(copy.endIndex()!=s.length()-1) {
116 errln("error in Normalizer::setText(UChar *, -1)");
117 }
118
119 // test setOption() and getOption()
120 copy.setOption(0xaa0000, TRUE);
121 copy.setOption(0x20000, FALSE);
122 if(!copy.getOption(0x880000) || copy.getOption(0x20000)) {
123 errln("error in Normalizer::setOption() or Normalizer::getOption()");
124 }
125
126 // test last()/previous() with an internal buffer overflow
127 errorCode=U_ZERO_ERROR;
128 copy.setText(UnicodeString(1000, (UChar32)0x308, 1000), errorCode);
129 if(copy.last()!=0x308) {
130 errln("error in Normalizer(1000*U+0308).last()");
131 }
132
133 // test UNORM_NONE
134 norm.setMode(UNORM_NONE);
135 if(norm.first()!=0x61 || norm.next()!=0x308 || norm.last()!=0x2f800) {
136 errln("error in Normalizer(UNORM_NONE).first()/next()/last()");
137 }
138 Normalizer::normalize(s, UNORM_NONE, 0, out, status);
139 if(out!=s) {
140 errln("error in Normalizer::normalize(UNORM_NONE)");
141 }
142
143 // test that the same string can be used as source and destination
144 s.setTo((UChar)0xe4);
145 Normalizer::normalize(s, UNORM_NFD, 0, s, status);
146 if(s.charAt(1)!=0x308) {
147 dataerrln("error in Normalizer::normalize(UNORM_NFD, self)");
148 }
149 Normalizer::normalize(s, UNORM_NFC, 0, s, status);
150 if(s.charAt(0)!=0xe4) {
151 dataerrln("error in Normalizer::normalize(UNORM_NFC, self)");
152 }
153 Normalizer::decompose(s, FALSE, 0, s, status);
154 if(s.charAt(1)!=0x308) {
155 dataerrln("error in Normalizer::decompose(self)");
156 }
157 Normalizer::compose(s, FALSE, 0, s, status);
158 if(s.charAt(0)!=0xe4) {
159 dataerrln("error in Normalizer::compose(self)");
160 }
161 Normalizer::concatenate(s, s, s, UNORM_NFC, 0, status);
162 if(s.charAt(1)!=0xe4) {
163 dataerrln("error in Normalizer::decompose(self)");
164 }
165 }
166
167 #endif