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