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