Blame ETL/test/handle.cpp

darco b3016b
/*! ========================================================================
darco b3016b
** Extended Template and Library Test Suite
darco b3016b
** Handle Template Class Test
dooglus 36d01e
** $Id$
darco b3016b
**
darco b3016b
** Copyright (c) 2002 Robert B. Quattlebaum Jr.
darco b3016b
**
darco b3016b
** This package is free software; you can redistribute it and/or
darco b3016b
** modify it under the terms of the GNU General Public License as
darco b3016b
** published by the Free Software Foundation; either version 2 of
darco b3016b
** the License, or (at your option) any later version.
darco b3016b
**
darco b3016b
** This package is distributed in the hope that it will be useful,
darco b3016b
** but WITHOUT ANY WARRANTY; without even the implied warranty of
darco b3016b
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
darco b3016b
** General Public License for more details.
darco b3016b
**
darco b3016b
** === N O T E S ===========================================================
darco b3016b
**
darco b3016b
** ========================================================================= */
darco b3016b
darco b3016b
/* === H E A D E R S ======================================================= */
darco b3016b
darco b3016b
#include <etl handle=""></etl>
darco b3016b
#include <list></list>
darco b3016b
#include <stdio.h></stdio.h>
darco b3016b
#include <stdlib.h></stdlib.h>
darco b3016b
#include <string></string>
darco b3016b
#include <map></map>
darco b3016b
#include <vector></vector>
darco b3016b
darco b3016b
/* === M A C R O S ========================================================= */
darco b3016b
darco b3016b
#define NUMBER_OF_OBJECTS	40000
darco b3016b
using namespace std;
darco b3016b
darco b3016b
/* === C L A S S E S ======================================================= */
darco b3016b
darco b3016b
struct my_test_obj : public etl::rshared_object
darco b3016b
{
darco b3016b
	static int instance_count;
darco b3016b
	int my_id;
darco b3016b
	my_test_obj(int my_id=0):my_id(my_id)
darco b3016b
	{
darco b3016b
		instance_count++;
darco b3016b
	}
dooglus cee594
darco b3016b
	virtual ~my_test_obj()
darco b3016b
	{
darco b3016b
		if(instance_count==0)
darco b3016b
			printf("Error, instance count is going past zero!\n");
darco b3016b
		instance_count--;
darco b3016b
	}
dooglus cee594
darco b3016b
	bool operator<(const my_test_obj &rhs)const
darco b3016b
	{
darco b3016b
		return my_id
darco b3016b
	}
darco b3016b
};
darco b3016b
darco b3016b
struct my_other_test_obj : public my_test_obj
darco b3016b
{
darco b3016b
	static int instance_count;
darco b3016b
	my_other_test_obj(int my_id=0):my_test_obj(my_id)
darco b3016b
	{
darco b3016b
		instance_count++;
darco b3016b
	}
darco b3016b
	virtual ~my_other_test_obj()
darco b3016b
	{
darco b3016b
		if(instance_count==0)
darco b3016b
			printf("Error, instance count is going past zero!\n");
darco b3016b
		instance_count--;
darco b3016b
	}
darco b3016b
};
darco b3016b
darco b3016b
int my_test_obj::instance_count=0;
darco b3016b
int my_other_test_obj::instance_count=0;
darco b3016b
darco b3016b
typedef etl::handle<my_test_obj> obj_handle;</my_test_obj>
darco b3016b
typedef etl::rhandle<my_test_obj> robj_handle;</my_test_obj>
darco b3016b
typedef etl::handle<my_other_test_obj> other_obj_handle;</my_other_test_obj>
darco b3016b
typedef list< obj_handle > obj_list;
darco b3016b
typedef list< other_obj_handle > other_obj_list;
darco b3016b
typedef list< robj_handle > robj_list;
darco b3016b
darco b3016b
int handle_basic_test()
darco b3016b
{
darco 117425
	printf("handle: Size of a handle: %u\n",(unsigned int)sizeof(etl::handle<int>));</int>
darco 117425
	printf("handle: Size of a loose_handle: %u\n",(unsigned int)sizeof(etl::loose_handle<int>));</int>
darco 117425
	printf("handle: Size of a rhandle: %u\n",(unsigned int)sizeof(etl::rhandle<int>));</int>
darco 117425
	printf("handle: Size of a shared_object: %u\n",(unsigned int)sizeof(etl::shared_object));
darco 117425
	printf("handle: Size of a rshared_object: %u\n",(unsigned int)sizeof(etl::rshared_object));
darco b3016b
darco b3016b
	printf("handle: Basic test: ");
darco b3016b
	my_test_obj::instance_count=0;
darco b3016b
darco b3016b
	{
darco b3016b
		etl::handle<my_test_obj> obj_handle(new my_test_obj(rand()));</my_test_obj>
darco b3016b
	}
darco b3016b
darco b3016b
	if(my_test_obj::instance_count!=0)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
dooglus 4d6768
		printf(__FILE__":%d: on create/destroy, instance count=%d, should be zero.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	{
darco b3016b
		map<string,etl::handle<my_test_obj> > my_map;</string,etl::handle<my_test_obj>
darco b3016b
		etl::handle<my_test_obj> obj_handle(new my_test_obj(rand()));</my_test_obj>
darco b3016b
		my_map["bleh"]=obj_handle;
darco b3016b
	}
darco b3016b
darco b3016b
	if(my_test_obj::instance_count!=0)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
dooglus 4d6768
		printf(__FILE__":%d: on create/destroy, instance count=%d, should be zero.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	etl::handle<my_test_obj> obj_handle(new my_test_obj(rand()));</my_test_obj>
darco b3016b
dooglus cee594
	if(obj_handle != obj_handle.constant())
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: on call to handle<>::constant().\n",__LINE__);
darco b3016b
		return 1;
darco b3016b
	}
dooglus cee594
darco b3016b
	printf("PASSED\n");
darco b3016b
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
int handle_general_use_test(void)
darco b3016b
{
darco b3016b
	printf("handle: General-use test: ");
darco b3016b
	my_test_obj::instance_count=0;
dooglus cee594
darco b3016b
	obj_list my_list, my_other_list;
darco b3016b
	int i;
dooglus cee594
darco b3016b
	for(i=0;i
darco b3016b
		my_list.push_back( obj_handle(new my_test_obj(rand())) );
dooglus cee594
darco b3016b
	my_other_list=my_list;
darco b3016b
	if(my_test_obj::instance_count!=NUMBER_OF_OBJECTS)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	my_list.sort();
darco b3016b
	if(my_test_obj::instance_count!=NUMBER_OF_OBJECTS)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS);
darco b3016b
		return 1;
darco b3016b
	}
dooglus cee594
darco b3016b
	my_list.clear();
darco b3016b
	if(my_test_obj::instance_count!=NUMBER_OF_OBJECTS)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy's clear, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
dooglus a91ceb
	{
dooglus a91ceb
		obj_handle a(new my_test_obj(27)), b(new my_test_obj(42));
dooglus a91ceb
		a.swap(b);
dooglus a91ceb
		if (a->my_id != 42 || b->my_id != 27)
dooglus a91ceb
		{
dooglus a91ceb
			printf("FAILED!\n");
dooglus a91ceb
			printf(__FILE__":%d: On swap (27,42) gave (%d,%d), should be (42,27).\n",__LINE__,a->my_id,b->my_id);
dooglus a91ceb
			return 1;
dooglus a91ceb
		}
dooglus a91ceb
	}
dooglus a91ceb
darco b3016b
	my_other_list.clear();
darco b3016b
	if(my_test_obj::instance_count)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On clear, instance count=%d, should be zero.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	printf("PASSED\n");
dooglus cee594
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
	struct ListItem
darco b3016b
	{
darco b3016b
		robj_handle obj;
darco b3016b
		int bleh;
darco b3016b
		int blah;
darco b3016b
		ListItem(robj_handle obj,int bleh=1, int blah=2):
darco b3016b
			obj(obj),bleh(bleh),blah(blah) { }
darco b3016b
	};
darco b3016b
darco b3016b
int rhandle_general_use_test(void)
darco b3016b
{
dooglus cee594
dooglus cee594
darco b3016b
	printf("rhandle: General-use test: ");
darco b3016b
	my_test_obj::instance_count=0;
dooglus cee594
darco b3016b
	robj_list my_list;
darco b3016b
	int i;
dooglus cee594
darco b3016b
	robj_handle obj=	new my_test_obj(rand());
darco b3016b
	for(i=0;i
darco b3016b
		my_list.push_back(obj);
darco b3016b
darco b3016b
	obj_list my_other_list(my_list.begin(),my_list.end());
dooglus cee594
dooglus cee594
dooglus cee594
darco b3016b
	if(obj.count()!=NUMBER_OF_OBJECTS*2+1)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy, handle count=%d, should be %d.\n",__LINE__,obj.count(),NUMBER_OF_OBJECTS*2+1);
darco b3016b
		return 1;
darco b3016b
	}
dooglus cee594
darco b3016b
	if(obj.rcount()!=NUMBER_OF_OBJECTS+1)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy, rhandle count=%d, should be %d.\n",__LINE__,obj.rcount(),NUMBER_OF_OBJECTS+1);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	my_list.sort();
darco b3016b
	if(obj.rcount()!=NUMBER_OF_OBJECTS+1)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy, instance count=%d, should be %d.\n",__LINE__,obj.rcount(),NUMBER_OF_OBJECTS+1);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	{robj_handle bleh(obj);}
darco b3016b
darco b3016b
	if(obj.rcount()!=NUMBER_OF_OBJECTS+1)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy, instance count=%d, should be %d.\n",__LINE__,obj.rcount(),NUMBER_OF_OBJECTS+1);
darco b3016b
		return 1;
darco b3016b
	}
dooglus cee594
darco b3016b
	my_other_list.clear();
darco b3016b
darco b3016b
	if(obj.rcount()!=obj.count())
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy's clear, handle count (%d) != rhandle count (%d)\n",__LINE__,obj.count(),obj.rcount());
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	if(obj.rcount()!=NUMBER_OF_OBJECTS+1)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy's clear, instance count=%d, should be %d.\n",__LINE__,obj.rcount(),NUMBER_OF_OBJECTS+1);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	robj_handle new_obj=	new my_test_obj(rand());
darco b3016b
darco b3016b
	int replacements=obj.replace(new_obj);
darco b3016b
darco b3016b
	if(replacements!=NUMBER_OF_OBJECTS+1)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: Only managed to replace %d, should have replaced %d\n",__LINE__,replacements,NUMBER_OF_OBJECTS+1);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	if(obj!=new_obj)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On replace, handles should be equal.\n",__LINE__);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	{
darco b3016b
		robj_handle bleh(obj);
darco b3016b
		robj_handle blah(obj.get());
darco b3016b
	}
