Example #1
0
bool Sudoku::fillInColumns() {
	PQueue<Row & > queue;
	for (int i = 0; i < SUDOKU_SIZE; i++)
		queue.push(columns[i]);

	return fillInSquares(queue, emptySquare);
}
Example #2
0
bool Sudoku::fillInBigSquares() {
	PQueue<BigSquare & > queue;
	for (int i = 0; i < SUDOKU_SIZE; i++)
		queue.push(squares[i]);

	return fillInSquares(queue, emptySquare);
}
Example #3
0
void testPQueue(PQueue& pq){
  for(int i = 9 ; i > 0; i--){
    pq.add(i);
    }
  //  pq.add(1);
  pq.removeAll();
}
Example #4
0
/*
 * Function: BasicPQueueTest
 * Usage: BasicQueueTest();
 * ------------------------
 * Runs a test of the PQueue focusing on simple enqueue, dequeueMax.
 * Reports results of test to cout.
 */
void BasicPQueueTest()
{
    PQueue pq;
    
    cout << boolalpha;	// configure stream to print booleans as true/false instead of 1/0
    cout << endl << "-----------   Testing Basic PQueue functions -----------" << endl;
    cout << "The pqueue was just created.  Is it empty? " << pq.isEmpty() << endl;
    
    cout << endl << "Now enqueuing integers from 1 to 10 (increasing order)" << endl;
    for (int i = 1; i <= 10; i++)
        pq.enqueue(i);
    
    cout << "Pqueue should not be empty.  Is it empty? " << pq.isEmpty() << endl;
    cout << "Pqueue should have size = 10.  What is size? " << pq.size() << endl;
    
    cout << "Dequeuing the top 5 elements: ";
    for (int j = 0; j < 5; j++)
        cout << pq.dequeueMax() << " ";
    cout << endl << "Pqueue should have size = 5.  What is size? " << pq.size() << endl;
    
    cout << endl << "Dequeuing all the rest: ";
    while (!pq.isEmpty())
        cout << pq.dequeueMax() << " ";
    cout << endl << "Pqueue should be empty.  Is it empty? " << pq.isEmpty() << endl;
    
}
Example #5
0
void PQSort(int array[], int nElems)
{
    PQueue pq;
    for (int i = 0; i < nElems; i++)
        pq.enqueue(array[i]);
    for (int i = nElems-1; i >= 0; i--)
        array[i] = pq.dequeueMax();
}
Example #6
0
/*
 * Function: RunPerformanceTrial
 * -----------------------------
 * Runs a time trial using pqueues of specified size.  The first 2 time trials report
 * the amount of time necessary to enqueue/dequeue and use pqueue to sort.
 * The last trial reports on memory usage.
 */
void RunPerformanceTrial(int size)
{
	Randomize();
	PQueue pq;
	cout << endl << "---- Performance for " << size << "-element pqueue (" << pq.implementationName() << ")" << " -----" << endl << endl;
	RunEnqueueDequeueTrial(size);
	RunSortTrial(size);
    RunMemoryTrial(size);
    cout << endl << "------------------- End of trial ---------------------" << endl << endl;
}
/*
 * Function: MoreQueueTest
 * Usage: MoreQueueTest();
 * -----------------------
 * Tests a few more enqueue, dequeueMax, some boundary cases explored.
 * Reports results of test to cout.
 */
