// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/********************************************************************
* COPYRIGHT:
* Copyright (c) 2004-2011, International Business Machines Corporation and
* others. All Rights Reserved.
********************************************************************/
// Test parts of UVector and UStack
#include "intltest.h"
#include "uvectest.h"
#include "cstring.h"
#include "hash.h"
#include "uelement.h"
#include "uvector.h"
//---------------------------------------------------------------------------
//
// Test class boilerplate
//
//---------------------------------------------------------------------------
UVectorTest::UVectorTest()
{
}
UVectorTest::~UVectorTest()
{
}
void UVectorTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
{
if (exec) logln("TestSuite UVectorTest: ");
switch (index) {
case 0: name = "UVector_API";
if (exec) UVector_API();
break;
case 1: name = "UStack_API";
if (exec) UStack_API();
break;
case 2: name = "Hashtable_API";
if (exec) Hashtable_API();
break;
default: name = "";
break; //needed to end loop
}
}
//---------------------------------------------------------------------------
//
// Error Checking / Reporting macros used in all of the tests.
//
//---------------------------------------------------------------------------
#define TEST_CHECK_STATUS(status) \
if (U_FAILURE(status)) {\
errln("UVectorTest failure at line %d. status=%s\n", __LINE__, u_errorName(status));\
return;\
}
#define TEST_ASSERT(expr) \
if ((expr)==FALSE) {\
errln("UVectorTest failure at line %d.\n", __LINE__);\
}
static int8_t U_CALLCONV
UVectorTest_compareInt32(UElement key1, UElement key2) {
if (key1.integer > key2.integer) {
return 1;
}
else if (key1.integer < key2.integer) {
return -1;
}
return 0;
}
U_CDECL_BEGIN
static int8_t U_CALLCONV
UVectorTest_compareCstrings(const UElement key1, const UElement key2) {
return !strcmp((const char *)key1.pointer, (const char *)key2.pointer);
}
U_CDECL_END
//---------------------------------------------------------------------------
//
// UVector_API Check for basic functionality of UVector.
//
//---------------------------------------------------------------------------
void UVectorTest::UVector_API() {
UErrorCode status = U_ZERO_ERROR;
UVector *a;
a = new UVector(status);
TEST_CHECK_STATUS(status);
delete a;
status = U_ZERO_ERROR;
a = new UVector(2000, status);
TEST_CHECK_STATUS(status);
delete a;
status = U_ZERO_ERROR;
a = new UVector(status);
a->sortedInsert((int32_t)10, UVectorTest_compareInt32, status);
a->sortedInsert((int32_t)20, UVectorTest_compareInt32, status);
a->sortedInsert((int32_t)30, UVectorTest_compareInt32, status);
a->sortedInsert((int32_t)15, UVectorTest_compareInt32, status);
TEST_CHECK_STATUS(status);
TEST_ASSERT(a->elementAti(0) == 10);
TEST_ASSERT(a->elementAti(1) == 15);
TEST_ASSERT(a->elementAti(2) == 20);
TEST_ASSERT(a->elementAti(3) == 30);
TEST_ASSERT(a->indexOf((int32_t)3) == -1);
TEST_ASSERT(a->indexOf((int32_t)15) == 1);
TEST_ASSERT(a->indexOf((int32_t)15, 2) == -1);
TEST_ASSERT(a->contains((int32_t)15));
TEST_ASSERT(!a->contains((int32_t)5));
delete a;
}
void UVectorTest::UStack_API() {
UErrorCode status = U_ZERO_ERROR;
UStack *a;
a = new UStack(status);
TEST_CHECK_STATUS(status);
delete a;
status = U_ZERO_ERROR;
a = new UStack(2000, status);
TEST_CHECK_STATUS(status);
delete a;
status = U_ZERO_ERROR;
a = new UStack(NULL, NULL, 2000, status);
TEST_CHECK_STATUS(status);
delete a;
status = U_ZERO_ERROR;
a = new UStack(NULL, UVectorTest_compareCstrings, status);
TEST_ASSERT(a->empty());
a->push((void*)"abc", status);
TEST_ASSERT(!a->empty());
a->push((void*)"bcde", status);
a->push((void*)"cde", status);
TEST_CHECK_STATUS(status);
TEST_ASSERT(strcmp("cde", (const char *)a->peek()) == 0);
TEST_ASSERT(a->search((void*)"cde") == 1);
TEST_ASSERT(a->search((void*)"bcde") == 2);
TEST_ASSERT(a->search((void*)"abc") == 3);
TEST_ASSERT(strcmp("abc", (const char *)a->firstElement()) == 0);
TEST_ASSERT(strcmp("cde", (const char *)a->lastElement()) == 0);
TEST_ASSERT(strcmp("cde", (const char *)a->pop()) == 0);
TEST_ASSERT(strcmp("bcde", (const char *)a->pop()) == 0);
TEST_ASSERT(strcmp("abc", (const char *)a->pop()) == 0);
delete a;
}
U_CDECL_BEGIN
static UBool U_CALLCONV neverTRUE(const UElement /*key1*/, const UElement /*key2*/) {
return FALSE;
}
U_CDECL_END
void UVectorTest::Hashtable_API() {
UErrorCode status = U_ZERO_ERROR;
Hashtable *a = new Hashtable(status);
TEST_ASSERT((a->puti("a", 1, status) == 0));
TEST_ASSERT((a->find("a") != NULL));
TEST_ASSERT((a->find("b") == NULL));
TEST_ASSERT((a->puti("b", 2, status) == 0));
TEST_ASSERT((a->find("b") != NULL));
TEST_ASSERT((a->removei("a") == 1));
TEST_ASSERT((a->find("a") == NULL));
/* verify that setValueComparator works */
Hashtable b(status);
TEST_ASSERT((!a->equals(b)));
TEST_ASSERT((b.puti("b", 2, status) == 0));
TEST_ASSERT((!a->equals(b))); // Without a value comparator, this will be FALSE by default.
b.setValueComparator(uhash_compareLong);
TEST_ASSERT((!a->equals(b)));
a->setValueComparator(uhash_compareLong);
TEST_ASSERT((a->equals(b)));
TEST_ASSERT((a->equals(*a))); // This better be reflexive.
/* verify that setKeyComparator works */
TEST_ASSERT((a->puti("a", 1, status) == 0));
TEST_ASSERT((a->find("a") != NULL));
a->setKeyComparator(neverTRUE);
TEST_ASSERT((a->find("a") == NULL));
delete a;
}