]> git.saurik.com Git - wxWidgets.git/blame - tests/scopeguard/scopeguardtest.cpp
include VC++ version in build compatibility string
[wxWidgets.git] / tests / scopeguard / scopeguardtest.cpp
CommitLineData
5f7348ce
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: tests/scopeguard/scopeguardtest.cpp
3// Purpose: Test wxScopeGuard and related macros
4// Author: Vadim Zeitlin
5// RCS-ID: $Id$
6// Copyright: (c) 2005 Vadim Zeitlin
7// Licence: wxWidgets licence
8///////////////////////////////////////////////////////////////////////////////
9
10// ============================================================================
11// declarations
12// ============================================================================
13
14// ----------------------------------------------------------------------------
15// headers
16// ----------------------------------------------------------------------------
17
18#include "testprec.h"
19
20#ifdef __BORLANDC__
21 #pragma hdrstop
22#endif
23
24#include "wx/scopeguard.h"
25
26// ----------------------------------------------------------------------------
27// helper stuff: something to do on scope exit
28// ----------------------------------------------------------------------------
29
30static int gs_count = 0;
31
32static void IncGlobal() { gs_count++; }
33static void Inc(int *n) { (*n)++; }
34static void IncBy(int *n, int m) { (*n) += m; }
35
36class Counter
37{
38public:
39 Counter(int n) : m_count(n) { }
40
41 void Zero() { m_count = 0; }
42 void Set(int n) { m_count = n; }
43 void Sum(int n, int m) { m_count = n + m; }
44
45 int GetCount() const { return m_count; }
46
47private:
48 int m_count;
49};
50
51// ----------------------------------------------------------------------------
52// test class
53// ----------------------------------------------------------------------------
54
55class ScopeGuardTestCase : public CppUnit::TestCase
56{
57public:
58 CPPUNIT_TEST_SUITE(ScopeGuardTestCase);
59 CPPUNIT_TEST(Normal);
60 CPPUNIT_TEST(Dismiss);
61 CPPUNIT_TEST(BlockExit);
62 CPPUNIT_TEST(BlockExitObj);
63 CPPUNIT_TEST_SUITE_END();
64
65 void Normal();
66 void Dismiss();
67 void BlockExit();
68 void BlockExitObj();
69};
70
71// register in the unnamed registry so that these tests are run by default
72CPPUNIT_TEST_SUITE_REGISTRATION(ScopeGuardTestCase);
73
74// also include in it's own registry so that these tests can be run alone
75CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ScopeGuardTestCase,
76 "ScopeGuardTestCase");
77
78// ============================================================================
79// ScopeGuardTestCase implementation
80// ============================================================================
81
82void ScopeGuardTestCase::Normal()
83{
84 int n = 1,
85 m = 2;
86
87 {
88 gs_count = 1;
89 wxScopeGuard incGlobal = wxMakeGuard(IncGlobal),
90 incN = wxMakeGuard(Inc, &n),
91 incMby15 = wxMakeGuard(IncBy, &m, 15);
92
93 wxUnusedVar(incGlobal);
94 wxUnusedVar(incN);
95 wxUnusedVar(incMby15);
96
97 CPPUNIT_ASSERT_EQUAL( 1, gs_count );
98 CPPUNIT_ASSERT_EQUAL( 1, n );
99 CPPUNIT_ASSERT_EQUAL( 2, m );
100 }
101
102 CPPUNIT_ASSERT_EQUAL( 2, gs_count );
103 CPPUNIT_ASSERT_EQUAL( 2, n );
104 CPPUNIT_ASSERT_EQUAL( 17, m );
105}
106
107void ScopeGuardTestCase::Dismiss()
108{
109 int n = 1,
110 m = 2;
111
112 {
113 gs_count = 1;
114 wxScopeGuard incGlobal = wxMakeGuard(IncGlobal),
115 incN = wxMakeGuard(Inc, &n),
116 incMby15 = wxMakeGuard(IncBy, &m, 15);
117
118 incGlobal.Dismiss();
119 incN.Dismiss();
120 incMby15.Dismiss();
121
122 CPPUNIT_ASSERT_EQUAL( 1, gs_count );
123 CPPUNIT_ASSERT_EQUAL( 1, n );
124 CPPUNIT_ASSERT_EQUAL( 2, m );
125 }
126
127 CPPUNIT_ASSERT_EQUAL( 1, gs_count );
128 CPPUNIT_ASSERT_EQUAL( 1, n );
129 CPPUNIT_ASSERT_EQUAL( 2, m );
130}
131
132void ScopeGuardTestCase::BlockExit()
133{
134 int n = 1,
135 m = 2;
136
137 {
138 gs_count = 1;
139
140 wxON_BLOCK_EXIT0(IncGlobal);
141 wxON_BLOCK_EXIT1(Inc, &n);
142 wxON_BLOCK_EXIT2(IncBy, &m, 15);
143
144 CPPUNIT_ASSERT_EQUAL( 1, gs_count );
145 CPPUNIT_ASSERT_EQUAL( 1, n );
146 CPPUNIT_ASSERT_EQUAL( 2, m );
147 }
148
149 CPPUNIT_ASSERT_EQUAL( 2, gs_count );
150 CPPUNIT_ASSERT_EQUAL( 2, n );
151 CPPUNIT_ASSERT_EQUAL( 17, m );
152}
153
154void ScopeGuardTestCase::BlockExitObj()
155{
156 Counter count0(1),
157 count1(2),
158 count2(3);
159
160 {
161 wxON_BLOCK_EXIT_OBJ0(count0, Counter::Zero);
162 wxON_BLOCK_EXIT_OBJ1(count1, Counter::Set, 17);
163 wxON_BLOCK_EXIT_OBJ2(count2, Counter::Sum, 2, 3);
164
165 CPPUNIT_ASSERT_EQUAL( 1, count0.GetCount() );
166 CPPUNIT_ASSERT_EQUAL( 2, count1.GetCount() );
167 CPPUNIT_ASSERT_EQUAL( 3, count2.GetCount() );
168 }
169
170 CPPUNIT_ASSERT_EQUAL( 0, count0.GetCount() );
171 CPPUNIT_ASSERT_EQUAL( 17, count1.GetCount() );
172 CPPUNIT_ASSERT_EQUAL( 5, count2.GetCount() );
173}
174