void MorePQueueTest()
{
	PQueue pq;
	
	cout << boolalpha;
	cout << endl << "-----------   More pqueue testing functions -----------" << endl;

	cout << endl << "Enqueuing integers from 15 downto 1 (decreasing order)" << endl;
	for (int i = 15; i > 0; i--)
		pq.enqueue(i);
	
	cout << "Enqueuing duplicates for even numbers 2 to 14" << endl;
	for (int j = 2; j <= 14; j += 2)
		pq.enqueue(j);

	cout << "Dequeuing the top 10 elements: ";
	for (int k = 0; k < 10; k++)
		cout << pq.dequeueMax() << " ";
		
	cout << endl << "Dequeuing all the rest: ";
	while (!pq.isEmpty())
		cout << pq.dequeueMax() << " ";
	cout << endl << "Pqueue should be empty.  Is it empty? " << pq.isEmpty() << endl;

	// The line below calling DequeueMax should cause your program to halt with an error.
	// Once you've verified that your PQueue correctly raises this error
	// you should comment out the call, so that you can continue on with the other tests.
	cout << endl << "This next test raises an error if your pqueue is working correctly." << endl;
	cout << "Once you verify the test, comment it out to move on to the other tests." << endl;
	cout << "(Comment out line " << __LINE__ + 1 << " in the file " << __FILE__ << ")." << endl;
	cout << "Dequeue from empty pqueue returns " << pq.dequeueMax() << endl;

	cout << endl << "Hit return to continue: ";
	GetLine();
}
int main()
{
    PQueue<string> line;
    line.Enqueue("A", 3);
    line.Enqueue("B", 2);
    line.Enqueue("C", 4);
    line.Enqueue("D", 2);
    line.Enqueue("E", 1);
    line.Enqueue("F", 3);
    for (int i = 0; i < 6; i++)
    {
        cout << line.Dequeue() << endl;
    }
}
Example #9
0
int main() {
	PQueue<int> q;
	int* a = new int[SIZE];
		unsigned int i;
		// fill array with random integers
		for(i = 0; i < SIZE; i++) {
			a[i] = rand()%(SIZE*4);
		}

		int* p = a;
		// insert all items
		for( i = 0; i < SIZE; i++) {
			//cout << "Inserting: " << *(p+i) << "\n";
			q.push(*(p+i));
		}

		// add all elements to result array
		vector<int> result;
		while(!q.empty()) {
			int * temp = q.top();
			q.pop();
			result.push_back(*temp);
			delete temp;
		}
//		unsigned int k;
//		for (k = 0; k < result.size(); k++) {
//			cout << " " << result[k];
//		}
//		cout << endl;

		// If result is not sorted, something went wrong
		// uncomment above code to view all elements inline
		unsigned int l;
		bool fail = false;
		for (l = 1; l < result.size() ; l++) {
			if (result[l-1] > result[l]) {
				cout << "LIST NOT SORTED, FAILURE" << endl;
				fail = true;
			}
		}
		if (!fail) {
			cout << "Test was successful, integers were sorted" << endl;
		}
		delete[] a;
	return 0;
}
Example #10
0
/*
 * Function: MoreQueueTest
 * Usage: MoreQueueTest();
 * -----------------------
 * Tests a few more enqueue, dequeueMax, some boundary cases explored.
 * Reports results of test to cout.
 */
void MorePQueueTest()
{
    PQueue pq;
    
    cout << boolalpha;
    cout << endl << "-----------   More pqueue testing functions -----------" << endl;
    
    cout << endl << "Enqueuing integers from 15 downto 1 (decreasing order)" << endl;
    for (int i = 15; i > 0; i--)
        pq.enqueue(i);
    
    cout << "Enqueuing duplicates for even numbers 2 to 14" << endl;
    for (int j = 2; j <= 14; j += 2)
        pq.enqueue(j);
    
    cout << "Dequeuing the top 10 elements: ";
    for (int k = 0; k < 10; k++)
        cout << pq.dequeueMax() << " ";
    
    cout << endl << "Dequeuing all the rest: ";
    while (!pq.isEmpty())
        cout << pq.dequeueMax() << " ";
    cout << endl << "Pqueue should be empty.  Is it empty? " << pq.isEmpty() << endl;
    
}
Example #11
0
/*
 * Function: RunEnqueueDequeueTrial
 * --------------------------------
 * Runs the enqueue & dequeue time trials for the specified
 * pqueue size.  Reports results to cout.
 * Note that we just randomly choose numbers to insert.
 * The amount of time it takes to do one enqueue/dequeue is
 * too small to be accurately measured, so we do many iterations in 
 * a loop and time that.
 */
