Source: 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 <string>
#include <stdexcept>
#include <cstdio>

namespace NobelNS {

//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:
	InvariantException(std::string s, int line) : std::runtime_error(s+InvariantException::toString(line)) {}
	virtual ~InvariantException() {}
private:
	static std::string toString(int i) {
		char buf[11];
		snprintf(buf, 11, "%d", i);
		return std::string(buf);
	}
};

}

/*#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 NobelNS::InvariantException(std::string()+"Class invariant failure! File: "+__FILE__+" line: ", __LINE__)
		#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 Tue Mar 20 23:14:05 2001, using kdoc 2.0a53.