|
||
__DECLARE_TEST
To illustrate the use of the __DECLARE_TEST
macro, we can define the class TEgInvariant
. It has a very simple state, a single data member iData
. An object is in an invalid state when iData
is greater than 100.
class TEgInvariant
{
public:
void SetData(TUint a);
TUint Data();
void DoSomeThing();
private:
TUint iData;
__DECLARE_TEST;
};
Then we define the getter/setter functions for iData
:
void TEgInvariant::SetData(TUint a)
{
iData=a;
}
TUint TEgInvariant::Data()
{
return iData;
}
TEgInvariant::DoSomeThing()
is a function that would perform some useful work. We verify the object’s state at its beginning and end through __TEST_INVARIANT
.
void TEgInvariant::DoSomeThing()
{
__TEST_INVARIANT;
//...do something with iData
__TEST_INVARIANT;
}
TEgInvariant::__DbgTestInvariant()
performs the invariance test:
void TEgInvariant::__DbgTestInvariant() const
{
#if defined(_DEBUG)
if(iData > 100)
User::Invariant();
#endif
}
We could test the class with the following code:
TEgInvariant Eg;
Eg.SetData(10);
Eg.DoSomeThing();
Eg.SetData(1000);
Eg.DoSomeThing();
In debug builds, the second call to DoSomeThing()
causes a panic, alerting us to a problem in the code that needs fixing.