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 );
 | |
| }
 |