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