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