This is Unofficial EPICS BASE Doxygen Site
Unit testing helpers

Macros

#define TEST_METHOD(klass, method)   ::detail::test_method<klass, &klass::method>(#klass, #method)
 
#define testEqual(LHS, RHS)   ::detail::testEqualx(#LHS, #RHS, LHS, RHS)
 
#define testNotEqual(LHS, RHS)   ::detail::testNotEqualx(#LHS, #RHS, LHS, RHS)
 
#define testTrue(B)   ::detail::testPassx(!!(B))<<#B
 
#define testThrows(EXC, CODE)   try{ CODE; testFail("unexpected success of " #CODE); }catch(EXC& e){testPass("catch expected exception: %s", e.what());}
 
#define testShow()   ::detail::testPassx()
 

Functions

template<typename PVD >
::detail::testPassx testFieldEqual (const std::tr1::shared_ptr< const epics::pvData::PVStructure > &val, const char *name, typename PVD::value_type expect)
 
template<typename PVD >
::detail::testPassx testFieldEqual (const std::tr1::shared_ptr< const epics::pvData::PVStructure > &val, const char *name, typename PVD::const_svector expect)
 

Detailed Description

Helper functions for writing unit tests.

Macro Definition Documentation

#define TEST_METHOD (   klass,
  method 
)    ::detail::test_method<klass, &klass::method>(#klass, #method)

Run a class method as a test.

Each invocation of TEST_METHOD() constructs a new instance of 'klass' on the stack. Thus constructor and destructor can be used for common test setup and tear down.

1 namespace { // anon
2  struct MyTest {
3  MyTest() { } // setup
4  ~MyTest() { } // tear down
5  void test1() {}
6  void test2() {}
7  };
8 } // namespace anon
9 MAIN(somename) {
10  testPlan(0);
11  TEST_METHOD(MyTest, test1)
12  TEST_METHOD(MyTest, test2)
13  return testDone();
14 }

Definition at line 98 of file pvUnitTest.h.

#define testEqual (   LHS,
  RHS 
)    ::detail::testEqualx(#LHS, #RHS, LHS, RHS)

Compare equality. print left and right hand values and expression strings

1 int x=5;
2 testEqual(x, 5);
3 // prints "ok 1 - x (5) == 5 (5)\n"
4 testEqual(x, 6)<<" oops";
5 // prints "not ok 1 - x (5) == 6 (6) oops\n"

Definition at line 110 of file pvUnitTest.h.

#define testNotEqual (   LHS,
  RHS 
)    ::detail::testNotEqualx(#LHS, #RHS, LHS, RHS)

Definition at line 112 of file pvUnitTest.h.

#define testShow ( )    ::detail::testPassx()

Print test output w/o testing

1 testShow()<<"Foo";

Definition at line 140 of file pvUnitTest.h.

#define testThrows (   EXC,
  CODE 
)    try{ CODE; testFail("unexpected success of " #CODE); }catch(EXC& e){testPass("catch expected exception: %s", e.what());}

Test that a given block throws an exception

1 testThrows(std::runtime_error, somefunc(5))

Definition at line 132 of file pvUnitTest.h.

#define testTrue (   B)    ::detail::testPassx(!!(B))<<#B

Pass/fail from boolean

1 bool y=true;
2 testTrue(y);
3 // prints "ok 1 - y\n"
4 testTrue(!y)<<" oops";
5 // prints "not ok 1 - !y oops\n"

Definition at line 124 of file pvUnitTest.h.

Function Documentation

template<typename PVD >
::detail::testPassx testFieldEqual ( const std::tr1::shared_ptr< const epics::pvData::PVStructure > &  val,
const char *  name,
typename PVD::value_type  expect 
)

Compare value of PVStructure field

1 PVStructurePtr x(.....);
2 testFieldEqual<epics::pvData::PVInt>(x, "alarm.severity", 1);

Definition at line 151 of file pvUnitTest.h.

152 {
153  if(!val) {
154  return ::detail::testPassx(false)<<" null structure pointer";
155  }
156  typename PVD::const_shared_pointer fval(val->getSubField<PVD>(name));
157  if(!fval) {
158  epics::pvData::PVUnion::const_shared_pointer uval(val->getSubField<epics::pvData::PVUnion>(name));
159  if(uval)
160  fval = uval->get<PVD>();
161  }
162  if(!fval) {
163  return ::detail::testPassx(false)<<" field '"<<name<<"' with type "<<typeid(PVD).name()<<" does not exist";
164  } else {
165  typename PVD::value_type actual(fval->get());
166  return ::detail::testPassx(actual==expect)<<name<<" ("<<actual<<") == "<<expect;
167  }
168 }
PVUnion has a single subfield.
Definition: pvData.h:940
template<typename PVD >
::detail::testPassx testFieldEqual ( const std::tr1::shared_ptr< const epics::pvData::PVStructure > &  val,
const char *  name,
typename PVD::const_svector  expect 
)

Definition at line 172 of file pvUnitTest.h.

173 {
174  if(!val) {
175  return ::detail::testPassx(false)<<" null structure pointer";
176  }
177  typename PVD::const_shared_pointer fval(val->getSubField<PVD>(name));
178  if(!fval) {
179  return ::detail::testPassx(false)<<" field '"<<name<<"' with type "<<typeid(PVD).name()<<" does not exist";
180  } else {
181  typename PVD::const_svector actual(fval->view());
182  return ::detail::testPassx(actual==expect)<<name<<" ("<<actual<<") == "<<expect;
183  }
184 }