git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54696 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			248 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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 );
 | 
						|
}
 |