2005-06-16 23:47:30 +00:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// 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
|
|
|
|
|
2008-03-27 16:41:08 +00:00
|
|
|
#include "wx/string.h"
|
2005-06-16 23:47:30 +00:00
|
|
|
#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);
|
2008-03-27 15:37:41 +00:00
|
|
|
CPPUNIT_TEST(BlockExitThis);
|
2008-03-27 16:13:50 +00:00
|
|
|
CPPUNIT_TEST(BlockExitSetVar);
|
2005-06-16 23:47:30 +00:00
|
|
|
CPPUNIT_TEST_SUITE_END();
|
|
|
|
|
|
|
|
void Normal();
|
|
|
|
void Dismiss();
|
|
|
|
void BlockExit();
|
|
|
|
void BlockExitObj();
|
2008-03-27 15:37:41 +00:00
|
|
|
void BlockExitThis();
|
2008-03-27 16:13:50 +00:00
|
|
|
void BlockExitSetVar();
|
2008-03-27 15:37:41 +00:00
|
|
|
|
|
|
|
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;
|
2005-06-16 23:47:30 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// 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() );
|
|
|
|
}
|
|
|
|
|
2008-03-27 15:37:41 +00:00
|
|
|
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 );
|
|
|
|
}
|
|
|
|
|
2008-03-27 16:13:50 +00:00
|
|
|
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");
|
|
|
|
|
2008-07-18 23:07:23 +00:00
|
|
|
CPPUNIT_ASSERT_EQUAL( "hi", s );
|
2008-03-27 16:13:50 +00:00
|
|
|
}
|
2008-07-18 23:07:23 +00:00
|
|
|
CPPUNIT_ASSERT_EQUAL( "bye", s );
|
2008-03-27 16:13:50 +00:00
|
|
|
|
|
|
|
ScopeGuardTestCase *p = this;
|
|
|
|
{
|
|
|
|
wxON_BLOCK_EXIT_NULL(p);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT( p );
|
|
|
|
}
|
|
|
|
CPPUNIT_ASSERT( !p );
|
|
|
|
}
|