10596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// © 2016 and later: Unicode, Inc. and others. 264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 58de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Copyright (c) 1997-2016, International Business Machines Corporation and 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved. 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/ 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * IntlTestUtilities is the medium level test class for everything in the directory "utility". 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 15b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/errorcode.h" 1650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/localpointer.h" 171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#include "charstr.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "itutil.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "strtest.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "loctest.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "citrtest.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustrtest.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucdtest.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "restest.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "restsnew.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "tsmthred.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "tsputil.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uobjtest.h" 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "utxttest.h" 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "v32test.h" 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uvectest.h" 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "aliastst.h" 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "usettest.h" 34c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 35b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoextern IntlTest *createBytesTrieTest(); 3650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic IntlTest *createLocalPointerTest(); 37b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoextern IntlTest *createUCharsTrieTest(); 388393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusstatic IntlTest *createEnumSetTest(); 398de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubertextern IntlTest *createSimpleFormatterTest(); 40f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusextern IntlTest *createUnifiedCacheTest(); 41f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusextern IntlTest *createQuantityFormatterTest(); 42c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertextern IntlTest *createPluralMapTest(); 43c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CASE(id, test) case id: \ 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = #test; \ 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec) { \ 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(#test "---"); logln(); \ 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test t; \ 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru callTest(t, par); \ 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } \ 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ) 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec) logln("TestSuite Utilities: "); 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (index) { 5827f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(0, MultithreadTest); 5927f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(1, StringTest); 6027f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(2, UnicodeStringTest); 6127f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(3, LocaleTest); 6227f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(4, CharIterTest); 6327f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(5, UObjectTest); 6427f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(6, UnicodeTest); 6527f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(7, ResourceBundleTest); 6627f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(8, NewResourceBundleTest); 6727f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(9, PUtilTest); 6827f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(10, UVector32Test); 6927f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(11, UVectorTest); 7027f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(12, UTextTest); 7127f654740f2a26ad62a5c155af9199af9e69b889claireho CASE(13, LocaleAliasTest); 72b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru CASE(14, UnicodeSetTest); 73b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru CASE(15, ErrorCodeTest); 7450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case 16: 7550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho name = "LocalPointerTest"; 7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (exec) { 7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho logln("TestSuite LocalPointerTest---"); logln(); 7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalPointer<IntlTest> test(createLocalPointerTest()); 7950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho callTest(*test, par); 8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 82b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho case 17: 83b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho name = "BytesTrieTest"; 84b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (exec) { 85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln("TestSuite BytesTrieTest---"); logln(); 86b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<IntlTest> test(createBytesTrieTest()); 87b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho callTest(*test, par); 88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho case 18: 91b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho name = "UCharsTrieTest"; 92b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (exec) { 93b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln("TestSuite UCharsTrieTest---"); logln(); 94b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<IntlTest> test(createUCharsTrieTest()); 95b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho callTest(*test, par); 96b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 97b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 988393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius case 19: 998393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius name = "EnumSetTest"; 1008393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (exec) { 1018393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("TestSuite EnumSetTest---"); logln(); 1028393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius LocalPointer<IntlTest> test(createEnumSetTest()); 1038393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius callTest(*test, par); 1048393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 1058393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius break; 106fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius case 20: 1078de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert name = "SimpleFormatterTest"; 108fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (exec) { 1098de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert logln("TestSuite SimpleFormatterTest---"); logln(); 1108de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert LocalPointer<IntlTest> test(createSimpleFormatterTest()); 111fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius callTest(*test, par); 112fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 113fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; 114fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius case 21: 115f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius name = "UnifiedCacheTest"; 116fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (exec) { 117f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius logln("TestSuite UnifiedCacheTest---"); logln(); 118f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius LocalPointer<IntlTest> test(createUnifiedCacheTest()); 119f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius callTest(*test, par); 120f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 121f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius break; 122f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius case 22: 123f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius name = "QuantityFormatterTest"; 124f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (exec) { 125f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius logln("TestSuite QuantityFormatterTest---"); logln(); 126f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius LocalPointer<IntlTest> test(createQuantityFormatterTest()); 127fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius callTest(*test, par); 128fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1298ce198ebe2317b05a969826d0b629cb2d0b894a2Markus Scherer break; 130c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert case 23: 131c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert name = "PluralMapTest"; 132c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (exec) { 133c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert logln("TestSuite PluralMapTest---"); logln(); 134c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalPointer<IntlTest> test(createPluralMapTest()); 135c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert callTest(*test, par); 136c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 137fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: name = ""; break; //needed to end loop 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid ErrorCodeTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) { 143b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (exec) logln("TestSuite Utilities: "); 144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru switch (index) { 145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru case 0: name = "TestErrorCode"; if (exec) TestErrorCode(); break; 146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru case 1: name = "TestSubclass"; if (exec) TestSubclass(); break; 147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru default: name = ""; break; //needed to end loop 148b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 149b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void RefPlusOne(UErrorCode &code) { code=(UErrorCode)(code+1); } 152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void PtrPlusTwo(UErrorCode *code) { *code=(UErrorCode)(*code+2); } 153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid ErrorCodeTest::TestErrorCode() { 155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ErrorCode errorCode; 156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(errorCode.get()!=U_ZERO_ERROR || !errorCode.isSuccess() || errorCode.isFailure()) { 157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("ErrorCode did not initialize properly"); 158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode.assertSuccess(); 16150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode.errorName()!=u_errorName(U_ZERO_ERROR)) { 16250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("ErrorCode did not format error message string properly"); 16350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru RefPlusOne(errorCode); 165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(errorCode.get()!=U_ILLEGAL_ARGUMENT_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) { 166b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("ErrorCode did not yield a writable reference"); 167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 168b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru PtrPlusTwo(errorCode); 169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(errorCode.get()!=U_INVALID_FORMAT_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) { 170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("ErrorCode did not yield a writable pointer"); 171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errorCode.set(U_PARSE_ERROR); 173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(errorCode.get()!=U_PARSE_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) { 174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("ErrorCode.set() failed"); 175b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if( errorCode.reset()!=U_PARSE_ERROR || errorCode.get()!=U_ZERO_ERROR || 177b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru !errorCode.isSuccess() || errorCode.isFailure() 178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ) { 179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("ErrorCode did not reset properly"); 180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruclass MyErrorCode: public ErrorCode { 184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querupublic: 185b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru MyErrorCode(int32_t &countChecks, int32_t &countDests) 186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru : checks(countChecks), dests(countDests) {} 187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ~MyErrorCode() { 188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(isFailure()) { 189b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ++dests; 190b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 191b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruprivate: 193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru virtual void handleFailure() const { 194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ++checks; 195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t &checks; 197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t &dests; 198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}; 199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid ErrorCodeTest::TestSubclass() { 201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t countChecks=0; 202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t countDests=0; 203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { 204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru MyErrorCode errorCode(countChecks, countDests); 205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if( errorCode.get()!=U_ZERO_ERROR || !errorCode.isSuccess() || errorCode.isFailure() || 206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru countChecks!=0 || countDests!=0 207b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ) { 208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("ErrorCode did not initialize properly"); 209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 210b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 21150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode.assertSuccess(); 212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(countChecks!=0) { 21350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("ErrorCode.assertSuccess() called handleFailure() despite success"); 214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru RefPlusOne(errorCode); 216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(errorCode.get()!=U_ILLEGAL_ARGUMENT_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) { 217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("ErrorCode did not yield a writable reference"); 218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 21950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode.assertSuccess(); 220b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(countChecks!=1) { 22150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("ErrorCode.assertSuccess() did not handleFailure()"); 222b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru PtrPlusTwo(errorCode); 224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(errorCode.get()!=U_INVALID_FORMAT_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) { 225b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("ErrorCode did not yield a writable pointer"); 226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 22750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode.assertSuccess(); 228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(countChecks!=2) { 22950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("ErrorCode.assertSuccess() did not handleFailure()"); 230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errorCode.set(U_PARSE_ERROR); 232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(errorCode.get()!=U_PARSE_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) { 233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("ErrorCode.set() failed"); 234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 235b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if( errorCode.reset()!=U_PARSE_ERROR || errorCode.get()!=U_ZERO_ERROR || 236b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru !errorCode.isSuccess() || errorCode.isFailure() 237b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ) { 238b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("ErrorCode did not reset properly"); 239b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 24050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode.assertSuccess(); 241b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(countChecks!=2) { 24250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("ErrorCode.assertSuccess() called handleFailure() despite success"); 243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 244b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 245b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(countDests!=0) { 24650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("MyErrorCode destructor detected failure despite success"); 247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru countChecks=countDests=0; 249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { 250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru MyErrorCode errorCode(countChecks, countDests); 251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errorCode.set(U_PARSE_ERROR); 252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 253b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(countDests!=1) { 25450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("MyErrorCode destructor failed to detect failure"); 25550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 25650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 25750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 25850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass LocalPointerTest : public IntlTest { 25950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehopublic: 26050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalPointerTest() {} 26150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 26250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=NULL); 26350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 26450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho void TestLocalPointer(); 265c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert void TestLocalPointerMoveSwap(); 26650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho void TestLocalArray(); 267c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert void TestLocalArrayMoveSwap(); 26850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho void TestLocalXyzPointer(); 269c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert void TestLocalXyzPointerMoveSwap(); 27050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho void TestLocalXyzPointerNull(); 27150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 27250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 27350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic IntlTest *createLocalPointerTest() { 27450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return new LocalPointerTest(); 27550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 27650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 27750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid LocalPointerTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) { 27850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(exec) { 27950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho logln("TestSuite LocalPointerTest: "); 280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert TESTCASE_AUTO_BEGIN; 2821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert TESTCASE_AUTO(TestLocalPointer); 283c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestLocalPointerMoveSwap); 2841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert TESTCASE_AUTO(TestLocalArray); 285c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestLocalArrayMoveSwap); 2861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert TESTCASE_AUTO(TestLocalXyzPointer); 287c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestLocalXyzPointerMoveSwap); 2881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert TESTCASE_AUTO(TestLocalXyzPointerNull); 2891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert TESTCASE_AUTO_END; 29050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 29150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 292c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert// Exercise almost every LocalPointer and LocalPointerBase method. 29350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid LocalPointerTest::TestLocalPointer() { 29450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // constructor 29550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalPointer<UnicodeString> s(new UnicodeString((UChar32)0x50005)); 29650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // isNULL(), isValid(), operator==(), operator!=() 29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(s.isNull() || !s.isValid() || s==NULL || !(s!=NULL)) { 29850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalPointer constructor or NULL test failure"); 29950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 30050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 30150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // getAlias(), operator->, operator* 30250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(s.getAlias()->length()!=2 || s->length()!=2 || (*s).length()!=2) { 30350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalPointer access failure"); 30450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 30550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // adoptInstead(), orphan() 30650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho s.adoptInstead(new UnicodeString((UChar)0xfffc)); 30750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(s->length()!=1) { 30850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalPointer adoptInstead(U+FFFC) failure"); 30950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 31050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString *orphan=s.orphan(); 31150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(orphan==NULL || orphan->length()!=1 || s.isValid() || s!=NULL) { 31250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalPointer orphan() failure"); 31350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 31450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete orphan; 31550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho s.adoptInstead(new UnicodeString()); 31650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(s->length()!=0) { 31750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalPointer adoptInstead(empty) failure"); 31850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 3201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // LocalPointer(p, errorCode) sets U_MEMORY_ALLOCATION_ERROR if p==NULL. 3211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert UErrorCode errorCode = U_ZERO_ERROR; 3228de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert LocalPointer<CharString> csx(new CharString("some chars", errorCode), errorCode); 3238de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert if(csx.isNull() && U_SUCCESS(errorCode)) { 3241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errln("LocalPointer(p, errorCode) failure"); 3251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return; 3261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 3271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errorCode = U_ZERO_ERROR; 3288de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert csx.adoptInsteadAndCheckErrorCode(new CharString("different chars", errorCode), errorCode); 3298de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert if(csx.isNull() && U_SUCCESS(errorCode)) { 3301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errln("adoptInsteadAndCheckErrorCode(p, errorCode) failure"); 3311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return; 3321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 3331b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // Incoming failure: Keep the current object and delete the input object. 3341b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errorCode = U_ILLEGAL_ARGUMENT_ERROR; 3358de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert csx.adoptInsteadAndCheckErrorCode(new CharString("unused", errorCode), errorCode); 3368de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert if(csx.isValid() && strcmp(csx->data(), "different chars") != 0) { 3371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errln("adoptInsteadAndCheckErrorCode(p, U_FAILURE) did not retain the old object"); 3381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return; 3391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 3401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errorCode = U_ZERO_ERROR; 3418de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert csx.adoptInsteadAndCheckErrorCode(NULL, errorCode); 3421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if(errorCode != U_MEMORY_ALLOCATION_ERROR) { 3431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errln("adoptInsteadAndCheckErrorCode(NULL, errorCode) did not set U_MEMORY_ALLOCATION_ERROR"); 3441b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return; 3451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 3468de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert if(csx.isValid()) { 3471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errln("adoptInsteadAndCheckErrorCode(NULL, errorCode) kept the object"); 3481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return; 3491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 3501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errorCode = U_ZERO_ERROR; 3511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert LocalPointer<CharString> null(NULL, errorCode); 3521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if(errorCode != U_MEMORY_ALLOCATION_ERROR) { 3531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errln("LocalPointer(NULL, errorCode) did not set U_MEMORY_ALLOCATION_ERROR"); 3541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return; 3551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 356c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 357c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // destructor 358c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert} 359c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 360c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid LocalPointerTest::TestLocalPointerMoveSwap() { 361c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString *p1 = new UnicodeString((UChar)0x61); 362c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString *p2 = new UnicodeString((UChar)0x62); 363c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalPointer<UnicodeString> s1(p1); 364c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalPointer<UnicodeString> s2(p2); 365c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s1.swap(s2); 366c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s1.getAlias() != p2 || s2.getAlias() != p1) { 367c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalPointer.swap() did not swap"); 368c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 369c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert swap(s1, s2); 370c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s1.getAlias() != p1 || s2.getAlias() != p2) { 371c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("swap(LocalPointer) did not swap back"); 372c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 373c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalPointer<UnicodeString> s3; 374c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s3.moveFrom(s1); 375c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s3.getAlias() != p1 || s1.isValid()) { 376c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalPointer.moveFrom() did not move"); 377c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 378c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert infoln("TestLocalPointerMoveSwap() with rvalue references"); 379c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s1 = static_cast<LocalPointer<UnicodeString> &&>(s3); 380c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s1.getAlias() != p1 || s3.isValid()) { 381c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalPointer move assignment operator did not move"); 382c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 383c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalPointer<UnicodeString> s4(static_cast<LocalPointer<UnicodeString> &&>(s2)); 384c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s4.getAlias() != p2 || s2.isValid()) { 385c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalPointer move constructor did not move"); 386c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 387c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 388c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Move self assignment leaves the object valid but in an undefined state. 389c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Do it to make sure there is no crash, 390c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // but do not check for any particular resulting value. 391c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s1.moveFrom(s1); 392c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s3.moveFrom(s3); 39350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 39450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 395c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert// Exercise almost every LocalArray method (but not LocalPointerBase). 39650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid LocalPointerTest::TestLocalArray() { 39750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // constructor 39850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalArray<UnicodeString> a(new UnicodeString[2]); 39950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // operator[]() 40050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho a[0].append((UChar)0x61); 40150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho a[1].append((UChar32)0x60006); 40250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(a[0].length()!=1 || a[1].length()!=2) { 40350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalArray access failure"); 40450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 40550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // adoptInstead() 40650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho a.adoptInstead(new UnicodeString[4]); 40750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho a[3].append((UChar)0x62).append((UChar)0x63).reverse(); 40850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(a[3].length()!=2 || a[3][1]!=0x62) { 40950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalArray adoptInstead() failure"); 41050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 411c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 412c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // LocalArray(p, errorCode) sets U_MEMORY_ALLOCATION_ERROR if p==NULL. 413c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UErrorCode errorCode = U_ZERO_ERROR; 414c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalArray<UnicodeString> ua(new UnicodeString[3], errorCode); 415c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(ua.isNull() && U_SUCCESS(errorCode)) { 416c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalArray(p, errorCode) failure"); 417c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 418c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 419c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errorCode = U_ZERO_ERROR; 420c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString *u4 = new UnicodeString[4]; 421c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert ua.adoptInsteadAndCheckErrorCode(u4, errorCode); 422c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(ua.isNull() && U_SUCCESS(errorCode)) { 423c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("adoptInsteadAndCheckErrorCode(p, errorCode) failure"); 424c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 425c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 426c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Incoming failure: Keep the current object and delete the input object. 427c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errorCode = U_ILLEGAL_ARGUMENT_ERROR; 428c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert ua.adoptInsteadAndCheckErrorCode(new UnicodeString[5], errorCode); 429c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(ua.isValid() && ua.getAlias() != u4) { 430c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("adoptInsteadAndCheckErrorCode(p, U_FAILURE) did not retain the old array"); 431c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 432c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 433c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errorCode = U_ZERO_ERROR; 434c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert ua.adoptInsteadAndCheckErrorCode(NULL, errorCode); 435c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(errorCode != U_MEMORY_ALLOCATION_ERROR) { 436c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("adoptInsteadAndCheckErrorCode(NULL, errorCode) did not set U_MEMORY_ALLOCATION_ERROR"); 437c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 438c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 439c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(ua.isValid()) { 440c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("adoptInsteadAndCheckErrorCode(NULL, errorCode) kept the array"); 441c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 442c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 443c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errorCode = U_ZERO_ERROR; 444c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalArray<UnicodeString> null(NULL, errorCode); 445c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(errorCode != U_MEMORY_ALLOCATION_ERROR) { 446c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalArray(NULL, errorCode) did not set U_MEMORY_ALLOCATION_ERROR"); 447c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 448c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 449c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 45050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // destructor 45150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 45250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 453c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid LocalPointerTest::TestLocalArrayMoveSwap() { 454c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString *p1 = new UnicodeString[2]; 455c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString *p2 = new UnicodeString[3]; 456c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalArray<UnicodeString> a1(p1); 457c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalArray<UnicodeString> a2(p2); 458c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert a1.swap(a2); 459c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(a1.getAlias() != p2 || a2.getAlias() != p1) { 460c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalArray.swap() did not swap"); 461c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 462c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert swap(a1, a2); 463c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(a1.getAlias() != p1 || a2.getAlias() != p2) { 464c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("swap(LocalArray) did not swap back"); 465c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 466c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalArray<UnicodeString> a3; 467c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert a3.moveFrom(a1); 468c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(a3.getAlias() != p1 || a1.isValid()) { 469c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalArray.moveFrom() did not move"); 470c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 471c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert infoln("TestLocalArrayMoveSwap() with rvalue references"); 472c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert a1 = static_cast<LocalArray<UnicodeString> &&>(a3); 473c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(a1.getAlias() != p1 || a3.isValid()) { 474c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalArray move assignment operator did not move"); 475c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 476c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalArray<UnicodeString> a4(static_cast<LocalArray<UnicodeString> &&>(a2)); 477c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(a4.getAlias() != p2 || a2.isValid()) { 478c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalArray move constructor did not move"); 479c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 480c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 481c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Move self assignment leaves the object valid but in an undefined state. 482c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Do it to make sure there is no crash, 483c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // but do not check for any particular resulting value. 484c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert a1.moveFrom(a1); 485c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert a3.moveFrom(a3); 486c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert} 487c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 48850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/ucnvsel.h" 48950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/ucal.h" 49050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/udatpg.h" 49127f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/uidna.h" 49250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/uldnames.h" 49350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/umsg.h" 49450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/unorm2.h" 49550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/uregex.h" 49650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/utrans.h" 49750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 49850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Use LocalXyzPointer types that are not covered elsewhere in the intltest suite. 49950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid LocalPointerTest::TestLocalXyzPointer() { 50050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho IcuTestErrorCode errorCode(*this, "TestLocalXyzPointer"); 50150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 50250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const char *const encoding="ISO-8859-1"; 50350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUConverterSelectorPointer sel( 50450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ucnvsel_open(&encoding, 1, NULL, UCNV_ROUNDTRIP_SET, errorCode)); 50550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode.logIfFailureAndReset("ucnvsel_open()")) { 50650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 50750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 50850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(sel.isNull()) { 50950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalUConverterSelectorPointer failure"); 51050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 51150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 51250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 51350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FORMATTING 51450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUCalendarPointer cal(ucal_open(NULL, 0, "root", UCAL_GREGORIAN, errorCode)); 51550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode.logDataIfFailureAndReset("ucal_open()")) { 51650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 51750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 51850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(cal.isNull()) { 51950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalUCalendarPointer failure"); 52050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 52150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 52250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 52350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUDateTimePatternGeneratorPointer patgen(udatpg_open("root", errorCode)); 524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode.logDataIfFailureAndReset("udatpg_open()")) { 52550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 52650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 52750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(patgen.isNull()) { 52850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalUDateTimePatternGeneratorPointer failure"); 52950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 53050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 53150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 53250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalULocaleDisplayNamesPointer ldn(uldn_open("de-CH", ULDN_STANDARD_NAMES, errorCode)); 53350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode.logIfFailureAndReset("uldn_open()")) { 53450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 53550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 53650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(ldn.isNull()) { 53750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalULocaleDisplayNamesPointer failure"); 53850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 53950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 54050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 54150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString hello=UNICODE_STRING_SIMPLE("Hello {0}!"); 54250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUMessageFormatPointer msg( 54350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho umsg_open(hello.getBuffer(), hello.length(), "root", NULL, errorCode)); 54450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode.logIfFailureAndReset("umsg_open()")) { 54550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 54650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 54750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(msg.isNull()) { 54850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalUMessageFormatPointer failure"); 54950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 55050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 55150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif /* UCONFIG_NO_FORMATTING */ 55250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 55350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_NORMALIZATION 554103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const UNormalizer2 *nfc=unorm2_getNFCInstance(errorCode); 55550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeSet emptySet; 55650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUNormalizer2Pointer fn2(unorm2_openFiltered(nfc, emptySet.toUSet(), errorCode)); 55750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode.logIfFailureAndReset("unorm2_openFiltered()")) { 55850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 55950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 56050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(fn2.isNull()) { 56150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalUNormalizer2Pointer failure"); 56250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 56350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 56450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif /* !UCONFIG_NO_NORMALIZATION */ 56550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 56627f654740f2a26ad62a5c155af9199af9e69b889claireho#if !UCONFIG_NO_IDNA 56727f654740f2a26ad62a5c155af9199af9e69b889claireho LocalUIDNAPointer idna(uidna_openUTS46(0, errorCode)); 56827f654740f2a26ad62a5c155af9199af9e69b889claireho if(errorCode.logIfFailureAndReset("uidna_openUTS46()")) { 56927f654740f2a26ad62a5c155af9199af9e69b889claireho return; 57027f654740f2a26ad62a5c155af9199af9e69b889claireho } 57127f654740f2a26ad62a5c155af9199af9e69b889claireho if(idna.isNull()) { 57227f654740f2a26ad62a5c155af9199af9e69b889claireho errln("LocalUIDNAPointer failure"); 57327f654740f2a26ad62a5c155af9199af9e69b889claireho return; 57427f654740f2a26ad62a5c155af9199af9e69b889claireho } 57527f654740f2a26ad62a5c155af9199af9e69b889claireho#endif /* !UCONFIG_NO_IDNA */ 57627f654740f2a26ad62a5c155af9199af9e69b889claireho 57750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_REGULAR_EXPRESSIONS 57850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString pattern=UNICODE_STRING_SIMPLE("abc|xy+z"); 57950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalURegularExpressionPointer regex( 58050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_open(pattern.getBuffer(), pattern.length(), 0, NULL, errorCode)); 58150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode.logIfFailureAndReset("uregex_open()")) { 58250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 58350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 58450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(regex.isNull()) { 58550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalURegularExpressionPointer failure"); 58650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 58750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 58850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */ 58950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 59050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_TRANSLITERATION 59150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString id=UNICODE_STRING_SIMPLE("Grek-Latn"); 59250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUTransliteratorPointer trans( 59350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utrans_openU(id.getBuffer(), id.length(), UTRANS_FORWARD, NULL, 0, NULL, errorCode)); 59450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode.logIfFailureAndReset("utrans_open()")) { 59550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 59650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 59750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(trans.isNull()) { 59850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("LocalUTransliteratorPointer failure"); 59950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 60050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 60150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif /* !UCONFIG_NO_TRANSLITERATION */ 60250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 60350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // destructors 60450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 60550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 606c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid LocalPointerTest::TestLocalXyzPointerMoveSwap() { 607c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#if !UCONFIG_NO_NORMALIZATION 608c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerMoveSwap"); 609c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const UNormalizer2 *nfc=unorm2_getNFCInstance(errorCode); 610c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const UNormalizer2 *nfd=unorm2_getNFDInstance(errorCode); 611c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(errorCode.logIfFailureAndReset("unorm2_getNF[CD]Instance()")) { 612c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 613c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 614c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeSet emptySet; 615c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UNormalizer2 *p1 = unorm2_openFiltered(nfc, emptySet.toUSet(), errorCode); 616c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UNormalizer2 *p2 = unorm2_openFiltered(nfd, emptySet.toUSet(), errorCode); 617c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalUNormalizer2Pointer f1(p1); 618c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalUNormalizer2Pointer f2(p2); 619c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(errorCode.logIfFailureAndReset("unorm2_openFiltered()")) { 620c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 621c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 622c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(f1.isNull() || f2.isNull()) { 623c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalUNormalizer2Pointer failure"); 624c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 625c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 626c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert f1.swap(f2); 627c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(f1.getAlias() != p2 || f2.getAlias() != p1) { 628c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalUNormalizer2Pointer.swap() did not swap"); 629c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 630c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert swap(f1, f2); 631c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(f1.getAlias() != p1 || f2.getAlias() != p2) { 632c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("swap(LocalUNormalizer2Pointer) did not swap back"); 633c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 634c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalUNormalizer2Pointer f3; 635c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert f3.moveFrom(f1); 636c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(f3.getAlias() != p1 || f1.isValid()) { 637c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalUNormalizer2Pointer.moveFrom() did not move"); 638c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 639c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert infoln("TestLocalXyzPointerMoveSwap() with rvalue references"); 640c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert f1 = static_cast<LocalUNormalizer2Pointer &&>(f3); 641c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(f1.getAlias() != p1 || f3.isValid()) { 642c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalUNormalizer2Pointer move assignment operator did not move"); 643c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 644c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert LocalUNormalizer2Pointer f4(static_cast<LocalUNormalizer2Pointer &&>(f2)); 645c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(f4.getAlias() != p2 || f2.isValid()) { 646c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("LocalUNormalizer2Pointer move constructor did not move"); 647c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 648c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Move self assignment leaves the object valid but in an undefined state. 649c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Do it to make sure there is no crash, 650c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // but do not check for any particular resulting value. 651c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert f1.moveFrom(f1); 652c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert f3.moveFrom(f3); 653c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif /* !UCONFIG_NO_NORMALIZATION */ 654c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert} 655c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 65650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Try LocalXyzPointer types with NULL pointers. 65750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid LocalPointerTest::TestLocalXyzPointerNull() { 65850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 65950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUConverterSelectorPointer"); 66050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const char *const encoding="ISO-8859-1"; 66150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUConverterSelectorPointer null; 66250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUConverterSelectorPointer sel( 66350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ucnvsel_open(&encoding, 1, NULL, UCNV_ROUNDTRIP_SET, errorCode)); 66450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho sel.adoptInstead(NULL); 66550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 66650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FORMATTING 66750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 66850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUCalendarPointer"); 66950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUCalendarPointer null; 67050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUCalendarPointer cal(ucal_open(NULL, 0, "root", UCAL_GREGORIAN, errorCode)); 67150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(!errorCode.logDataIfFailureAndReset("ucal_open()")) { 67250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho cal.adoptInstead(NULL); 67350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 67450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 67550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 67650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUDateTimePatternGeneratorPointer"); 67750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUDateTimePatternGeneratorPointer null; 67850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUDateTimePatternGeneratorPointer patgen(udatpg_open("root", errorCode)); 67950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho patgen.adoptInstead(NULL); 68050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 68150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 68250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUMessageFormatPointer"); 68350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString hello=UNICODE_STRING_SIMPLE("Hello {0}!"); 68450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUMessageFormatPointer null; 68550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUMessageFormatPointer msg( 68650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho umsg_open(hello.getBuffer(), hello.length(), "root", NULL, errorCode)); 68750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho msg.adoptInstead(NULL); 68850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 68950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif /* !UCONFIG_NO_FORMATTING */ 69050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 69150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_REGULAR_EXPRESSIONS 69250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 69350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalURegularExpressionPointer"); 69450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString pattern=UNICODE_STRING_SIMPLE("abc|xy+z"); 69550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalURegularExpressionPointer null; 69650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalURegularExpressionPointer regex( 69750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_open(pattern.getBuffer(), pattern.length(), 0, NULL, errorCode)); 69850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(!errorCode.logDataIfFailureAndReset("urege_open()")) { 69950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regex.adoptInstead(NULL); 70050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 70150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 70250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif /* !UCONFIG_NO_REGULAR_EXPRESSIONS */ 70350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 70450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_TRANSLITERATION 70550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 70650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUTransliteratorPointer"); 70750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString id=UNICODE_STRING_SIMPLE("Grek-Latn"); 70850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUTransliteratorPointer null; 70950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUTransliteratorPointer trans( 71050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utrans_openU(id.getBuffer(), id.length(), UTRANS_FORWARD, NULL, 0, NULL, errorCode)); 71150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(!errorCode.logDataIfFailureAndReset("utrans_openU()")) { 71250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho trans.adoptInstead(NULL); 71350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 71450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 71550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif /* !UCONFIG_NO_TRANSLITERATION */ 71650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 717b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 7188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 7198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius/** EnumSet test **/ 7208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "unicode/enumset.h" 7218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 7228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusclass EnumSetTest : public IntlTest { 7238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliuspublic: 7248393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius EnumSetTest() {} 7258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius virtual void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=NULL); 7268393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius void TestEnumSet(); 7278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}; 7288393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 7298393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusstatic IntlTest *createEnumSetTest() { 7308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return new EnumSetTest(); 7318393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius} 7328393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 7338393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusvoid EnumSetTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) { 7348393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TESTCASE_AUTO_BEGIN; 7358393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TESTCASE_AUTO(TestEnumSet); 7368393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TESTCASE_AUTO_END; 7378393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius} 7388393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusenum myEnum { 7398393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius MAX_NONBOOLEAN=-1, 7408393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius THING1, 7418393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius THING2, 7428393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius THING3, 7438393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius LIMIT_BOOLEAN 7448393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}; 7458393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 7468393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusvoid EnumSetTest::TestEnumSet() { 7478393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius EnumSet<myEnum, 7488393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius MAX_NONBOOLEAN+1, 7498393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius LIMIT_BOOLEAN> 7508393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius flags; 7518393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 7528393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("Enum is from [%d..%d]\n", MAX_NONBOOLEAN+1, 7538393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius LIMIT_BOOLEAN); 7548393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 7558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING1) == FALSE); 7568393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); 7578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING3) == FALSE); 7588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 7598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3)); 7608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("Value now: %d\n", flags.getAll()); 7618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius flags.clear(); 7628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("clear -Value now: %d\n", flags.getAll()); 7638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3)); 7648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING1) == FALSE); 7658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); 7668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING3) == FALSE); 7678393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius flags.add(THING1); 7688393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("set THING1 -Value now: %d\n", flags.getAll()); 7698393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING1) == TRUE); 7708393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); 7718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING3) == FALSE); 7728393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3)); 7738393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius flags.add(THING3); 7748393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("set THING3 -Value now: %d\n", flags.getAll()); 7758393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING1) == TRUE); 7768393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); 7778393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING3) == TRUE); 7788393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3)); 7798393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius flags.remove(THING2); 7808393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING1) == TRUE); 7818393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); 7828393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING3) == TRUE); 7838393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("remove THING2 -Value now: %d\n", flags.getAll()); 7848393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3)); 7858393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius flags.remove(THING1); 7868393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING1) == FALSE); 7878393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); 7888393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING3) == TRUE); 7898393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("remove THING1 -Value now: %d\n", flags.getAll()); 7908393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3)); 7918393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 7928393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius flags.clear(); 7938393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("clear -Value now: %d\n", flags.getAll()); 7948393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n", flags.get(THING1), flags.get(THING2), flags.get(THING3)); 7958393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING1) == FALSE); 7968393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING2) == FALSE); 7978393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius TEST_ASSERT_TRUE(flags.get(THING3) == FALSE); 7988393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius} 799