void RunEnqueueDequeueTrial(int size)
{
	PQueue pq;
	
	for (int i = 0; i < size; i++)
		pq.enqueue(RandomInteger(1,size));
	
    cout << "Time to enqueue into " << size << "-element pqueue: " << flush;
    double start = GetCurrentTime();
    for (int j = 0; j < NumRepetitions; j++) 
	    pq.enqueue(RandomInteger(1, 2*size));
    cout << 1000*(GetCurrentTime() - start)/NumRepetitions << " usecs" << endl;

    cout << "Time to dequeue from " << size << "-element pqueue: " << flush;
    start = GetCurrentTime();
    for (int k = 0; k < NumRepetitions; k++) 
	    pq.dequeueMax();
    cout << 1000*(GetCurrentTime() - start)/NumRepetitions << " usecs" << endl;
}
Example #12
0
void loadIntoPriorityQueue(PQueue &inputPQueue) // Create and add arrival events to event list
{
	unsigned int tempTime; //temporary holders for cin input
	unsigned int tempLength;

	while(cin >> tempTime >> tempLength) //load data into both variables until hits EOF
	{
		//cout << "Input #" << currentInputCount << ": Time = " << tempTime << ", Length = " << tempLength << endl; //debug
		Event tempEvent(tempTime, tempLength);
		//cout << "created event successfully" << endl; //debug
		inputPQueue.enqueue(tempEvent); //insert our new event into the queue
	}

	//inputPQueue.print(); //debug
}
Example #13
0
void Encoding::buildEncodingForInput(ibstream& infile){


	map<int, int> charMap;
	getCharCount(infile, charMap);
	PQueue<node*> pq;
	map<int, int>::iterator iter;
	for (iter = charMap.begin(); iter != charMap.end(); iter++){
		node* tempNode = new node;
		tempNode->letter = iter->first;
		tempNode->weight = iter->second;
		tempNode->leftChild = tempNode->rightChild = NULL;
		//cout << tempNode->letter << endl;
		pq.add(tempNode, iter->second);
	}
	map <int, string> encodingMap;
	while (pq.size() != 1){
		node *parent = new node;
		parent->letter = 26;

		parent->weight = 0; //probably don't need this
		parent->leftChild = pq.extractMin();
		parent->leftChild->path +='0';

		parent->rightChild = pq.extractMin();

		parent->rightChild->path += '1';


		parent->weight = parent->leftChild->weight+parent->rightChild->weight;
		pq.add(parent, parent->weight);
	}

	//for testing

	map<int, int>::iterator it;
	node* tree = pq.extractMin();
	for (it = charMap.begin(); it != charMap.end(); it++){
		BuildEncodingMap(tree, mp[it->first], it->first);
		string temps = mp[it->first];
		char tempc = it->first;
		//cout << tempc << " has the encoding " << temps << endl;
	}

	//PrintTree(tree);
}
Example #14
0
/*
 * Function: RunMemoryTrial
 * ------------------------
 * Fills a pqueue to specified size and reports memory usage.  Then does
 * a bunch of enqueue-dequeue operations to jumble things up and reports
 * on the memory usage again. Reports results to cout.
 */
