1/*------------------------------------------------------------------------- 2 * drawElements Memory Pool Library 3 * -------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Memory pool hash class. 22 *//*--------------------------------------------------------------------*/ 23 24#include "dePoolHash.h" 25 26#include <string.h> 27 28DE_DECLARE_POOL_HASH(deTestHash, deInt16, int); 29DE_IMPLEMENT_POOL_HASH(deTestHash, deInt16, int, deInt16Hash, deInt16Equal); 30 31DE_DECLARE_POOL_ARRAY(deTestIntArray, int); 32DE_DECLARE_POOL_ARRAY(deTestInt16Array, deInt16); 33 34DE_DECLARE_POOL_HASH_TO_ARRAY(deTestHash, deTestInt16Array, deTestIntArray); 35DE_IMPLEMENT_POOL_HASH_TO_ARRAY(deTestHash, deTestInt16Array, deTestIntArray); 36 37void dePoolHash_selfTest (void) 38{ 39 deMemPool* pool = deMemPool_createRoot(DE_NULL, 0); 40 deTestHash* hash = deTestHash_create(pool); 41 int iter; 42 43 for (iter = 0; iter < 3; iter++) 44 { 45 int i; 46 47 /* Test find() on empty hash. */ 48 DE_TEST_ASSERT(deTestHash_getNumElements(hash) == 0); 49 for (i = 0; i < 15000; i++) 50 { 51 const int* val = deTestHash_find(hash, (deInt16)i); 52 DE_TEST_ASSERT(!val); 53 } 54 55 /* Test insert(). */ 56 for (i = 0; i < 5000; i++) 57 { 58 deTestHash_insert(hash, (deInt16)i, -i); 59 } 60 61 DE_TEST_ASSERT(deTestHash_getNumElements(hash) == 5000); 62 for (i = 0; i < 5000; i++) 63 { 64 const int* val = deTestHash_find(hash, (deInt16)i); 65 DE_TEST_ASSERT(val && (*val == -i)); 66 } 67 68 /* Test delete(). */ 69 for (i = 0; i < 1000; i++) 70 deTestHash_delete(hash, (deInt16)i); 71 72 DE_TEST_ASSERT(deTestHash_getNumElements(hash) == 4000); 73 for (i = 0; i < 25000; i++) 74 { 75 const int* val = deTestHash_find(hash, (deInt16)i); 76 if (deInBounds32(i, 1000, 5000)) 77 DE_TEST_ASSERT(val && (*val == -i)); 78 else 79 DE_TEST_ASSERT(!val); 80 } 81 82 /* Test insert() after delete(). */ 83 for (i = 10000; i < 12000; i++) 84 deTestHash_insert(hash, (deInt16)i, -i); 85 86 for (i = 0; i < 25000; i++) 87 { 88 const int* val = deTestHash_find(hash, (deInt16)i); 89 if (deInBounds32(i, 1000, 5000) || deInBounds32(i, 10000, 12000)) 90 DE_TEST_ASSERT(val && (*val == -i)); 91 else 92 DE_TEST_ASSERT(!val); 93 } 94 95 /* Test iterator. */ 96 { 97 deTestHashIter testIter; 98 int numFound = 0; 99 100 for (deTestHashIter_init(hash, &testIter); deTestHashIter_hasItem(&testIter); deTestHashIter_next(&testIter)) 101 { 102 deInt16 key = deTestHashIter_getKey(&testIter); 103 int val = deTestHashIter_getValue(&testIter); 104 DE_TEST_ASSERT(deInBounds32(key, 1000, 5000) || deInBounds32(key, 10000, 12000)); 105 DE_TEST_ASSERT(*deTestHash_find(hash, key) == -key); 106 DE_TEST_ASSERT(val == -key); 107 numFound++; 108 } 109 110 DE_TEST_ASSERT(numFound == deTestHash_getNumElements(hash)); 111 } 112 113 /* Test copy-to-array. */ 114 { 115 deTestInt16Array* keyArray = deTestInt16Array_create(pool); 116 deTestIntArray* valueArray = deTestIntArray_create(pool); 117 int numElements = deTestHash_getNumElements(hash); 118 int ndx; 119 120 deTestHash_copyToArray(hash, keyArray, DE_NULL); 121 DE_TEST_ASSERT(deTestInt16Array_getNumElements(keyArray) == numElements); 122 123 deTestHash_copyToArray(hash, DE_NULL, valueArray); 124 DE_TEST_ASSERT(deTestIntArray_getNumElements(valueArray) == numElements); 125 126 deTestInt16Array_setSize(keyArray, 0); 127 deTestIntArray_setSize(valueArray, 0); 128 deTestHash_copyToArray(hash, keyArray, valueArray); 129 DE_TEST_ASSERT(deTestInt16Array_getNumElements(keyArray) == numElements); 130 DE_TEST_ASSERT(deTestIntArray_getNumElements(valueArray) == numElements); 131 132 for (ndx = 0; ndx < numElements; ndx++) 133 { 134 deInt16 key = deTestInt16Array_get(keyArray, ndx); 135 int val = deTestIntArray_get(valueArray, ndx); 136 137 DE_TEST_ASSERT(val == -key); 138 DE_TEST_ASSERT(*deTestHash_find(hash, key) == val); 139 } 140 } 141 142 /* Test reset(). */ 143 deTestHash_reset(hash); 144 DE_TEST_ASSERT(deTestHash_getNumElements(hash) == 0); 145 } 146 147 deMemPool_destroy(pool); 148} 149