wxWidgets/tests/scopeguard/scopeguardtest.cpp

248 lines
6.1 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: tests/scopeguard/scopeguardtest.cpp
// Purpose: Test wxScopeGuard and related macros
// Author: Vadim Zeitlin
// RCS-ID: $Id$
// Copyright: (c) 2005 Vadim Zeitlin
// Licence: wxWidgets licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#include "testprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/string.h"
#include "wx/scopeguard.h"
// ----------------------------------------------------------------------------
// helper stuff: something to do on scope exit
// ----------------------------------------------------------------------------
static int gs_count = 0;
static void IncGlobal() { gs_count++; }
static void Inc(int *n) { (*n)++; }
static void IncBy(int *n, int m) { (*n) += m; }
class Counter
{
public:
Counter(int n) : m_count(n) { }
void Zero() { m_count = 0; }
void Set(int n) { m_count = n; }
void Sum(int n, int m) { m_count = n + m; }
int GetCount() const { return m_count; }
private:
int m_count;
};
// ----------------------------------------------------------------------------
// test class
// ----------------------------------------------------------------------------
class ScopeGuardTestCase : public CppUnit::TestCase
{
public:
CPPUNIT_TEST_SUITE(ScopeGuardTestCase);
CPPUNIT_TEST(Normal);
CPPUNIT_TEST(Dismiss);
CPPUNIT_TEST(BlockExit);
CPPUNIT_TEST(BlockExitObj);
CPPUNIT_TEST(BlockExitThis);
CPPUNIT_TEST(BlockExitSetVar);
CPPUNIT_TEST_SUITE_END();
void Normal();
void Dismiss();
void BlockExit();
void BlockExitObj();
void BlockExitThis();
void BlockExitSetVar();
private:
void Zero() { m_count = 0; }
void Set(int n) { m_count = n; }
void Sum(int n, int m) { m_count = n + m; }
int m_count;
};
// register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION(ScopeGuardTestCase);
// also include in it's own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ScopeGuardTestCase,
"ScopeGuardTestCase");
// ============================================================================
// ScopeGuardTestCase implementation
// ============================================================================
void ScopeGuardTestCase::Normal()
{
int n = 1,
m = 2;
{
gs_count = 1;
wxScopeGuard incGlobal = wxMakeGuard(IncGlobal),
incN = wxMakeGuard(Inc, &n),
incMby15 = wxMakeGuard(IncBy, &m, 15);
wxUnusedVar(incGlobal);
wxUnusedVar(incN);
wxUnusedVar(incMby15);
CPPUNIT_ASSERT_EQUAL( 1, gs_count );
CPPUNIT_ASSERT_EQUAL( 1, n );
CPPUNIT_ASSERT_EQUAL( 2, m );
}
CPPUNIT_ASSERT_EQUAL( 2, gs_count );
CPPUNIT_ASSERT_EQUAL( 2, n );
CPPUNIT_ASSERT_EQUAL( 17, m );
}
void ScopeGuardTestCase::Dismiss()
{
int n = 1,
m = 2;
{
gs_count = 1;
wxScopeGuard incGlobal = wxMakeGuard(IncGlobal),
incN = wxMakeGuard(Inc, &n),
incMby15 = wxMakeGuard(IncBy, &m, 15);
incGlobal.Dismiss();
incN.Dismiss();
incMby15.Dismiss();
CPPUNIT_ASSERT_EQUAL( 1, gs_count );
CPPUNIT_ASSERT_EQUAL( 1, n );
CPPUNIT_ASSERT_EQUAL( 2, m );
}
CPPUNIT_ASSERT_EQUAL( 1, gs_count );
CPPUNIT_ASSERT_EQUAL( 1, n );
CPPUNIT_ASSERT_EQUAL( 2, m );
}
void ScopeGuardTestCase::BlockExit()
{
int n = 1,
m = 2;
{
gs_count = 1;
wxON_BLOCK_EXIT0(IncGlobal);
wxON_BLOCK_EXIT1(Inc, &n);
wxON_BLOCK_EXIT2(IncBy, &m, 15);
CPPUNIT_ASSERT_EQUAL( 1, gs_count );
CPPUNIT_ASSERT_EQUAL( 1, n );
CPPUNIT_ASSERT_EQUAL( 2, m );
}
CPPUNIT_ASSERT_EQUAL( 2, gs_count );
CPPUNIT_ASSERT_EQUAL( 2, n );
CPPUNIT_ASSERT_EQUAL( 17, m );
}
void ScopeGuardTestCase::BlockExitObj()
{
Counter count0(1),
count1(2),
count2(3);
{
wxON_BLOCK_EXIT_OBJ0(count0, Counter::Zero);
wxON_BLOCK_EXIT_OBJ1(count1, Counter::Set, 17);
wxON_BLOCK_EXIT_OBJ2(count2, Counter::Sum, 2, 3);
CPPUNIT_ASSERT_EQUAL( 1, count0.GetCount() );
CPPUNIT_ASSERT_EQUAL( 2, count1.GetCount() );
CPPUNIT_ASSERT_EQUAL( 3, count2.GetCount() );
}
CPPUNIT_ASSERT_EQUAL( 0, count0.GetCount() );
CPPUNIT_ASSERT_EQUAL( 17, count1.GetCount() );
CPPUNIT_ASSERT_EQUAL( 5, count2.GetCount() );
}
void ScopeGuardTestCase::BlockExitThis()
{
m_count = 1;
{
wxON_BLOCK_EXIT_THIS0(ScopeGuardTestCase::Zero);
CPPUNIT_ASSERT_EQUAL( 1, m_count );
}
CPPUNIT_ASSERT_EQUAL( 0, m_count );
{
wxON_BLOCK_EXIT_THIS1(ScopeGuardTestCase::Set, 17);
CPPUNIT_ASSERT_EQUAL( 0, m_count );
}
CPPUNIT_ASSERT_EQUAL( 17, m_count );
{
wxON_BLOCK_EXIT_THIS2(ScopeGuardTestCase::Sum, 2, 3);
CPPUNIT_ASSERT_EQUAL( 17, m_count );
}
CPPUNIT_ASSERT_EQUAL( 5, m_count );
}
void ScopeGuardTestCase::BlockExitSetVar()
{
m_count = 1;
{
wxON_BLOCK_EXIT_SET(m_count, 17);
CPPUNIT_ASSERT_EQUAL( 1, m_count );
}
CPPUNIT_ASSERT_EQUAL( 17, m_count );
int count = 1;
{
wxON_BLOCK_EXIT_SET(count, 17);
CPPUNIT_ASSERT_EQUAL( 1, count );
}
CPPUNIT_ASSERT_EQUAL( 17, count );
wxString s("hi");
{
wxON_BLOCK_EXIT_SET(s, "bye");
CPPUNIT_ASSERT_EQUAL( "hi", s );
}
CPPUNIT_ASSERT_EQUAL( "bye", s );
ScopeGuardTestCase *p = this;
{
wxON_BLOCK_EXIT_NULL(p);
CPPUNIT_ASSERT( p );
}
CPPUNIT_ASSERT( !p );
}