void RunMemoryTrial(int size)
{
    PQueue pq;
    cout << endl << "Running memory trial on " << size << "-element pqueue" << endl;
    for (int i = 0; i < size; i++)
		pq.enqueue(RandomInteger(1, size));
    cout << "After consecutive enqueues, " << size << "-element pqueue is using "
         << pq.bytesUsed()/1000 << " KB of memory" << endl;
    int num = size;
    for (int j = 0; j < NumRepetitions; j++) { /* do a bunch of enqueue/dequeue ops */
	    if (RandomChance(.5)) { 
	        pq.enqueue(RandomInteger(0, size));
	        num++;
        } else {
	        pq.dequeueMax();
	        num--;
	    }
    }
    cout << "After more enqueue/dequeue, " << num << "-element pqueue is using "
         << pq.bytesUsed()/1000 << " KB of memory" << endl;
}
Example #15
0
int main(){
    int numItems = 50;
    PQueue<int, 100> q;  // use PQ tempalate
    int i, x;
    srand(time(0));
    cout << "Enqueuing..." << endl;
    for( i = 1; i < numItems; i++) {
        x = rand() % 100;
        cout << x << " ";
        q.insert( x );
    }
    
    cout << "\n\nDequeuing..." << endl;
    for( i = 1; i < numItems; i++ ) {
        x = q.findMin();
        q.deleteMin();
        cout << x << " ";
    }
    cout << endl;
    
    assert(q.size() == 0);
    q.insert(3);
    q.insert(10);
    q.insert(9);
    
    x = q.findMin();
    q.deleteMin();
    cout << x << " ";

    x = q.findMin();
    q.deleteMin();
    cout << x << " ";


    q.insert(8);
    q.insert(2);
    
    x = q.findMin();
    q.deleteMin();
    cout << x << " ";
    
    x = q.findMin();
    q.deleteMin();
    cout << x << " ";
    
    x = q.findMin();
    q.deleteMin();
    cout << x << " ";
    
}
Example #16
0
int main(void)
{
	Queue bankQueue; //represents the line of customers in the bank/bank line
	PQueue eventListPQueue; //priority queue eventListPQueue for the event list

	bool tellerAvailable = true;
	loadIntoPriorityQueue(eventListPQueue); //load data into Priority Queue from file/Create and add arrival events to event list

	//waitTime = SUM(time of departure) - SUM(processing time) - SUM(time of arrival)/COUNT(EVENTS)
	unsigned int sumDepartureTime = 0;
	unsigned int sumProcessingTime = 0;
	unsigned int sumArrivalTime = 0;
	unsigned int eventCount = 0; //track how many customers came in
	float waitTime; //Calculated at the end

	cout << "Simulation Begins" << endl;

	while(!eventListPQueue.isEmpty()) //run while eventListPQueue is not empty
	{
		Event newEvent = eventListPQueue.peek();
		// Get current time
		unsigned int currentTime = newEvent.getTime(); // get time of newEvent
		if (newEvent.getType() == 'A') //check if newEvent is an arrival event
		{
			// Processes an arrival event.
			//processArrival(newEvent, eventListPQueue, bankQueue, tellerAvailable, currentTime);

			eventListPQueue.dequeue(); //Remove this event from the event list
			Event customer = newEvent; //customer referenced in arrivalEvent
			if (bankQueue.isEmpty() && tellerAvailable)
			{
				unsigned int departureTime = currentTime + customer.getLength();//currentTime + transaction time in arrivalEvent
				Event newDepartureEvent('D', departureTime, 0); //a new departure event with departureTime
				eventListPQueue.enqueue(newDepartureEvent);
				tellerAvailable = false;
			}
			else
			{
				bankQueue.enqueue(customer);
			}

			cout << "Processing an arrival event at time:\t" << customer.getTime() << endl;
			eventCount++; //count how many customers arrived
			sumArrivalTime += customer.getTime();
			sumProcessingTime += customer.getLength();
		}
		else
		{
			// Processes a departure event.
//			processDeparture(newEvent, eventListPQueue, bankQueue, tellerAvailable, currentTime);
			eventListPQueue.dequeue(); // Remove this event from the event list

			if(!bankQueue.isEmpty())
			{
				// Customer at front of line begins transaction
				Event customer = bankQueue.peek();
				bankQueue.dequeue();
				unsigned int departureTime = currentTime + customer.getLength(); //currentTime + transaction time in customer
				Event newDepartureEvent('D', departureTime, 0); //a new departure event with departureTime
				eventListPQueue.enqueue(newDepartureEvent);
			}
			else
			{
				tellerAvailable = true;
			}

			cout << "Processing a departure event at time:\t" << currentTime << endl; //temp
			sumDepartureTime += currentTime;
		}

	}

	waitTime = (float)(sumDepartureTime - sumProcessingTime - sumArrivalTime)/eventCount; //do the average wait time calculation

	cout << "Simulation Ends\n\n";
	cout << "Final Statistics:" << endl;
	cout << "\tTotal number of people processed: " << eventCount << endl;
	cout << "\tAverage amount of time spent waiting: " << waitTime << endl;

//	cout << "Bank Queue Contents:" << endl;
//	bankQueue.print();
//	cout << "Priority Queue Contents:" << endl;
//	eventListPQueue.print();
//	resultPrinterQueue(bankQueue); //print out the results
	return 0;
}
Example #17
0
void sortRandomTests() {
    beginTest("Sort Random Tests");

    /* This try ... catch system is designed to catch any errors that the
     * program explicitly generates.  It does not guard against runtime
     * crashes from errors like following a bad pointer, so if your
     * program crashes and pulls up the debugger, you should be looking
     * for memory errors.
     */
    try {
        /* The use of curly braces here introduces a new block scope.  We
         * use this so that we can construct multiple different priority
         * queues.
         */

        /* Basic test: Feed the strings H through A into the priority queue in some order,
         * then confirm that they come back in sorted order
         */
        {
            logInfo("Enqueuing a random permutation of A - H and checking whether it leaves sorted.");
            Vector<string> letters;
            for (char ch = 'A'; ch <= 'H'; ch++) {
                /* The code
                 *
                 *    string(1, ch)
                 *
                 * converts the character ch into a one-character string.
                 */
                letters += string(1, ch);
            }

            /* Scramble the letters with the STL random_shuffle algorithm. */
            random_shuffle(letters.begin(), letters.end());

            /* Load the letters into the priority queue. */
            PQueue queue;
            foreach (string letter in letters)
                queue.enqueue(letter);

            /* Confirm they come back sorted. */
            for (char ch = 'A'; ch <= 'H'; ch++) {
                string expected(1, ch);
                checkCondition(queue.dequeueMin() == expected, "Queue should yield " + expected + ".");
            }
        }

        /* Harder test: Sort 10 random strings and confirm that the priority queue hands
         * them back in the same order.
         */
        {
            logInfo("Enqueuing 10 random strings and checking whether it leaves sorted.");
            /* Create 10 random strings. */
            Vector<string> randomValues;
            for (int i = 0; i < 10; i++) {
                randomValues += randomString();
            }

            /* Feed these values into the priority queue and pull them back out. */
            PQueue queue;
            foreach (string value in randomValues)
                queue.enqueue(value);

            /* Confirm each comes back correctly. */
            sort(randomValues.begin(), randomValues.end());
            for (int i = 0; i < randomValues.size(); i++) {
                checkCondition(queue.dequeueMin() == randomValues[i],
                               "Expecting to get value " + randomValues[i] + " from queue.");
            }
        }

        /* Much harder test: Sort 10000 random strings and confirm that the priority queue hands
         * them back in the same order.
         */
        {
            logInfo("Generating 10000 random strings.");
            Vector<string> randomValues;
            for (int i = 0; i < 10000; i++) {
                randomValues += randomString();
            }

            /* Feed these values into the priority queue and pull them back out. */
            logInfo("Enqueuing 10000 random strings.");
            PQueue queue;
            foreach (string value in randomValues)
                queue.enqueue(value);

            /* Use C++'s provided sorting routine to sort these values. */
            logInfo("Sorting 10000 random strings.");
            sort(randomValues.begin(), randomValues.end(), greater<string>());

            /* Confirm each comes back correctly. */
            logInfo("Dequeuing 10000 random strings.");
            bool isCorrect = true;
            reverse(randomValues.begin(), randomValues.end());
            for (int i = 0; i < randomValues.size(); i++) {
                if (queue.dequeueMin() != randomValues[i]) {
                    isCorrect = false;
                    break;
                }
            }

            checkCondition(isCorrect, "Queue correctly sorted 10000 random strings.");
        }

    } catch (ErrorException& e) {
        cout << "TEST FAILURE: Unexpected exception: " << e.getMessage() << endl;
    } catch (exception& e) {
        cout << "TEST FAILURE: Unexpected exception: " << e.what() << endl;
    } catch (...) {
        cout << "TEST FAILURE: Unknown exception." << endl;
    }

    endTest("Sort Random Tests");
}
Example #18
0
void sortCraftedTests() {
    beginTest("Sort Crafted Tests");

    /* This try ... catch system is designed to catch any errors that the
     * program explicitly generates.  It does not guard against runtime
     * crashes from errors like following a bad pointer, so if your
     * program crashes and pulls up the debugger, you should be looking
     * for memory errors.
     */
    try {
        /* The use of curly braces here introduces a new block scope.  We
         * use this so that we can construct multiple different priority
         * queues.
         */

        /* First test: Two concatenated sequences of ascending values that
         * interleave with one another.
         */
        {
            logInfo("Sorting two sequences that need to be interleaved.");
            Vector<string> sequence;
            sequence += string(1, 'A');
            sequence += string(1, 'C');
            sequence += string(1, 'E');
            sequence += string(1, 'G');
            sequence += string(1, 'B');
            sequence += string(1, 'D');
            sequence += string(1, 'F');
            sequence += string(1, 'H');

            /* Feed this sequence into the priority queue. */
            PQueue queue;
            foreach (string letter in sequence) {
                queue.enqueue(letter);
            }

            /* Dequeue the elements and confirm that they come back sorted. */
            for (char ch = 'A'; ch <= 'H'; ch++) {
                string expected(1, ch);
                checkCondition(queue.dequeueMin() == expected, "Queue should yield " + expected + ".");
            }
        }

        /* Second test: Two interleaving sequences, alternate version.. */
        {
            logInfo("Sorting two sequences that need to be interleaved, version two.");
            Vector<string> sequence;
            sequence += string(1, 'B');
            sequence += string(1, 'D');
            sequence += string(1, 'F');
            sequence += string(1, 'H');
            sequence += string(1, 'A');
            sequence += string(1, 'C');
            sequence += string(1, 'E');
            sequence += string(1, 'G');

            /* Feed this sequence into the priority queue. */
            PQueue queue;
            foreach (string letter in sequence) {
                queue.enqueue(letter);
            }

            /* Dequeue the elements and confirm that they come back sorted. */
            for (char ch = 'A'; ch <= 'H'; ch++) {
                string expected(1, ch);
                checkCondition(queue.dequeueMin() == expected, "Queue should yield " + expected + ".");
            }
        }
Example #19
0
void basicStructuralTests() {
    beginTest("Basic Structural Tests");

    /* This try ... catch system is designed to catch any errors that the
     * program explicitly generates.  It does not guard against runtime
     * crashes from errors like following a bad pointer, so if your
     * program crashes and pulls up the debugger, you should be looking
     * for memory errors.
     */
    try {

        /* The use of curly braces here introduces a new block scope.  We
         * use this so that we can construct multiple different priority
         * queues.
         */

        /* Basic test: Add 5 elements to the queue and ensure that
         * the size is correct at each step.
         */
        {
            logInfo("These tests will check size() isEmpty() without calling dequeueMin().");

            PQueue queue;
            checkCondition(queue.isEmpty(), "New priority queue should be empty.");
            checkCondition(queue.size() == 0, "New priority queue should have size 0.");

            for (int i = 0; i < 5; i++) {
                queue.enqueue("Test String");

                checkCondition(queue.size() == i + 1, "Queue should have proper size after inserting a value.");
                checkCondition(!queue.isEmpty(), "Queue containing elements should not be empty.");
                cout<<i<<endl;
            }
        }

        /* Slightly more complex test: Enqueue and dequeue elements, ensuring the
         * size matches at each step.
         */
        {
            logInfo("We're about to start calling dequeueMin().");
            PQueue queue;

            for (int i = 0; i < 5; i++) {
                queue.enqueue("Test String");
            }

            for (int i = 5; i > 0; i--) {
                checkCondition(queue.size() == i, "Queue should have proper size after dequeues.");
                checkCondition(!queue.isEmpty(), "Queue should not be empty before all elements are removed.");
                queue.dequeueMin();
            }

            checkCondition(queue.size() == 0, "After removing all elements, the queue should have size 0.");
            checkCondition(queue.isEmpty(), "After removing all elements, the queue should be empty.");
        }

        /* Getting harder: The value dequeued should always match the value of peek(). */
        {
            logInfo("This next test will check whether peek() matches dequeueMin().");
            PQueue queue;

            for (int i = 0; i < 5; i++) {
                queue.enqueue(randomString());
            }

            while (!queue.isEmpty()) {
                string expected = queue.peek();
                checkCondition(queue.dequeueMin() == expected, "Value returned by peek() matches value returned by dequeueMin()");
            }
        }

        /* A different one - let's make sure that peeking at an empty queue causes an
         * error.
         */
        {
            PQueue queue;
            bool didThrow = false;
            try {
                logInfo("About to peek into an empty queue.  This may cause a crash");
                logInfo("if your implementation is incorrect.");
                queue.peek();
            } catch (ErrorException&) {
                didThrow = true;
            }

            checkCondition(didThrow, "Priority queue uses 'error' when peek() called on empty queue.");
        }

        /* In the same vein - what happens if we dequeue from an empty queue? */
        {
            PQueue queue;
            bool didThrow = false;
            try {
                logInfo("About to dequeue from an empty queue.  This may cause a crash");
                logInfo("if your implementation is incorrect.");
                queue.dequeueMin();
            } catch (ErrorException&) {
                didThrow = true;
            }

            checkCondition(didThrow, "Priority queue uses 'error' when dequeueMin() called on empty queue.");
        }

    } catch (ErrorException& e) {
        cout << "TEST FAILURE: Unexpected exception: " << e.getMessage() << endl;
    } catch (exception& e) {
        cout << "TEST FAILURE: Unexpected exception: " << e.what() << endl;
    } catch (...) {
        cout << "TEST FAILURE: Unknown exception." << endl;
    }

    endTest("Basic Structural Tests");
}