1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* Copyright (C) 2000-2009, International Business Machines 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Date Name Description 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 03/22/00 aliu Creation. 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 07/13/00 Madhu Added more tests 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h" 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uhash.h" 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ctest.h" 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************** 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Prototypes 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *********************************************************************/ 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBasic(void); 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestOtherAPI(void); 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void hashIChars(void); 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t U_EXPORT2 U_CALLCONV hashChars(const UHashTok key); 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool U_EXPORT2 U_CALLCONV isEqualChars(const UHashTok key1, const UHashTok key2); 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _put(UHashtable* hash, 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* key, 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t value, 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expectedOldValue); 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _get(UHashtable* hash, 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* key, 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expectedValue); 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _remove(UHashtable* hash, 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* key, 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expectedValue); 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addHashtableTest(TestNode** root); 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************** 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * UHashTok wrapper functions 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *********************************************************************/ 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool 5050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho_compareChars(const void* a, const void* b) { 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UHashTok s, t; 5250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho s.pointer = (void *)a; 5350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho t.pointer = (void *)b; 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return uhash_compareChars(s, t); 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool 5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho_compareIChars(const void* a, const void* b) { 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UHashTok s, t; 6050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho s.pointer = (void *)a; 6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho t.pointer = (void *)b; 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return uhash_compareIChars(s, t); 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool 6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho_compareUChars(const void* a, const void* b) { 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UHashTok s, t; 6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho s.pointer = (void *)a; 6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho t.pointer = (void *)b; 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return uhash_compareUChars(s, t); 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_compareLong(int32_t a, int32_t b) { 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UHashTok s, t; 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.integer = a; 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t.integer = b; 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return uhash_compareLong(s, t); 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************** 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * FW Registration 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *********************************************************************/ 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addHashtableTest(TestNode** root) { 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestBasic, "tsutil/chashtst/TestBasic"); 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestOtherAPI, "tsutil/chashtst/TestOtherAPI"); 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &hashIChars, "tsutil/chashtst/hashIChars"); 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************** 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test Functions 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *********************************************************************/ 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBasic(void) { 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char one[4] = {0x6F, 0x6E, 0x65, 0}; /* "one" */ 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char one2[4] = {0x6F, 0x6E, 0x65, 0}; /* Get around compiler optimizations */ 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char two[4] = {0x74, 0x77, 0x6F, 0}; /* "two" */ 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char three[6] = {0x74, 0x68, 0x72, 0x65, 0x65, 0}; /* "three" */ 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char omega[6] = {0x6F, 0x6D, 0x65, 0x67, 0x61, 0}; /* "omega" */ 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UHashtable *hash; 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hash = uhash_open(hashChars, isEqualChars, NULL, &status); 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_open failed with %s and returned 0x%08x\n", 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(status), hash); 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hash == NULL) { 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_open returned NULL\n"); 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Ok: uhash_open returned 0x%08X\n", hash); 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _put(hash, one, 1, 0); 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _put(hash, omega, 24, 0); 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _put(hash, two, 2, 0); 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _put(hash, three, 3, 0); 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _put(hash, one, -1, 1); 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _put(hash, two, -2, 2); 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _put(hash, omega, 48, 24); 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _put(hash, one, 100, -1); 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _get(hash, three, 3); 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _remove(hash, two, -2); 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _get(hash, two, 0); 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _get(hash, one, 100); 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _put(hash, two, 200, 0); 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _get(hash, omega, 48); 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _get(hash, two, 200); 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(_compareChars((void*)one, (void*)three) == TRUE || 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _compareChars((void*)one, (void*)one2) != TRUE || 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _compareChars((void*)one, (void*)one) != TRUE || 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _compareChars((void*)one, NULL) == TRUE ) { 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: compareChars failed\n"); 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(_compareIChars((void*)one, (void*)three) == TRUE || 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _compareIChars((void*)one, (void*)one) != TRUE || 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _compareIChars((void*)one, (void*)one2) != TRUE || 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _compareIChars((void*)one, NULL) == TRUE ) { 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: compareIChars failed\n"); 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_close(hash); 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestOtherAPI(void){ 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UHashtable *hash; 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Use the correct type when cast to void * */ 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar one[4] = {0x006F, 0x006E, 0x0065, 0}; /* L"one" */ 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar one2[4] = {0x006F, 0x006E, 0x0065, 0}; /* Get around compiler optimizations */ 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar two[4] = {0x0074, 0x0077, 0x006F, 0}; /* L"two" */ 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar two2[4] = {0x0074, 0x0077, 0x006F, 0}; /* L"two" */ 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar three[6] = {0x0074, 0x0068, 0x0072, 0x0065, 0x0065, 0}; /* L"three" */ 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar four[6] = {0x0066, 0x006F, 0x0075, 0x0072, 0}; /* L"four" */ 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar five[6] = {0x0066, 0x0069, 0x0076, 0x0065, 0}; /* L"five" */ 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar five2[6] = {0x0066, 0x0069, 0x0076, 0x0065, 0}; /* L"five" */ 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hash = uhash_open(uhash_hashUChars, uhash_compareUChars, NULL, &status); 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_open failed with %s and returned 0x%08x\n", 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(status), hash); 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hash == NULL) { 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_open returned NULL\n"); 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Ok: uhash_open returned 0x%08X\n", hash); 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_puti(hash, (void*)one, 1, &status); 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_count(hash) != 1){ 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhas_count() failed. Expected: 1, Got: %d\n", uhash_count(hash)); 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_find(hash, (void*)two) != NULL){ 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_find failed\n"); 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_puti(hash, (void*)two, 2, &status); 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_puti(hash, (void*)three, 3, &status); 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_puti(hash, (void*)four, 4, &status); 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_puti(hash, (void*)five, 5, &status); 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_count(hash) != 5){ 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhas_count() failed. Expected: 5, Got: %d\n", uhash_count(hash)); 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_geti(hash, (void*)two2) != 2){ 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_geti failed\n"); 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_find(hash, (void*)two2) == NULL){ 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_find of \"two\" failed\n"); 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_removei(hash, (void*)five2) != 5){ 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_remove() failed\n"); 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_count(hash) != 4){ 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhas_count() failed. Expected: 4, Got: %d\n", uhash_count(hash)); 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_put(hash, (void*)one, NULL, &status); 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_count(hash) != 3){ 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_put() with value=NULL didn't remove the key value pair\n"); 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ILLEGAL_ARGUMENT_ERROR; 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_puti(hash, (void*)one, 1, &status); 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_count(hash) != 3){ 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_put() with value!=NULL should fail when status != U_ZERO_ERROR \n"); 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_puti(hash, (void*)one, 1, &status); 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_count(hash) != 4){ 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_put() with value!=NULL didn't replace the key value pair\n"); 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(_compareUChars((void*)one, (void*)two) == TRUE || 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _compareUChars((void*)one, (void*)one) != TRUE || 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _compareUChars((void*)one, (void*)one2) != TRUE || 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _compareUChars((void*)one, NULL) == TRUE ) { 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: compareUChars failed\n"); 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_removeAll(hash); 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_count(hash) != 0){ 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhas_count() failed. Expected: 0, Got: %d\n", uhash_count(hash)); 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_setKeyComparator(hash, uhash_compareLong); 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_setKeyHasher(hash, uhash_hashLong); 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_iputi(hash, 1001, 1, &status); 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_iputi(hash, 1002, 2, &status); 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_iputi(hash, 1003, 3, &status); 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(_compareLong(1001, 1002) == TRUE || 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _compareLong(1001, 1001) != TRUE || 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _compareLong(1001, 0) == TRUE ) { 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: compareLong failed\n"); 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*set the resize policy to just GROW and SHRINK*/ 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*how to test this??*/ 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_setResizePolicy(hash, U_GROW_AND_SHRINK); 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_iputi(hash, 1004, 4, &status); 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_iputi(hash, 1005, 5, &status); 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_iputi(hash, 1006, 6, &status); 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_count(hash) != 6){ 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_count() failed. Expected: 6, Got: %d\n", uhash_count(hash)); 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_iremovei(hash, 1004) != 4){ 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_remove failed\n"); 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_iremovei(hash, 1004) != 0){ 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_remove failed\n"); 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_removeAll(hash); 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_iput(hash, 2004, (void*)one, &status); 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_iput(hash, 2005, (void*)two, &status); 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_count(hash) != 2){ 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_count() failed. Expected: 2, Got: %d\n", uhash_count(hash)); 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_iremove(hash, 2004) != (void*)one){ 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_remove failed\n"); 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_iremove(hash, 2004) != NULL){ 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_remove failed\n"); 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_count(hash) != 1){ 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_count() failed. Expected: 1, Got: %d\n", uhash_count(hash)); 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_close(hash); 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void hashIChars(void) { 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char which[] = "which"; 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char WHICH2[] = "WHICH"; 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char where[] = "where"; 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UHashtable *hash; 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hash = uhash_open(uhash_hashIChars, uhash_compareIChars, NULL, &status); 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_open failed with %s and returned 0x%08x\n", 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(status), hash); 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hash == NULL) { 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_open returned NULL\n"); 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Ok: uhash_open returned 0x%08X\n", hash); 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _put(hash, which, 1, 0); 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _put(hash, WHICH2, 2, 1); 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _put(hash, where, 3, 0); 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uhash_count(hash) != 2){ 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhas_count() failed. Expected: 1, Got: %d\n", uhash_count(hash)); 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _remove(hash, which, 2); 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_close(hash); 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************** 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * uhash Callbacks 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *********************************************************************/ 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This hash function is designed to collide a lot to test key equality 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * resolution. It only uses the first char. 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t U_EXPORT2 U_CALLCONV hashChars(const UHashTok key) { 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return *(const char*) key.pointer; 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool U_EXPORT2 U_CALLCONV isEqualChars(const UHashTok key1, const UHashTok key2) { 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UBool)((key1.pointer != NULL) && 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (key2.pointer != NULL) && 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (uprv_strcmp((const char*)key1.pointer, (const char*)key2.pointer) == 0)); 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************** 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Wrapper Functions 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *********************************************************************/ 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _put(UHashtable* hash, 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* key, 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t value, 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expectedOldValue) { 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t oldValue = 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uhash_puti(hash, (void*) key, value, &status); 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_put(%s) failed with %s and returned %ld\n", 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru key, u_errorName(status), oldValue); 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (oldValue != expectedOldValue) { 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_put(%s) returned old value %ld; expected %ld\n", 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru key, oldValue, expectedOldValue); 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Ok: uhash_put(%s, %d) returned old value %ld\n", 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru key, value, oldValue); 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _get(UHashtable* hash, 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* key, 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expectedValue) { 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t value = uhash_geti(hash, key); 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_get(%s) failed with %s and returned %ld\n", 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru key, u_errorName(status), value); 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (value != expectedValue) { 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_get(%s) returned %ld; expected %ld\n", 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru key, value, expectedValue); 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Ok: uhash_get(%s) returned value %ld\n", 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru key, value); 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _remove(UHashtable* hash, 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* key, 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expectedValue) { 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t value = uhash_removei(hash, key); 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (value != expectedValue) { 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: uhash_remove(%s) returned %ld; expected %ld\n", 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru key, value, expectedValue); 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Ok: uhash_remove(%s) returned old value %ld\n", 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru key, value); 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 385