Home | History | Annotate | Download | only in intltest
      1 /********************************************************************
      2  * COPYRIGHT:
      3  * Copyright (c) 1997-2012, International Business Machines Corporation and
      4  * others. All Rights Reserved.
      5  ********************************************************************/
      6 
      7 
      8 /**
      9  * IntlTestUtilities is the medium level test class for everything in the directory "utility".
     10  */
     11 
     12 #include "unicode/utypes.h"
     13 #include "unicode/errorcode.h"
     14 #include "unicode/localpointer.h"
     15 #include "itutil.h"
     16 #include "strtest.h"
     17 #include "loctest.h"
     18 #include "citrtest.h"
     19 #include "ustrtest.h"
     20 #include "ucdtest.h"
     21 #include "restest.h"
     22 #include "restsnew.h"
     23 #include "tsmthred.h"
     24 #include "tsputil.h"
     25 #include "uobjtest.h"
     26 #include "utxttest.h"
     27 #include "v32test.h"
     28 #include "uvectest.h"
     29 #include "aliastst.h"
     30 #include "usettest.h"
     31 
     32 extern IntlTest *createBytesTrieTest();
     33 static IntlTest *createLocalPointerTest();
     34 extern IntlTest *createUCharsTrieTest();
     35 static IntlTest *createEnumSetTest();
     36 
     37 #define CASE(id, test) case id:                               \
     38                           name = #test;                       \
     39                           if (exec) {                         \
     40                               logln(#test "---"); logln();    \
     41                               test t;                         \
     42                               callTest(t, par);               \
     43                           }                                   \
     44                           break
     45 
     46 void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par )
     47 {
     48     if (exec) logln("TestSuite Utilities: ");
     49     switch (index) {
     50         CASE(0, MultithreadTest);
     51         CASE(1, StringTest);
     52         CASE(2, UnicodeStringTest);
     53         CASE(3, LocaleTest);
     54         CASE(4, CharIterTest);
     55         CASE(5, UObjectTest);
     56         CASE(6, UnicodeTest);
     57         CASE(7, ResourceBundleTest);
     58         CASE(8, NewResourceBundleTest);
     59         CASE(9, PUtilTest);
     60         CASE(10, UVector32Test);
     61         CASE(11, UVectorTest);
     62         CASE(12, UTextTest);
     63         CASE(13, LocaleAliasTest);
     64         CASE(14, UnicodeSetTest);
     65         CASE(15, ErrorCodeTest);
     66         case 16:
     67             name = "LocalPointerTest";
     68             if (exec) {
     69                 logln("TestSuite LocalPointerTest---"); logln();
     70                 LocalPointer<IntlTest> test(createLocalPointerTest());
     71                 callTest(*test, par);
     72             }
     73             break;
     74         case 17:
     75             name = "BytesTrieTest";
     76             if (exec) {
     77                 logln("TestSuite BytesTrieTest---"); logln();
     78                 LocalPointer<IntlTest> test(createBytesTrieTest());
     79                 callTest(*test, par);
     80             }
     81             break;
     82         case 18:
     83             name = "UCharsTrieTest";
     84             if (exec) {
     85                 logln("TestSuite UCharsTrieTest---"); logln();
     86                 LocalPointer<IntlTest> test(createUCharsTrieTest());
     87                 callTest(*test, par);
     88             }
     89             break;
     90         case 19:
     91             name = "EnumSetTest";
     92             if (exec) {
     93                 logln("TestSuite EnumSetTest---"); logln();
     94                 LocalPointer<IntlTest> test(createEnumSetTest());
     95                 callTest(*test, par);
     96             }
     97             break;
     98         default: name = ""; break; //needed to end loop
     99     }
    100 }
    101 
    102 void ErrorCodeTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) {
    103     if (exec) logln("TestSuite Utilities: ");
    104     switch (index) {
    105         case 0: name = "TestErrorCode"; if (exec) TestErrorCode(); break;
    106         case 1: name = "TestSubclass"; if (exec) TestSubclass(); break;
    107         default: name = ""; break; //needed to end loop
    108     }
    109 }
    110 
    111 static void RefPlusOne(UErrorCode &code) { code=(UErrorCode)(code+1); }
    112 static void PtrPlusTwo(UErrorCode *code) { *code=(UErrorCode)(*code+2); }
    113 
    114 void ErrorCodeTest::TestErrorCode() {
    115     ErrorCode errorCode;
    116     if(errorCode.get()!=U_ZERO_ERROR || !errorCode.isSuccess() || errorCode.isFailure()) {
    117         errln("ErrorCode did not initialize properly");
    118         return;
    119     }
    120     errorCode.assertSuccess();
    121     if(errorCode.errorName()!=u_errorName(U_ZERO_ERROR)) {
    122         errln("ErrorCode did not format error message string properly");
    123     }
    124     RefPlusOne(errorCode);
    125     if(errorCode.get()!=U_ILLEGAL_ARGUMENT_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) {
    126         errln("ErrorCode did not yield a writable reference");
    127     }
    128     PtrPlusTwo(errorCode);
    129     if(errorCode.get()!=U_INVALID_FORMAT_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) {
    130         errln("ErrorCode did not yield a writable pointer");
    131     }
    132     errorCode.set(U_PARSE_ERROR);
    133     if(errorCode.get()!=U_PARSE_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) {
    134         errln("ErrorCode.set() failed");
    135     }
    136     if( errorCode.reset()!=U_PARSE_ERROR || errorCode.get()!=U_ZERO_ERROR ||
    137         !errorCode.isSuccess() || errorCode.isFailure()
    138     ) {
    139         errln("ErrorCode did not reset properly");
    140     }
    141 }
    142 
    143 class MyErrorCode: public ErrorCode {
    144 public:
    145     MyErrorCode(int32_t &countChecks, int32_t &countDests)
    146         : checks(countChecks), dests(countDests) {}
    147     ~MyErrorCode() {
    148         if(isFailure()) {
    149             ++dests;
    150         }
    151     }
    152 private:
    153     virtual void handleFailure() const {
    154         ++checks;
    155     }
    156     int32_t &checks;
    157     int32_t &dests;
    158 };
    159 
    160 void ErrorCodeTest::TestSubclass() {
    161     int32_t countChecks=0;
    162     int32_t countDests=0;
    163     {
    164         MyErrorCode errorCode(countChecks, countDests);
    165         if( errorCode.get()!=U_ZERO_ERROR || !errorCode.isSuccess() || errorCode.isFailure() ||
    166             countChecks!=0 || countDests!=0
    167         ) {
    168             errln("ErrorCode did not initialize properly");
    169             return;
    170         }
    171         errorCode.assertSuccess();
    172         if(countChecks!=0) {
    173             errln("ErrorCode.assertSuccess() called handleFailure() despite success");
    174         }
    175         RefPlusOne(errorCode);
    176         if(errorCode.get()!=U_ILLEGAL_ARGUMENT_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) {
    177             errln("ErrorCode did not yield a writable reference");
    178         }
    179         errorCode.assertSuccess();
    180         if(countChecks!=1) {
    181             errln("ErrorCode.assertSuccess() did not handleFailure()");
    182         }
    183         PtrPlusTwo(errorCode);
    184         if(errorCode.get()!=U_INVALID_FORMAT_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) {
    185             errln("ErrorCode did not yield a writable pointer");
    186         }
    187         errorCode.assertSuccess();
    188         if(countChecks!=2) {
    189             errln("ErrorCode.assertSuccess() did not handleFailure()");
    190         }
    191         errorCode.set(U_PARSE_ERROR);
    192         if(errorCode.get()!=U_PARSE_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) {
    193             errln("ErrorCode.set() failed");
    194         }
    195         if( errorCode.reset()!=U_PARSE_ERROR || errorCode.get()!=U_ZERO_ERROR ||
    196             !errorCode.isSuccess() || errorCode.isFailure()
    197         ) {
    198             errln("ErrorCode did not reset properly");
    199         }
    200         errorCode.assertSuccess();
    201         if(countChecks!=2) {
    202             errln("ErrorCode.assertSuccess() called handleFailure() despite success");
    203         }
    204     }
    205     if(countDests!=0) {
    206         errln("MyErrorCode destructor detected failure despite success");
    207     }
    208     countChecks=countDests=0;
    209     {
    210         MyErrorCode errorCode(countChecks, countDests);
    211         errorCode.set(U_PARSE_ERROR);
    212     }
    213     if(countDests!=1) {
    214         errln("MyErrorCode destructor failed to detect failure");
    215     }
    216 }
    217 
    218 class LocalPointerTest : public IntlTest {
    219 public:
    220     LocalPointerTest() {}
    221 
    222     void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=NULL);
    223 
    224     void TestLocalPointer();
    225     void TestLocalArray();
    226     void TestLocalXyzPointer();
    227     void TestLocalXyzPointerNull();
    228 };
    229 
    230 static IntlTest *createLocalPointerTest() {
    231     return new LocalPointerTest();
    232 }
    233 
    234 void LocalPointerTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) {
    235     if(exec) {
    236         logln("TestSuite LocalPointerTest: ");
    237     }
    238     switch (index) {
    239         TESTCASE(0, TestLocalPointer);
    240         TESTCASE(1, TestLocalArray);
    241         TESTCASE(2, TestLocalXyzPointer);
    242         TESTCASE(3, TestLocalXyzPointerNull);
    243         default:
    244             name="";
    245             break; // needed to end the loop
    246     }
    247 }
    248 
    249 // Exercise every LocalPointer and LocalPointerBase method.
    250 void LocalPointerTest::TestLocalPointer() {
    251     // constructor
    252     LocalPointer<UnicodeString> s(new UnicodeString((UChar32)0x50005));
    253     // isNULL(), isValid(), operator==(), operator!=()
    254     if(s.isNull() || !s.isValid() || s==NULL || !(s!=NULL)) {
    255         errln("LocalPointer constructor or NULL test failure");
    256         return;
    257     }
    258     // getAlias(), operator->, operator*
    259     if(s.getAlias()->length()!=2 || s->length()!=2 || (*s).length()!=2) {
    260         errln("LocalPointer access failure");
    261     }
    262     // adoptInstead(), orphan()
    263     s.adoptInstead(new UnicodeString((UChar)0xfffc));
    264     if(s->length()!=1) {
    265         errln("LocalPointer adoptInstead(U+FFFC) failure");
    266     }
    267     UnicodeString *orphan=s.orphan();
    268     if(orphan==NULL || orphan->length()!=1 || s.isValid() || s!=NULL) {
    269         errln("LocalPointer orphan() failure");
    270     }
    271     delete orphan;
    272     // destructor
    273     s.adoptInstead(new UnicodeString());
    274     if(s->length()!=0) {
    275         errln("LocalPointer adoptInstead(empty) failure");
    276     }
    277 }
    278 
    279 // Exercise every LocalArray method (but not LocalPointerBase).
    280 void LocalPointerTest::TestLocalArray() {
    281     // constructor
    282     LocalArray<UnicodeString> a(new UnicodeString[2]);
    283     // operator[]()
    284     a[0].append((UChar)0x61);
    285     a[1].append((UChar32)0x60006);
    286     if(a[0].length()!=1 || a[1].length()!=2) {
    287         errln("LocalArray access failure");
    288     }
    289     // adoptInstead()
    290     a.adoptInstead(new UnicodeString[4]);
    291     a[3].append((UChar)0x62).append((UChar)0x63).reverse();
    292     if(a[3].length()!=2 || a[3][1]!=0x62) {
    293         errln("LocalArray adoptInstead() failure");
    294     }
    295     // destructor
    296 }
    297 
    298 #include "unicode/ucnvsel.h"
    299 #include "unicode/ucal.h"
    300 #include "unicode/udatpg.h"
    301 #include "unicode/uidna.h"
    302 #include "unicode/uldnames.h"
    303 #include "unicode/umsg.h"
    304 #include "unicode/unorm2.h"
    305 #include "unicode/uregex.h"
    306 #include "unicode/utrans.h"
    307 
    308 // Use LocalXyzPointer types that are not covered elsewhere in the intltest suite.
    309 void LocalPointerTest::TestLocalXyzPointer() {
    310     IcuTestErrorCode errorCode(*this, "TestLocalXyzPointer");
    311 
    312     static const char *const encoding="ISO-8859-1";
    313     LocalUConverterSelectorPointer sel(
    314         ucnvsel_open(&encoding, 1, NULL, UCNV_ROUNDTRIP_SET, errorCode));
    315     if(errorCode.logIfFailureAndReset("ucnvsel_open()")) {
    316         return;
    317     }
    318     if(sel.isNull()) {
    319         errln("LocalUConverterSelectorPointer failure");
    320         return;
    321     }
    322 
    323 #if !UCONFIG_NO_FORMATTING
    324     LocalUCalendarPointer cal(ucal_open(NULL, 0, "root", UCAL_GREGORIAN, errorCode));
    325     if(errorCode.logDataIfFailureAndReset("ucal_open()")) {
    326         return;
    327     }
    328     if(cal.isNull()) {
    329         errln("LocalUCalendarPointer failure");
    330         return;
    331     }
    332 
    333     LocalUDateTimePatternGeneratorPointer patgen(udatpg_open("root", errorCode));
    334     if(errorCode.logDataIfFailureAndReset("udatpg_open()")) {
    335         return;
    336     }
    337     if(patgen.isNull()) {
    338         errln("LocalUDateTimePatternGeneratorPointer failure");
    339         return;
    340     }
    341 
    342     LocalULocaleDisplayNamesPointer ldn(uldn_open("de-CH", ULDN_STANDARD_NAMES, errorCode));
    343     if(errorCode.logIfFailureAndReset("uldn_open()")) {
    344         return;
    345     }
    346     if(ldn.isNull()) {
    347         errln("LocalULocaleDisplayNamesPointer failure");
    348         return;
    349     }
    350 
    351     UnicodeString hello=UNICODE_STRING_SIMPLE("Hello {0}!");
    352     LocalUMessageFormatPointer msg(
    353         umsg_open(hello.getBuffer(), hello.length(), "root", NULL, errorCode));
    354     if(errorCode.logIfFailureAndReset("umsg_open()")) {
    355         return;
    356     }
    357     if(msg.isNull()) {
    358         errln("LocalUMessageFormatPointer failure");
    359         return;
    360     }
    361 #endif  /* UCONFIG_NO_FORMATTING  */
    362 
    363 #if !UCONFIG_NO_NORMALIZATION
    364     const UNormalizer2 *nfc=unorm2_getNFCInstance(errorCode);
    365     UnicodeSet emptySet;
    366     LocalUNormalizer2Pointer fn2(unorm2_openFiltered(nfc, emptySet.toUSet(), errorCode));
    367     if(errorCode.logIfFailureAndReset("unorm2_openFiltered()")) {
    368         return;
    369     }
    370     if(fn2.isNull()) {
    371         errln("LocalUNormalizer2Pointer failure");
    372         return;
    373     }
    374 #endif /* !UCONFIG_NO_NORMALIZATION */
    375 
    376 #if !UCONFIG_NO_IDNA
    377     LocalUIDNAPointer idna(uidna_openUTS46(0, errorCode));
    378     if(errorCode.logIfFailureAndReset("uidna_openUTS46()")) {
    379         return;
    380     }
    381     if(idna.isNull()) {
    382         errln("LocalUIDNAPointer failure");
    383         return;
    384     }
    385 #endif  /* !UCONFIG_NO_IDNA */
    386 
    387 #if !UCONFIG_NO_REGULAR_EXPRESSIONS
    388     UnicodeString pattern=UNICODE_STRING_SIMPLE("abc|xy+z");
    389     LocalURegularExpressionPointer regex(
    390         uregex_open(pattern.getBuffer(), pattern.length(), 0, NULL, errorCode));
    391     if(errorCode.logIfFailureAndReset("uregex_open()")) {
    392         return;
    393     }
    394     if(regex.isNull()) {
    395         errln("LocalURegularExpressionPointer failure");
    396         return;
    397     }
    398 #endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */
    399 
    400 #if !UCONFIG_NO_TRANSLITERATION
    401     UnicodeString id=UNICODE_STRING_SIMPLE("Grek-Latn");
    402     LocalUTransliteratorPointer trans(
    403         utrans_openU(id.getBuffer(), id.length(), UTRANS_FORWARD, NULL, 0, NULL, errorCode));
    404     if(errorCode.logIfFailureAndReset("utrans_open()")) {
    405         return;
    406     }
    407     if(trans.isNull()) {
    408         errln("LocalUTransliteratorPointer failure");
    409         return;
    410     }
    411 #endif /* !UCONFIG_NO_TRANSLITERATION */
    412 
    413     // destructors
    414 }
    415 
    416 // Try LocalXyzPointer types with NULL pointers.
    417 void LocalPointerTest::TestLocalXyzPointerNull() {
    418     {
    419         IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUConverterSelectorPointer");
    420         static const char *const encoding="ISO-8859-1";
    421         LocalUConverterSelectorPointer null;
    422         LocalUConverterSelectorPointer sel(
    423             ucnvsel_open(&encoding, 1, NULL, UCNV_ROUNDTRIP_SET, errorCode));
    424         sel.adoptInstead(NULL);
    425     }
    426 #if !UCONFIG_NO_FORMATTING
    427     {
    428         IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUCalendarPointer");
    429         LocalUCalendarPointer null;
    430         LocalUCalendarPointer cal(ucal_open(NULL, 0, "root", UCAL_GREGORIAN, errorCode));
    431         if(!errorCode.logDataIfFailureAndReset("ucal_open()")) {
    432             cal.adoptInstead(NULL);
    433         }
    434     }
    435     {
    436         IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUDateTimePatternGeneratorPointer");
    437         LocalUDateTimePatternGeneratorPointer null;
    438         LocalUDateTimePatternGeneratorPointer patgen(udatpg_open("root", errorCode));
    439         patgen.adoptInstead(NULL);
    440     }
    441     {
    442         IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUMessageFormatPointer");
    443         UnicodeString hello=UNICODE_STRING_SIMPLE("Hello {0}!");
    444         LocalUMessageFormatPointer null;
    445         LocalUMessageFormatPointer msg(
    446             umsg_open(hello.getBuffer(), hello.length(), "root", NULL, errorCode));
    447         msg.adoptInstead(NULL);
    448     }
    449 #endif /* !UCONFIG_NO_FORMATTING */
    450 
    451 #if !UCONFIG_NO_REGULAR_EXPRESSIONS
    452     {
    453         IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalURegularExpressionPointer");
    454         UnicodeString pattern=UNICODE_STRING_SIMPLE("abc|xy+z");
    455         LocalURegularExpressionPointer null;
    456         LocalURegularExpressionPointer regex(
    457             uregex_open(pattern.getBuffer(), pattern.length(), 0, NULL, errorCode));
    458         if(!errorCode.logDataIfFailureAndReset("urege_open()")) {
    459             regex.adoptInstead(NULL);
    460         }
    461     }
    462 #endif /* !UCONFIG_NO_REGULAR_EXPRESSIONS */
    463 
    464 #if !UCONFIG_NO_TRANSLITERATION
    465     {
    466         IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerNull/LocalUTransliteratorPointer");
    467         UnicodeString id=UNICODE_STRING_SIMPLE("Grek-Latn");
    468         LocalUTransliteratorPointer null;
    469         LocalUTransliteratorPointer trans(
    470             utrans_openU(id.getBuffer(), id.length(), UTRANS_FORWARD, NULL, 0, NULL, errorCode));
    471         if(!errorCode.logDataIfFailureAndReset("utrans_openU()")) {
    472             trans.adoptInstead(NULL);
    473         }
    474     }
    475 #endif /* !UCONFIG_NO_TRANSLITERATION */
    476 
    477 }
    478 
    479 /** EnumSet test **/
    480 #include "unicode/enumset.h"
    481 
    482 class EnumSetTest : public IntlTest {
    483 public:
    484   EnumSetTest() {}
    485   virtual void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=NULL);
    486   void TestEnumSet();
    487 };
    488 
    489 static IntlTest *createEnumSetTest() {
    490     return new EnumSetTest();
    491 }
    492 
    493 void EnumSetTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) {
    494   TESTCASE_AUTO_BEGIN;
    495   TESTCASE_AUTO(TestEnumSet);
    496   TESTCASE_AUTO_END;
    497 }
    498 enum myEnum {
    499     MAX_NONBOOLEAN=-1,
    500     THING1,
    501     THING2,
    502     THING3,
    503     LIMIT_BOOLEAN
    504 };
    505 
    506 void EnumSetTest::TestEnumSet() {
    507     EnumSet<myEnum,
    508             MAX_NONBOOLEAN+1,
    509             LIMIT_BOOLEAN>
    510                             flags;
    511 
    512     logln("Enum is from [%d..%d]\n", MAX_NONBOOLEAN+1,
    513           LIMIT_BOOLEAN);
    514 
    515     TEST_ASSERT_TRUE(flags.get(THING1) == FALSE);
    516     TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
    517     TEST_ASSERT_TRUE(flags.get(THING3) == FALSE);
    518 
    519     logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n",          flags.get(THING1),          flags.get(THING2),          flags.get(THING3));
    520     logln("Value now: %d\n", flags.getAll());
    521     flags.clear();
    522     logln("clear -Value now: %d\n", flags.getAll());
    523     logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n",          flags.get(THING1),          flags.get(THING2),          flags.get(THING3));
    524     TEST_ASSERT_TRUE(flags.get(THING1) == FALSE);
    525     TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
    526     TEST_ASSERT_TRUE(flags.get(THING3) == FALSE);
    527     flags.add(THING1);
    528     logln("set THING1 -Value now: %d\n", flags.getAll());
    529     TEST_ASSERT_TRUE(flags.get(THING1) == TRUE);
    530     TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
    531     TEST_ASSERT_TRUE(flags.get(THING3) == FALSE);
    532     logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n",          flags.get(THING1),          flags.get(THING2),          flags.get(THING3));
    533     flags.add(THING3);
    534     logln("set THING3 -Value now: %d\n", flags.getAll());
    535     TEST_ASSERT_TRUE(flags.get(THING1) == TRUE);
    536     TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
    537     TEST_ASSERT_TRUE(flags.get(THING3) == TRUE);
    538     logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n",          flags.get(THING1),          flags.get(THING2),          flags.get(THING3));
    539     flags.remove(THING2);
    540     TEST_ASSERT_TRUE(flags.get(THING1) == TRUE);
    541     TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
    542     TEST_ASSERT_TRUE(flags.get(THING3) == TRUE);
    543     logln("remove THING2 -Value now: %d\n", flags.getAll());
    544     logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n",          flags.get(THING1),          flags.get(THING2),          flags.get(THING3));
    545     flags.remove(THING1);
    546     TEST_ASSERT_TRUE(flags.get(THING1) == FALSE);
    547     TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
    548     TEST_ASSERT_TRUE(flags.get(THING3) == TRUE);
    549     logln("remove THING1 -Value now: %d\n", flags.getAll());
    550     logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n",          flags.get(THING1),          flags.get(THING2),          flags.get(THING3));
    551 
    552     flags.clear();
    553     logln("clear -Value now: %d\n", flags.getAll());
    554     logln("get(thing1)=%d, get(thing2)=%d, get(thing3)=%d\n",          flags.get(THING1),          flags.get(THING2),          flags.get(THING3));
    555     TEST_ASSERT_TRUE(flags.get(THING1) == FALSE);
    556     TEST_ASSERT_TRUE(flags.get(THING2) == FALSE);
    557     TEST_ASSERT_TRUE(flags.get(THING3) == FALSE);
    558 }
    559