
/********************************************************************/
/*				Test the cheak_heap class.							 */
/********************************************************************/

#include <iostream.h>
#include <chkheap.hpp>

struct test_class_bad		// Class that does not deallocate.
{
	char *p;
	test_class_bad()	{ p = new char; }
	~test_class_bad()	{ /* p is not deleted. */ }
private:
	test_class_bad(test_class_bad&);
};

struct test_class_good		// Class that does deallocate.
{
	char *p;
	test_class_good() { p = new char; }
	test_class_good(test_class_good &t) { p = new char; *p = *(t.p); }
	~test_class_good()	{ delete p; }
};

char *test_easy(const int);		// Prototypes for test functions.
char *test_class(const int);
void test_value(test_class_good);
void test_test_value(test_class_good &t)	{ test_value(t); }


main()
{
	test_class_good t;
    char *p;

	cout << "Testing check_heap class.  Should have three okay errors\n";
	check_heap check;

	p = test_easy(1);
	check.test("Test_easy(1) error: ");

	p = test_easy(0);
	check.test("This error is okay: ");
    delete p;	// Clean up memory and fix for next check.test().

	p = test_class(1);
	check.test("Test_class(1) error: ");

	p = test_class(0);
	check.test("This error is okay: ");
	delete p;		// Clean up memory.

	check.start();	// Get ready for next call to check.test().

	// Next line demonstrates compiler creating temp value.
	test_value(t);
	check.testnew("This error is okay: ");
	test_test_value(t);
	check.test("Test_test_value(t) error: ");
}

char *test_class(const int i)
{
	char *r;

	if (i)
		{
		test_class_good t;
        r = 0;
		}
	else{
		test_class_bad t;
        r = t.p;
		}
	return r;
}
	
char *test_easy(const int i)
{
	char *p = new char;
	if (i)	{ delete p;  p = 0; }
    return p;
}

void test_value(test_class_good t)
{	/* Ignore warning about t not being used. */ }
