Имеется следующая иерархия:
struct a
{
a(int x)
void f(int x)
{
if(x>0) g(x);
else h(x);
}
protected:
virtual void g(int x) {}
virtual void h(int x) {}
};
struct b : a
{
b(int x) : a(x) {}
protected:
virtual void g(int x) { do_something }
virtual void h(int x) { do_something }
}
Мне нужно проверить что функции g, h вызываются.
Можно сделать просто наследование:
struct с : b
{
c(int x) : a(x) {}
protected:
virtual void g(int x) { b::g(x) }
virtual void h(int x) { b::h(x) }
}
Но понадобилось для двух иерархий.
Поэтому решил сделать шаблон:
template<typename T>
struct add_check
{
protected:
virtual void g(int x) { T::g(x) }
virtual void h(int x) { T::h(x) }
}
Однако такое не сработает, если в классе b не будут определены оба метода.
Т.е.:
struct b2 : a
{
b2(int x) : a(x) {}
protected:
virtual void h(int x) { do_something }
};
struct b2_check : b2 , add_check<b2>
{
b2_check(int x) : b2(x) {}
};
// Error: Cannot access protected method b::g
Все это нужно для теста.
Подскажите как сделать.
Спасибо.
Здравствуйте, _nn_, Вы писали:
__>Имеется следующая иерархия:
__>__>struct a
__>{
__> a(int x)
__> void f(int x)
__> {
__> if(x>0) g(x);
__> else h(x);
__> }
__>protected:
__> virtual void g(int x) {}
__> virtual void h(int x) {}
__>};
__>
__>Мне нужно проверить что функции g, h вызываются.
__>Все это нужно для теста.
Если функции неконстантные, то они изменяют состояние объекта. Тест должен проверять имеенно это (выполнение постусловий), а не факт вызова конкретных функций. Соответственно для доступа к состоянию должны существовать какие-либо публичные методы (или другой способ доступа к observable state), которые и должны использоваться в тесте.
Здравствуйте, _nn_, Вы писали:
__>Но понадобилось для двух иерархий.
__>Поэтому решил сделать шаблон:
__>__>template<typename T>
__>struct add_check
__>{
__>protected:
__> virtual void g(int x) { T::g(x) }
__> virtual void h(int x) { T::h(x) }
__>}
__>
__>Однако такое не сработает, если в классе b не будут определены оба метода.
__>Т.е.:
__>__>struct b2 : a
__>{
__> b2(int x) : a(x) {}
__>protected:
__> virtual void h(int x) { do_something }
__>};
__>struct b2_check : b2 , add_check<b2>
__>{
__> b2_check(int x) : b2(x) {}
__>};
__>// Error: Cannot access protected method b::g
__>
наследуй add_check от b2, а b2_check от add_check(унаследованного от b2).
Здравствуйте, Nik_1, Вы писали:
N_>наследуй add_check от b2, а b2_check от add_check(унаследованного от b2).
Сделал так:
template<typename Base>
struct add_check : Base
{
add_check() : Base() {}
template<typename P1>
add_check(P1 p1) : Base(p1) {}
// конструкторы просто вызывают базовый класс
bool called_g() const { return g_called; }
bool called_h() const { return h_called; }
void reset() { g_called = false; h_called = false; ]
protected:
virtual void g(int x) { g_called = true; Base::g(x) }
virtual void h(int x) { h_called = true; Base::h(x) }
bool g_called;
bool h_called;
}
Работает как надо.
Напоминаю, нужно это дело для тестов
Спасибо всем за помощью
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском