1b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/********************************************************************
2b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * COPYRIGHT:
3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 2011, International Business Machines Corporation and
4b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * others. All Rights Reserved.
5b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ********************************************************************/
6b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//
7b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//   file:  alphaindex.cpp
8b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//          Alphabetic Index Tests.
9b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//
10b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "intltest.h"
11b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "alphaindextst.h"
12b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
13b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/alphaindex.h"
14b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/coll.h"
15b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/tblcoll.h"
16b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/uniset.h"
17b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
18b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// #include <string>
19b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// #include <iostream>
20b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
21b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoAlphabeticIndexTest::AlphabeticIndexTest() {
22b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
23b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
24b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoAlphabeticIndexTest::~AlphabeticIndexTest() {
25b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
26b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
27b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid AlphabeticIndexTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
28b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
29b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (exec) logln("TestSuite AlphabeticIndex: ");
30b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    switch (index) {
31b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
32b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        case 0: name = "APITest";
33b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (exec) APITest();
34b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
35b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
36b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        case 1: name = "ManyLocales";
37b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (exec) ManyLocalesTest();
38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
39b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
40b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        case 2: name = "HackPinyinTest";
41b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (exec) HackPinyinTest();
42b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
43b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
44b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        default: name = "";
45b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break; //needed to end loop
46b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
47b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
48b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
49b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define TEST_CHECK_STATUS {if (U_FAILURE(status)) {dataerrln("%s:%d: Test failure.  status=%s", \
50b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                                              __FILE__, __LINE__, u_errorName(status)); return;}}
51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define TEST_ASSERT(expr) {if ((expr)==FALSE) {errln("%s:%d: Test failure \n", __FILE__, __LINE__);};}
53b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//
55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//  APITest.   Invoke every function at least once, and check that it does something.
56b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//             Does not attempt to check complete functionality.
57b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//
58b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid AlphabeticIndexTest::APITest() {
59b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
60b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //
61b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //  Simple constructor and destructor,  getBucketCount()
62b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //
63b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
64b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t lc = 0;
65b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t i  = 0;
66b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    AlphabeticIndex *index = new AlphabeticIndex(Locale::getEnglish(), status);
67b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
68b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    lc = index->getBucketCount(status);
69b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
70b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(28 == lc);    // 26 letters plus two under/overflow labels.
71b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //printf("getBucketCount() == %d\n", lc);
72b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete index;
73b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
74b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // addLabels()
75b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
76b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
77b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index = new AlphabeticIndex(Locale::getEnglish(), status);
78b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
79b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeSet additions;
80b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    additions.add((UChar32)0x410).add((UChar32)0x415);   // A couple of Cyrillic letters
81b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->addLabels(additions, status);
82b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
83b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    lc = index->getBucketCount(status);
84b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // TODO:  should get 31.  Java also gives 30.  Needs fixing
86b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(30 == lc);    // 26 Latin letters plus
87b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // TEST_ASSERT(31 == lc);    // 26 Latin letters plus
88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                              //  2 Cyrillic letters plus
89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                              //  1 inflow label plus
90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                              //  two under/overflow labels.
91b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // std::cout << lc << std::endl;
92b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete index;
93b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
94b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
95b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // addLabels(Locale)
96b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
97b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
98b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index = new AlphabeticIndex(Locale::getEnglish(), status);
99b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    AlphabeticIndex &aip = index->addLabels(Locale::getJapanese(), status);
101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(&aip == index);
102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    lc = index->getBucketCount(status);
104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(35 < lc);  // Japanese should add a bunch.  Don't rely on the exact value.
106b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete index;
107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
108b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // GetCollator(),  Get under/in/over flow labels
109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
110b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
111b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index = new AlphabeticIndex(Locale::getGerman(), status);
112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    Collator *germanCol = Collator::createInstance(Locale::getGerman(), status);
114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
115b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const RuleBasedCollator &indexCol = index->getCollator();
116b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(*germanCol == indexCol);
117b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete germanCol;
118b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeString ELLIPSIS;  ELLIPSIS.append((UChar32)0x2026);
120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeString s = index->getUnderflowLabel();
121b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(ELLIPSIS == s);
122b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    s = index->getOverflowLabel();
123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(ELLIPSIS == s);
124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    s = index->getInflowLabel();
125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(ELLIPSIS == s);
126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->setOverflowLabel(UNICODE_STRING_SIMPLE("O"), status);
127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->setUnderflowLabel(UNICODE_STRING_SIMPLE("U"), status).setInflowLabel(UNICODE_STRING_SIMPLE("I"), status);
128b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    s = index->getUnderflowLabel();
129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(UNICODE_STRING_SIMPLE("U") == s);
130b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    s = index->getOverflowLabel();
131b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(UNICODE_STRING_SIMPLE("O") == s);
132b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    s = index->getInflowLabel();
133b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(UNICODE_STRING_SIMPLE("I") == s);
134b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
135b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
137b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
138b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete index;
139b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
140b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
141b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
142b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UnicodeString adam = UNICODE_STRING_SIMPLE("Adam");
143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UnicodeString baker = UNICODE_STRING_SIMPLE("Baker");
144b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UnicodeString charlie = UNICODE_STRING_SIMPLE("Charlie");
145b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UnicodeString chad = UNICODE_STRING_SIMPLE("Chad");
146b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UnicodeString zed  = UNICODE_STRING_SIMPLE("Zed");
147b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UnicodeString Cyrillic = UNICODE_STRING_SIMPLE("\\u0410\\u0443\\u0435").unescape();
148b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
149b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // addRecord(), verify that it comes back out.
150b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //
151b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
152b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index = new AlphabeticIndex(Locale::getEnglish(), status);
153b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->addRecord(UnicodeString("Adam"), this, status);
155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool   b;
156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
157b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->resetBucketIterator(status);
158b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
159b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->nextBucket(status);  // Move to underflow label
160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->nextBucket(status);  // Move to "A"
161b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UnicodeString &label2 = index->getBucketLabel();
163b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeString A_STR = UNICODE_STRING_SIMPLE("A");
164b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(A_STR == label2);
165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    b = index->nextRecord(status);
167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(b);
169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UnicodeString &itemName = index->getRecordName();
170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(adam == itemName);
171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const void *itemContext = index->getRecordData();
173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(itemContext == this);
174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete index;
176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // clearRecords, addRecord(), Iteration
178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index = new AlphabeticIndex(Locale::getEnglish(), status);
181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while (index->nextBucket(status)) {
183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_CHECK_STATUS;
184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        while (index->nextRecord(status)) {
185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_CHECK_STATUS;
186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_ASSERT(FALSE);   // No items have been added.
187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_CHECK_STATUS;
189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->addRecord(adam, NULL, status);
192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->addRecord(baker, NULL, status);
193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->addRecord(charlie, NULL, status);
194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->addRecord(chad, NULL, status);
195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int itemCount = 0;
197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->resetBucketIterator(status);
198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while (index->nextBucket(status)) {
199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_CHECK_STATUS;
200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        while (index->nextRecord(status)) {
201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_CHECK_STATUS;
202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            ++itemCount;
203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(itemCount == 4);
207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(index->nextBucket(status) == FALSE);
209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->resetBucketIterator(status);
210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(index->nextBucket(status) == TRUE);
212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->clearRecords(status);
214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->resetBucketIterator(status);
216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while (index->nextBucket(status)) {
217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_CHECK_STATUS;
218b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        while (index->nextRecord(status)) {
219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_ASSERT(FALSE);   // No items have been added.
220b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
221b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
222b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
223b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete index;
224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // getBucketLabel(), getBucketType()
226b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
228b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index = new AlphabeticIndex(Locale::getEnglish(), status);
229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index->setUnderflowLabel(adam, status).setOverflowLabel(charlie, status);
231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (i=0; index->nextBucket(status); i++) {
233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_CHECK_STATUS;
234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString label = index->getBucketLabel();
235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UAlphabeticIndexLabelType type = index->getBucketLabelType();
236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (i == 0) {
237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_ASSERT(type == U_ALPHAINDEX_UNDERFLOW);
238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_ASSERT(label == adam);
239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else if (i <= 26) {
240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            // Labels A - Z for English locale
241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_ASSERT(type == U_ALPHAINDEX_NORMAL);
242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UnicodeString expectedLabel((UChar)(0x40 + i));
243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_ASSERT(expectedLabel == label);
244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else if (i == 27) {
245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_ASSERT(type == U_ALPHAINDEX_OVERFLOW);
246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_ASSERT(label == charlie);
247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_ASSERT(FALSE);
249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(i==28);
252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete index;
253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // getBucketIndex()
255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index = new AlphabeticIndex(Locale::getEnglish(), status);
258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t n = index->getBucketIndex(adam, status);
260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(n == 1);    /*  Label #0 is underflow, 1 is A, etc. */
262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    n = index->getBucketIndex(baker, status);
263b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(n == 2);
264b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    n = index->getBucketIndex(Cyrillic, status);
265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(n == 27);   // Overflow label
266b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    n = index->getBucketIndex(zed, status);
267b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(n == 26);
268b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
269b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (i=0; index->nextBucket(status); i++) {
270b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        n = index->getBucketIndex();
271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_ASSERT(n == i);
272b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString label = index->getBucketLabel();
273b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_ASSERT(n == i);
274b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
275b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(i == 28);
276b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
277b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete index;
278b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    index = new AlphabeticIndex(Locale::createFromName("ru"), status);
279b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        //Locale loc = Locale::createFromName(localeName);
280b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
281b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    n = index->getBucketIndex(adam, status);
282b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
283b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(n == 0);    //  Label #0 is underflow
284b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    n = index->getBucketIndex(baker, status);
285b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(n == 0);
286b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    n = index->getBucketIndex(Cyrillic, status);
287b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(n == 1);   // Overflow label
288b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    n = index->getBucketIndex(zed, status);
289b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(n == 0);
290b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
291b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete index;
292b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
293b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
294b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
295b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
296b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const char * KEY_LOCALES[] = {
297b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "en", "es", "de", "fr", "ja", "it", "tr", "pt", "zh", "nl",
298b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "pl", "ar", "ru", "zh_Hant", "ko", "th", "sv", "fi", "da",
299b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "he", "nb", "el", "hr", "bg", "sk", "lt", "vi", "lv", "sr",
300b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "pt_PT", "ro", "hu", "cs", "id", "sl", "fil", "fa", "uk",
301b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "ca", "hi", "et", "eu", "is", "sw", "ms", "bn", "am", "ta",
302b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "te", "mr", "ur", "ml", "kn", "gu", "or", ""};
303b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
304b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
305b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid AlphabeticIndexTest::ManyLocalesTest() {
306b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
307b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t  lc = 0;
308b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    AlphabeticIndex *index = NULL;
309b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
310b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (int i=0; ; ++i) {
311b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        status = U_ZERO_ERROR;
312b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        const char *localeName = KEY_LOCALES[i];
313b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (localeName[0] == 0) {
314b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
315b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
316b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // std::cout <<  localeName << "  ";
317b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        Locale loc = Locale::createFromName(localeName);
318b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        index = new AlphabeticIndex(loc, status);
319b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_CHECK_STATUS;
320b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        lc = index->getBucketCount(status);
321b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_CHECK_STATUS;
322b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // std::cout << "getBucketCount() == " << lc << std::endl;
323b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
324b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        while (index->nextBucket(status)) {
325b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_CHECK_STATUS;
326b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            const UnicodeString &label = index->getBucketLabel();
327b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TEST_ASSERT(label.length()>0);
328b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            // std::string ss;
329b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            // std::cout << ":" << label.toUTF8String(ss);
330b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
331b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // std::cout << ":" << std::endl;
332b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
333b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
334b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete index;
335b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
336b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
337b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
338b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
339b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// Test data for Pinyin based indexes.
340b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//  The Chinese characters should be distributed under latin labels in
341b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//  an index.
342b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
343b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const char *pinyinTestData[] = {
344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "\\u0101", "\\u5416", "\\u58ba", //
345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "b", "\\u516b", "\\u62d4", "\\u8500", //
346b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "c", "\\u5693", "\\u7938", "\\u9e7e", //
347b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "d", "\\u5491", "\\u8fcf", "\\u964a", //
348b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "\\u0113","\\u59b8", "\\u92e8", "\\u834b", //
349b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "f", "\\u53d1", "\\u9197", "\\u99a5", //
350b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "g", "\\u7324", "\\u91d3", "\\u8142", //
351b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "h", "\\u598e", "\\u927f", "\\u593b", //
352b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "j", "\\u4e0c", "\\u6785", "\\u9d58", //
353b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "k", "\\u5494", "\\u958b", "\\u7a52", //
354b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "l", "\\u5783", "\\u62c9", "\\u9ba5", //
355b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "m", "\\u5638", "\\u9ebb", "\\u65c0", //
356b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "n", "\\u62ff", "\\u80ad", "\\u685b", //
357b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "\\u014D", "\\u5662", "\\u6bee", "\\u8bb4", //
358b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "p", "\\u5991", "\\u8019", "\\u8c31", //
359b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "q", "\\u4e03", "\\u6053", "\\u7f56", //
360b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "r", "\\u5465", "\\u72aa", "\\u6e03", //
361b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "s", "\\u4ee8", "\\u9491", "\\u93c1", //
362b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "t", "\\u4ed6", "\\u9248", "\\u67dd", //
363b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "w", "\\u5c72", "\\u5558", "\\u5a7a", //
364b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "x", "\\u5915", "\\u5438", "\\u6bbe", //
365b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "y", "\\u4e2b", "\\u82bd", "\\u8574", //
366b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "z", "\\u5e00", "\\u707d", "\\u5c0a",
367b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        NULL
368b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
370b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid AlphabeticIndexTest::HackPinyinTest() {
371b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
372b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    AlphabeticIndex aindex(Locale::createFromName("zh"), status);
373b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS;
374b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
375b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeString names[sizeof(pinyinTestData) / sizeof(pinyinTestData[0])];
376b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t  nameCount;
377b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (nameCount=0; pinyinTestData[nameCount] != NULL; nameCount++) {
378b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        names[nameCount] = UnicodeString(pinyinTestData[nameCount], -1, UnicodeString::kInvariant).unescape();
379b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        aindex.addRecord(names[nameCount], &names[nameCount], status);
380b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_CHECK_STATUS;
381b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)) {
382b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return;
383b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
384b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
385b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(nameCount == aindex.getRecordCount(status));
386b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
387b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Weak checking:  make sure that none of the Chinese names landed in the overflow bucket
388b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //   of the index, and that the names are distributed among several buckets.
389b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //   (Exact expected data would be subject to change with evolution of the collation rules.)
390b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
391b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t bucketCount = 0;
392b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t filledBucketCount = 0;
393b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while (aindex.nextBucket(status)) {
394b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        bucketCount++;
395b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString label = aindex.getBucketLabel();
396b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // std::string s;
397b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // std::cout << label.toUTF8String(s) << ":  ";
398b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
399b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UBool  bucketHasContents = FALSE;
400b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        while (aindex.nextRecord(status)) {
401b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            bucketHasContents = TRUE;
402b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UnicodeString name = aindex.getRecordName();
403b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (aindex.getBucketLabelType() != U_ALPHAINDEX_NORMAL) {
404b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("File %s, Line %d, Name \"\\u%x\" is in an under or overflow bucket.",
405b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    __FILE__, __LINE__, name.char32At(0));
406b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
407b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            // s.clear();
408b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            // std::cout << aindex.getRecordName().toUTF8String(s) << " ";
409b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
410b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (bucketHasContents) {
411b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            filledBucketCount++;
412b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
413b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // std::cout << std::endl;
414b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
415b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(bucketCount > 25);
416b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(filledBucketCount > 15);
417b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
418