TestHashtables.cpp revision 9fa60195d4600f388a5e259b88cfca31bfba5169
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is C++ hashtable templates.
*
* The Initial Developer of the Original Code is
* Benjamin Smedberg.
* Portions created by the Initial Developer are Copyright (C) 2002
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsTHashtable.h"
#include "nsBaseHashtable.h"
#include "nsDataHashtable.h"
#include "nsInterfaceHashtable.h"
#include "nsClassHashtable.h"
#include "nsCOMPtr.h"
#include "nsISupports.h"
#include "nsCRT.h"
#include "nsCOMArray.h"
class TestUniChar // for nsClassHashtable
{
public:
{
}
~TestUniChar()
{
}
private:
};
struct EntityNode {
const char* mStr; // never owns buffer
};
EntityNode gEntities[] = {
{"nbsp",160},
{"iexcl",161},
{"cent",162},
{"pound",163},
{"curren",164},
{"yen",165},
{"brvbar",166},
{"sect",167},
{"uml",168},
{"copy",169},
{"ordf",170},
{"laquo",171},
{"not",172},
{"shy",173},
{"reg",174},
{"macr",175}
};
class EntityToUnicodeEntry : public PLDHashEntryHdr
{
public:
typedef const char* KeyType;
typedef const char* KeyTypePointer;
~EntityToUnicodeEntry() { };
enum { ALLOW_MEMMOVE = PR_TRUE };
const EntityNode* mNode;
};
printf(" enumerated \"%s\" = %u\n",
return PL_DHASH_NEXT;
}
printf(" enumerated \"%s\" = %u\n",
return PL_DHASH_REMOVE;
}
void
PRUint32 i;
for (i = 0; i < numEntries; ++i) {
if (!entry) {
printf("FAILED\n");
exit (2);
}
printf("OK...");
printf("entry already exists!\n");
exit (3);
}
printf("\n");
}
printf("Testing Get:\n");
for (i = 0; i < numEntries; ++i) {
if (!entry) {
printf("FAILED\n");
exit (4);
}
}
printf("Testing non-existent entries...");
if (entry) {
printf("FOUND! BAD!\n");
exit (5);
}
printf("not found; good.\n");
printf("Enumerating:\n");
if (count != numEntries) {
printf(" Bad count!\n");
exit (6);
}
}
return PL_DHASH_NEXT;
}
return PL_DHASH_NEXT;
}
printf(" enumerated \"%s\" = %c\n",
return PL_DHASH_NEXT;
}
printf(" enumerated \"%s\" = %c\n",
return PL_DHASH_NEXT;
}
//
// all this nsIFoo stuff was copied wholesale from TestCOMPTr.cpp
//
#define NS_IFOO_IID \
{ 0x6f7652e0, 0xee43, 0x11d1, \
{ 0x9c, 0xc3, 0x00, 0x60, 0x08, 0x8c, 0xa6, 0xb3 } }
class IFoo : public nsISupports
{
public:
public:
IFoo();
static void print_totals();
private:
~IFoo();
unsigned int refcount_;
static unsigned int total_constructions_;
static unsigned int total_destructions_;
};
unsigned int IFoo::total_constructions_;
unsigned int IFoo::total_destructions_;
void
IFoo::print_totals()
{
printf("total constructions/destructions --> %d/%d\n",
}
: refcount_(0)
{
printf(" new IFoo@%p [#%d]\n",
NS_STATIC_CAST(void*, this), total_constructions_);
}
{
printf("IFoo@%p::~IFoo() [#%d]\n",
NS_STATIC_CAST(void*, this), total_destructions_);
}
{
++refcount_;
printf("IFoo@%p::AddRef(), refcount --> %d\n",
NS_STATIC_CAST(void*, this), refcount_);
return refcount_;
}
{
if ( wrap_message )
printf(">>");
--refcount_;
printf("IFoo@%p::Release(), refcount --> %d\n",
NS_STATIC_CAST(void*, this), refcount_);
if ( !refcount_ )
{
delete this;
}
if ( wrap_message )
return refcount_;
}
{
nsISupports* rawPtr = 0;
rawPtr = this;
else
{
else
}
return status;
}
{
return NS_OK;
}
{
return NS_OK;
}
// a typical factory function (that calls AddRef)
{
printf(" >>CreateIFoo() --> ");
printf("<<CreateIFoo()\n");
return 0;
}
return PL_DHASH_NEXT;
}
return PL_DHASH_NEXT;
}
return PL_DHASH_NEXT;
}
return PL_DHASH_NEXT;
}
int
main(void) {
// check an nsTHashtable
printf("Initializing nsTHashtable...");
printf("FAILED\n");
exit (1);
}
printf("OK\n");
printf("Partially filling nsTHashtable:\n");
printf("Enumerate-removing...\n");
if (count != 5) {
printf("wrong count\n");
exit (7);
}
printf("OK\n");
printf("Check enumeration...");
if (count) {
printf("entries remain in table!\n");
exit (8);
}
printf("OK\n");
printf("Filling nsTHashtable:\n");
printf("Clearing...");
printf("OK\n");
printf("Check enumeration...");
if (count) {
printf("entries remain in table!\n");
exit (9);
}
printf("OK\n");
//
// now check a data-hashtable
//
printf("Initializing nsDataHashtable...");
printf("FAILED\n");
exit (10);
}
printf("OK\n");
PRUint32 i;
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
exit (11);
}
printf("OK...\n");
}
printf("Testing Get:\n");
const char* str;
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
exit (12);
}
}
printf("Testing non-existent entries...");
printf("FOUND! BAD!\n");
exit (13);
}
printf("not found; good.\n");
printf("Enumerating:\n");
if (count != ENTITY_COUNT) {
printf(" Bad count!\n");
exit (14);
}
printf("Clearing...");
UniToEntity.Clear();
printf("OK\n");
printf("Checking count...");
if (count) {
printf(" Clear did not remove all entries.\n");
exit (15);
}
printf("OK\n");
//
// now check a thread-safe data-hashtable
//
printf("Initializing nsDataHashtableMT...");
printf("FAILED\n");
exit (10);
}
printf("OK\n");
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
exit (11);
}
printf("OK...\n");
}
printf("Testing Get:\n");
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
exit (12);
}
}
printf("Testing non-existent entries...");
printf("FOUND! BAD!\n");
exit (13);
}
printf("not found; good.\n");
printf("Enumerating:\n");
if (count != ENTITY_COUNT) {
printf(" Bad count!\n");
exit (14);
}
printf("Clearing...");
printf("OK\n");
printf("Checking count...");
if (count) {
printf(" Clear did not remove all entries.\n");
exit (15);
}
printf("OK\n");
//
// now check a class-hashtable
//
printf("Initializing nsClassHashtable...");
printf("FAILED\n");
exit (16);
}
printf("OK\n");
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
delete temp;
exit (17);
}
printf("OK...\n");
}
printf("Testing Get:\n");
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
exit (18);
}
}
printf("Testing non-existent entries...");
printf("FOUND! BAD!\n");
exit (19);
}
printf("not found; good.\n");
printf("Enumerating:\n");
if (count != ENTITY_COUNT) {
printf(" Bad count!\n");
exit (20);
}
printf("Clearing...\n");
printf(" Clearing OK\n");
printf("Checking count...");
if (count) {
printf(" Clear did not remove all entries.\n");
exit (21);
}
printf("OK\n");
//
// now check a thread-safe class-hashtable
//
printf("Initializing nsClassHashtableMT...");
printf("FAILED\n");
exit (16);
}
printf("OK\n");
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
delete temp;
exit (17);
}
printf("OK...\n");
}
printf("Testing Get:\n");
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
exit (18);
}
}
printf("Testing non-existent entries...");
printf("FOUND! BAD!\n");
exit (19);
}
printf("not found; good.\n");
printf("Enumerating:\n");
if (count != ENTITY_COUNT) {
printf(" Bad count!\n");
exit (20);
}
printf("Clearing...\n");
printf(" Clearing OK\n");
printf("Checking count...");
if (count) {
printf(" Clear did not remove all entries.\n");
exit (21);
}
printf("OK\n");
//
// now check a data-hashtable with an interface key
//
printf("Initializing nsDataHashtable with interface key...");
printf("FAILED\n");
exit (22);
}
printf("OK\n");
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
exit (23);
}
printf("OK...\n");
}
printf("Testing Get:\n");
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
exit (24);
}
}
printf("Testing non-existent entries...");
printf("FOUND! BAD!\n");
exit (25);
}
printf("not found; good.\n");
printf("Enumerating:\n");
if (count != ENTITY_COUNT) {
printf(" Bad count!\n");
exit (26);
}
printf("Clearing...\n");
printf(" Clearing OK\n");
printf("Checking count...");
if (count) {
printf(" Clear did not remove all entries.\n");
exit (27);
}
printf("OK\n");
//
// now check an interface-hashtable with an PRUint32 key
//
printf("Initializing nsInterfaceHashtable...");
printf("FAILED\n");
exit (28);
}
printf("OK\n");
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
exit (29);
}
printf("OK...\n");
}
printf("Testing Get:\n");
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
exit (30);
}
}
printf("Testing non-existent entries...");
printf("FOUND! BAD!\n");
exit (31);
}
printf("not found; good.\n");
printf("Enumerating:\n");
if (count != ENTITY_COUNT) {
printf(" Bad count!\n");
exit (32);
}
printf("Clearing...\n");
printf(" Clearing OK\n");
printf("Checking count...");
if (count) {
printf(" Clear did not remove all entries.\n");
exit (33);
}
printf("OK\n");
//
// now check a thread-safe interface hashtable
//
printf("Initializing nsInterfaceHashtableMT...");
printf("FAILED\n");
exit (28);
}
printf("OK\n");
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
exit (29);
}
printf("OK...\n");
}
printf("Testing Get:\n");
for (i = 0; i < ENTITY_COUNT; ++i) {
printf("FAILED\n");
exit (30);
}
}
printf("Testing non-existent entries...");
printf("FOUND! BAD!\n");
exit (31);
}
printf("not found; good.\n");
printf("Enumerating:\n");
if (count != ENTITY_COUNT) {
printf(" Bad count!\n");
exit (32);
}
printf("Clearing...\n");
printf(" Clearing OK\n");
printf("Checking count...");
if (count) {
printf(" Clear did not remove all entries.\n");
exit (33);
}
printf("OK\n");
return 0;
}