Source: ./Nobel/SelfTestingObject.h


Annotated List
Files
Globals
Hierarchy
Index
#ifndef SELFTESTINGOBJECT_H //estetään moninkertainen includointi
#define SELFTESTINGOBJECT_H

#include <cassert> //käytetään assert-makroja
#include <exception>
#include <string>
#include <stdexcept> // ei kääntynyt ilman. olisiko pitänyt?
namespace Nobel {

//käyttäjä perii abstraktin SelfTestingObject-luokan
class SelfTestingObject {
public:
	virtual bool invariant() const = 0; //käyttäjä toteuttaa abstraktin rajapinnan
	virtual ~SelfTestingObject() {}
};

class InvariantException : public std::runtime_error {
public:
	//std::runtime_error-funktioiden deklaraatiot puuttuvat. Onko ne pakko laittaa???
	InvariantException(const std::string& s) : std::runtime_error(s) {}
	virtual ~InvariantException() {}
};

}

/*#define NDEBUG*/ //kun NDEBUG on määritelty, testausvaiheen assertit korvataan poikkeuksilla
/*#define OPTIMIZATION*/ //kun OPTIMIZATION on määritelty, kaikki tarkistukset poistetaan
			//käytetään vain, jos on pakko optimoida

#ifndef NDEBUG //jos debuggaus on päällä käytetään assertteja
	#define INV() assert(this->invariant())
	#define TEST(boolean, exception) assert(boolean)
	#define INVDB() assert(this->invariant())
	#define TESTDB(boolean) assert(boolean)
#else //muuten heitetään poikkeuksia
	#ifndef OPTIMIZATION //jos ei optimoida
		#define INV() if (!this->invariant()) throw Nobel::InvariantException("__FILE__: rivi __LINE__: luokan invariantti epätosi")
		#define TEST(boolean, exception) if (!(boolean)) throw (exception)
		#define INVDB()
		#define TESTDB(boolean)
	#else //jos optimoidaan, tarkistukset poistetaan
		#define INV()
		#define TEST(boolean, exception)
		#define INVDB()
		#define TESTDB(boolean)
	#endif
#endif

/*Makroja INV() ja TEST(boolean, exception) käytetään esim. jälki- ja esiehtoina.
Niiden käyttö on suositeltavaa.
INVDB() ja TESTDB(boolean) sopivat aikaa vaativiin tarkistuksiin.*/

#endif

Generated by: hoppq@ilenkone on Thu Mar 1 15:43:18 2001, using kdoc 2.0a50.