Source: ./Nobel/SelfTestingObject.h
|
|
|
|
#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. |