darco b3016b
dooglus cee594
darco b3016b
	my_list.clear();
darco b3016b
	obj.detach();
darco b3016b
	new_obj.detach();
dooglus cee594
darco b3016b
	if(my_test_obj::instance_count)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On clear, instance count=%d, should be zero.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
dooglus cee594
dooglus cee594
darco b3016b
	std::vector<listitem> my_item_list;</listitem>
darco b3016b
	for(i=0;i
darco b3016b
		my_item_list.push_back(ListItem(new my_test_obj(rand()),3,4));
darco b3016b
dooglus cee594
darco b3016b
	for(i=0;i<100;i++)
darco b3016b
	{
darco b3016b
		int src,dest;
darco b3016b
		src=rand()%NUMBER_OF_OBJECTS;
darco b3016b
		dest=rand()%NUMBER_OF_OBJECTS;
darco b3016b
		ListItem tmp(my_item_list[src]);
darco b3016b
		assert(tmp.obj.rcount()>=2);
darco b3016b
		my_item_list.erase(my_item_list.begin()+src);
darco b3016b
		assert(tmp.obj.rcount()>=1);
darco b3016b
		my_item_list.insert(my_item_list.begin()+dest,tmp);
darco b3016b
		assert(tmp.obj.rcount()>=2);
darco b3016b
	}
dooglus cee594
darco b3016b
	my_item_list.clear();
darco b3016b
darco b3016b
	if(my_test_obj::instance_count)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On clear, instance count=%d, should be zero.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	printf("PASSED\n");
dooglus cee594
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
int handle_inheritance_test(void)
darco b3016b
{
darco b3016b
	printf("handle: Inheritance test: ");
darco b3016b
	my_test_obj::instance_count=0;
darco b3016b
	my_other_test_obj::instance_count=0;
dooglus cee594
darco b3016b
	other_obj_list my_other_list;
darco b3016b
	int i;
dooglus cee594
darco b3016b
	for(i=0;i
darco b3016b
		my_other_list.push_back( other_obj_handle(new my_other_test_obj(rand())) );
dooglus cee594
darco b3016b
	obj_list my_list(my_other_list.begin(),my_other_list.end());
darco b3016b
	if(my_test_obj::instance_count!=NUMBER_OF_OBJECTS)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	for(i=0;i
darco b3016b
		my_list.push_back( other_obj_handle(new my_other_test_obj(rand())) );
darco b3016b
	if(my_other_test_obj::instance_count!=NUMBER_OF_OBJECTS*2 ||
darco b3016b
	   my_test_obj::instance_count!=my_other_test_obj::instance_count)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On inherited copy, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS*2);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	my_list.sort();
darco b3016b
	my_other_list.sort();
darco b3016b
	if(my_test_obj::instance_count!=NUMBER_OF_OBJECTS*2)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On sort, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS*2);
darco b3016b
		return 1;
darco b3016b
	}
dooglus cee594
darco b3016b
	my_list.clear();
darco b3016b
	if(my_test_obj::instance_count!=NUMBER_OF_OBJECTS)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On clear, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	my_other_list.clear();
darco b3016b
	if(my_test_obj::instance_count)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On clear, instance count=%d, should be zero.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	printf("PASSED\n");
dooglus cee594
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
void test_func(etl::handle<my_test_obj> handle)</my_test_obj>
darco b3016b
{
darco b3016b
	if(handle) { int i=handle.count(); i++; }
darco b3016b
}
darco b3016b
darco b3016b
int loose_handle_test(void)
darco b3016b
{
darco b3016b
	printf("handle: loose_handle test: ");
darco b3016b
	my_test_obj::instance_count=0;
darco b3016b
darco b3016b
	etl::loose_handle<my_test_obj> obj_handle_loose;</my_test_obj>
darco b3016b
	etl::handle<my_test_obj> obj_handle2;</my_test_obj>
darco b3016b
darco b3016b
	{
darco b3016b
		etl::handle<my_test_obj> obj_handle(new my_test_obj(rand()));</my_test_obj>
darco b3016b
		if(my_test_obj::instance_count!=1)
darco b3016b
		{
darco b3016b
			printf("FAILED!\n");
darco b3016b
			printf(__FILE__":%d: on handle assignment from new object, instance count=%d, should be 1.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
			return 1;
darco b3016b
		}
darco b3016b
darco b3016b
		obj_handle_loose=obj_handle;
darco b3016b
		if(obj_handle!=obj_handle_loose)
darco b3016b
		{
darco b3016b
			printf("FAILED!\n");
darco b3016b
			printf(__FILE__":%d: on loose_handle assignment\n",__LINE__);
darco b3016b
			return 1;
darco b3016b
		}
darco b3016b
darco b3016b
		obj_handle2=obj_handle_loose;
darco b3016b
		if(my_test_obj::instance_count!=1)
darco b3016b
		{
darco b3016b
			printf("FAILED!\n");
darco b3016b
			printf(__FILE__":%d: on handle assignment from loose_handle, instance count=%d, should be 1.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
			return 1;
darco b3016b
		}
darco b3016b
darco b3016b
		test_func(obj_handle_loose);
darco b3016b
		if(my_test_obj::instance_count!=1)
darco b3016b
		{
darco b3016b
			printf("FAILED!\n");
darco b3016b
			printf(__FILE__":%d: on handle assignment from loose_handle, instance count=%d, should be 1.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
			return 1;
darco b3016b
		}
darco b3016b
	}
darco b3016b
dooglus a91ceb
	{
dooglus a91ceb
		etl::loose_handle<my_test_obj> a(new my_test_obj(27)), b(new my_test_obj(42));</my_test_obj>
dooglus a91ceb
		a.swap(b);
dooglus a91ceb
		if (a->my_id != 42 || b->my_id != 27)
dooglus a91ceb
		{
dooglus a91ceb
			printf("FAILED!\n");
dooglus a91ceb
			printf(__FILE__":%d: on loose_handle swap (27,42) gave (%d,%d), should be (42,27).\n",__LINE__,a->my_id,b->my_id);
dooglus a91ceb
			return 1;
dooglus a91ceb
		}
dooglus a91ceb
	}
dooglus a91ceb
dooglus a91ceb
	if(my_test_obj::instance_count!=3)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
dooglus a91ceb
		printf(__FILE__":%d: on create/destroy, instance count=%d, should be 3.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	printf("PASSED\n");
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
int handle_cast_test()
darco b3016b
{
darco b3016b
	printf("handle: casting test: ");
darco b3016b
darco b3016b
	etl::handle<my_test_obj> obj;</my_test_obj>
darco b3016b
	etl::handle<my_other_test_obj> other_obj;</my_other_test_obj>
darco b3016b
	etl::loose_handle<my_other_test_obj> loose_obj;</my_other_test_obj>
dooglus cee594
darco b3016b
	other_obj.spawn();
darco b3016b
	loose_obj=other_obj;
dooglus cee594
darco b3016b
	obj=etl::handle<my_test_obj>::cast_dynamic(loose_obj);</my_test_obj>
dooglus cee594
darco b3016b
	if(obj!=other_obj)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: on handle assignment from loose_handle.\n",__LINE__);
darco b3016b
		return 1;
darco b3016b
	}
dooglus cee594
darco b3016b
	printf("PASSED\n");
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
/* === E N T R Y P O I N T ================================================= */
darco b3016b
darco b3016b
int main()
darco b3016b
{
darco b3016b
	int error=0;
darco b3016b
darco b3016b
	error+=handle_basic_test();
darco b3016b
	error+=handle_cast_test();
darco b3016b
	error+=handle_general_use_test();
darco b3016b
	error+=handle_inheritance_test();
darco b3016b
	error+=loose_handle_test();
darco b3016b
	error+=rhandle_general_use_test();
dooglus cee594
darco b3016b
	return error;
darco b3016b
}