1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (c) 2004-2010, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//      Test parts of UVector and UStack
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "intltest.h"
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uvectest.h"
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uvector.h"
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "hash.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//  Test class boilerplate
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUVectorTest::UVectorTest()
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUVectorTest::~UVectorTest()
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid UVectorTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (exec) logln("TestSuite UVectorTest: ");
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 0: name = "UVector_API";
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) UVector_API();
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 1: name = "UStack_API";
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) UStack_API();
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 2: name = "Hashtable_API";
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) Hashtable_API();
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = "";
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break; //needed to end loop
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//   Error Checking / Reporting macros used in all of the tests.
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_CHECK_STATUS(status) \
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {\
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("UVectorTest failure at line %d.  status=%s\n", __LINE__, u_errorName(status));\
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;\
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_ASSERT(expr) \
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ((expr)==FALSE) {\
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("UVectorTest failure at line %d.\n", __LINE__);\
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
6950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int8_t U_CALLCONV
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUVectorTest_compareInt32(UHashTok key1, UHashTok key2) {
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (key1.integer > key2.integer) {
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 1;
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else if (key1.integer < key2.integer) {
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1;
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return 0;
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int8_t U_CALLCONV
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUVectorTest_compareCstrings(const UHashTok key1, const UHashTok key2) {
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return !strcmp((const char *)key1.pointer, (const char *)key2.pointer);
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//      UVector_API      Check for basic functionality of UVector.
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid UVectorTest::UVector_API() {
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode  status = U_ZERO_ERROR;
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UVector     *a;
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a = new UVector(status);
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_CHECK_STATUS(status);
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete a;
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a = new UVector(2000, status);
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_CHECK_STATUS(status);
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete a;
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a = new UVector(status);
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a->sortedInsert((int32_t)10, UVectorTest_compareInt32, status);
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a->sortedInsert((int32_t)20, UVectorTest_compareInt32, status);
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a->sortedInsert((int32_t)30, UVectorTest_compareInt32, status);
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a->sortedInsert((int32_t)15, UVectorTest_compareInt32, status);
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_CHECK_STATUS(status);
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(a->elementAti(0) == 10);
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(a->elementAti(1) == 15);
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(a->elementAti(2) == 20);
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(a->elementAti(3) == 30);
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(a->indexOf((int32_t)3) == -1);
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(a->indexOf((int32_t)15) == 1);
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(a->indexOf((int32_t)15, 2) == -1);
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(a->contains((int32_t)15));
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(!a->contains((int32_t)5));
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete a;
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid UVectorTest::UStack_API() {
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode  status = U_ZERO_ERROR;
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStack     *a;
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a = new UStack(status);
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_CHECK_STATUS(status);
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete a;
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a = new UStack(2000, status);
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_CHECK_STATUS(status);
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete a;
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a = new UStack(NULL, NULL, 2000, status);
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_CHECK_STATUS(status);
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete a;
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a = new UStack(NULL, UVectorTest_compareCstrings, status);
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(a->empty());
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a->push((void*)"abc", status);
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(!a->empty());
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a->push((void*)"bcde", status);
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    a->push((void*)"cde", status);
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_CHECK_STATUS(status);
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(strcmp("cde", (const char *)a->peek()) == 0);
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(a->search((void*)"cde") == 1);
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(a->search((void*)"bcde") == 2);
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(a->search((void*)"abc") == 3);
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(strcmp("abc", (const char *)a->firstElement()) == 0);
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(strcmp("cde", (const char *)a->lastElement()) == 0);
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(strcmp("cde", (const char *)a->pop()) == 0);
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(strcmp("bcde", (const char *)a->pop()) == 0);
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(strcmp("abc", (const char *)a->pop()) == 0);
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete a;
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool U_CALLCONV neverTRUE(const UHashTok /*key1*/, const UHashTok /*key2*/) {
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return FALSE;
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid UVectorTest::Hashtable_API() {
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Hashtable *a = new Hashtable(status);
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((a->puti("a", 1, status) == 0));
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((a->find("a") != NULL));
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((a->find("b") == NULL));
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((a->puti("b", 2, status) == 0));
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((a->find("b") != NULL));
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((a->removei("a") == 1));
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((a->find("a") == NULL));
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* verify that setValueComparator works */
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Hashtable b(status);
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((!a->equals(b)));
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((b.puti("b", 2, status) == 0));
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((!a->equals(b))); // Without a value comparator, this will be FALSE by default.
18650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    b.setValueComparator(uhash_compareLong);
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((!a->equals(b)));
18850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    a->setValueComparator(uhash_compareLong);
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((a->equals(b)));
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((a->equals(*a))); // This better be reflexive.
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* verify that setKeyComparator works */
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((a->puti("a", 1, status) == 0));
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((a->find("a") != NULL));
19550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    a->setKeyComparator(neverTRUE);
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT((a->find("a") == NULL));
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete a;
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
201