/* Copyright (c) 2009 David Braden
 * http://tutorials.neonphog.com
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "except.h"

#include <iostream>

//Begin FruitException Code
FruitException::FruitException():
	sWhat("FruitException")
{
}

FruitException::~FruitException() throw()
{
}

const char *FruitException::what() const throw()
{
	return sWhat.c_str();
}
//End FruitException Code


//Begin AppleException Code
AppleException::AppleException(std::string sDetail)
{
	sWhat += ": Apples are ";
	sWhat += sDetail;
}

AppleException::~AppleException() throw()
{
}
//End AppleException Code


//Begin BananaException Code
BananaException::BananaException(std::string sDetail)
{
	sWhat += ": Bananas are ";
	sWhat += sDetail;
}

BananaException::~BananaException() throw()
{
}
//End BananaException Code


void testExcept(int iMode)
{
	std::cout << std::dec << iMode << ": ";
	try
	{
		switch( iMode )
		{
			case 0:
				throw FruitException();
				break;
			case 1:
				throw AppleException("rotten");
				break;
			case 2:
				throw BananaException("getting brown");
				break;
			default:
				std::cout << "Got away clean!" << std::endl;
				break;
		}
	}
	catch( AppleException &e )
	{
		std::cout << "Caught an AppleException: " << std::endl;
		std::cout << "\t" << e.what() << std::endl;
	}
	catch( FruitException &e )
	{
		std::cout << "Caught a basic FruitException: " << std::endl;
		std::cout << "\t" << e.what() << std::endl;
	}
}

int main()
{
	for( int i=0; i<4; ++i )
	{
		testExcept(i);
	}
	return 0;
}

