]> git.saurik.com Git - wxWidgets.git/blob - tests/scopeguard/scopeguardtest.cpp
3a6b3ff67497697e202cf98c0875c7e31ccff1af
[wxWidgets.git] / tests / scopeguard / scopeguardtest.cpp
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: wxWindows 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/string.h"
25 #include "wx/scopeguard.h"
26
27 // ----------------------------------------------------------------------------
28 // helper stuff: something to do on scope exit
29 // ----------------------------------------------------------------------------
30
31 static int gs_count = 0;
32
33 static void IncGlobal() { gs_count++; }
34 static void Inc(int *n) { (*n)++; }
35 static void IncBy(int *n, int m) { (*n) += m; }
36
37 class Counter
38 {
39 public:
40 Counter(int n) : m_count(n) { }
41
42 void Zero() { m_count = 0; }
43 void Set(int n) { m_count = n; }
44 void Sum(int n, int m) { m_count = n + m; }
45
46 int GetCount() const { return m_count; }
47
48 private:
49 int m_count;
50 };
51
52 // ----------------------------------------------------------------------------
53 // test class
54 // ----------------------------------------------------------------------------
55
56 class ScopeGuardTestCase : public CppUnit::TestCase
57 {
58 public:
59 CPPUNIT_TEST_SUITE(ScopeGuardTestCase);
60 CPPUNIT_TEST(Normal);
61 CPPUNIT_TEST(Dismiss);
62 CPPUNIT_TEST(BlockExit);
63 CPPUNIT_TEST(BlockExitObj);
64 CPPUNIT_TEST(BlockExitThis);
65 CPPUNIT_TEST(BlockExitSetVar);
66 CPPUNIT_TEST_SUITE_END();
67
68 void Normal();
69 void Dismiss();
70 void BlockExit();
71 void BlockExitObj();
72 void BlockExitThis();
73 void BlockExitSetVar();
74
75 private:
76 void Zero() { m_count = 0; }
77 void Set(int n) { m_count = n; }
78 void Sum(int n, int m) { m_count = n + m; }
79
80 int m_count;
81 };
82
83 // register in the unnamed registry so that these tests are run by default
84 CPPUNIT_TEST_SUITE_REGISTRATION(ScopeGuardTestCase);
85
86 // also include in its own registry so that these tests can be run alone
87 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ScopeGuardTestCase,
88 "ScopeGuardTestCase");
89
90 // ============================================================================
91 // ScopeGuardTestCase implementation
92 // ============================================================================
93
94 void ScopeGuardTestCase::Normal()
95 {
96 int n = 1,
97 m = 2;
98
99 {
100 gs_count = 1;
101 wxScopeGuard incGlobal = wxMakeGuard(IncGlobal),
102 incN = wxMakeGuard(Inc, &n),
103 incMby15 = wxMakeGuard(IncBy, &m, 15);
104
105 wxUnusedVar(incGlobal);
106 wxUnusedVar(incN);
107 wxUnusedVar(incMby15);
108
109 CPPUNIT_ASSERT_EQUAL( 1, gs_count );
110 CPPUNIT_ASSERT_EQUAL( 1, n );
111 CPPUNIT_ASSERT_EQUAL( 2, m );
112 }
113
114 CPPUNIT_ASSERT_EQUAL( 2, gs_count );
115 CPPUNIT_ASSERT_EQUAL( 2, n );
116 CPPUNIT_ASSERT_EQUAL( 17, m );
117 }
118
119 void ScopeGuardTestCase::Dismiss()
120 {
121 int n = 1,
122 m = 2;
123
124 {
125 gs_count = 1;
126 wxScopeGuard incGlobal = wxMakeGuard(IncGlobal),
127 incN = wxMakeGuard(Inc, &n),
128 incMby15 = wxMakeGuard(IncBy, &m, 15);
129
130 incGlobal.Dismiss();
131 incN.Dismiss();
132 incMby15.Dismiss();
133
134 CPPUNIT_ASSERT_EQUAL( 1, gs_count );
135 CPPUNIT_ASSERT_EQUAL( 1, n );
136 CPPUNIT_ASSERT_EQUAL( 2, m );
137 }
138
139 CPPUNIT_ASSERT_EQUAL( 1, gs_count );
140 CPPUNIT_ASSERT_EQUAL( 1, n );
141 CPPUNIT_ASSERT_EQUAL( 2, m );
142 }
143
144 void ScopeGuardTestCase::BlockExit()
145 {
146 int n = 1,
147 m = 2;
148
149 {
150 gs_count = 1;
151
152 wxON_BLOCK_EXIT0(IncGlobal);
153 wxON_BLOCK_EXIT1(Inc, &n);
154 wxON_BLOCK_EXIT2(IncBy, &m, 15);
155
156 CPPUNIT_ASSERT_EQUAL( 1, gs_count );
157 CPPUNIT_ASSERT_EQUAL( 1, n );
158 CPPUNIT_ASSERT_EQUAL( 2, m );
159 }
160
161 CPPUNIT_ASSERT_EQUAL( 2, gs_count );
162 CPPUNIT_ASSERT_EQUAL( 2, n );
163 CPPUNIT_ASSERT_EQUAL( 17, m );
164 }
165
166 void ScopeGuardTestCase::BlockExitObj()
167 {
168 Counter count0(1),
169 count1(2),
170 count2(3);
171
172 {
173 wxON_BLOCK_EXIT_OBJ0(count0, Counter::Zero);
174 wxON_BLOCK_EXIT_OBJ1(count1, Counter::Set, 17);
175 wxON_BLOCK_EXIT_OBJ2(count2, Counter::Sum, 2, 3);
176
177 CPPUNIT_ASSERT_EQUAL( 1, count0.GetCount() );
178 CPPUNIT_ASSERT_EQUAL( 2, count1.GetCount() );
179 CPPUNIT_ASSERT_EQUAL( 3, count2.GetCount() );
180 }
181
182 CPPUNIT_ASSERT_EQUAL( 0, count0.GetCount() );
183 CPPUNIT_ASSERT_EQUAL( 17, count1.GetCount() );
184 CPPUNIT_ASSERT_EQUAL( 5, count2.GetCount() );
185 }
186
187 void ScopeGuardTestCase::BlockExitThis()
188 {
189 m_count = 1;
190
191 {
192 wxON_BLOCK_EXIT_THIS0(ScopeGuardTestCase::Zero);
193
194 CPPUNIT_ASSERT_EQUAL( 1, m_count );
195 }
196 CPPUNIT_ASSERT_EQUAL( 0, m_count );
197
198 {
199 wxON_BLOCK_EXIT_THIS1(ScopeGuardTestCase::Set, 17);
200
201 CPPUNIT_ASSERT_EQUAL( 0, m_count );
202 }
203 CPPUNIT_ASSERT_EQUAL( 17, m_count );
204
205 {
206 wxON_BLOCK_EXIT_THIS2(ScopeGuardTestCase::Sum, 2, 3);
207 CPPUNIT_ASSERT_EQUAL( 17, m_count );
208 }
209 CPPUNIT_ASSERT_EQUAL( 5, m_count );
210 }
211
212 void ScopeGuardTestCase::BlockExitSetVar()
213 {
214 m_count = 1;
215 {
216 wxON_BLOCK_EXIT_SET(m_count, 17);
217
218 CPPUNIT_ASSERT_EQUAL( 1, m_count );
219 }
220 CPPUNIT_ASSERT_EQUAL( 17, m_count );
221
222
223 int count = 1;
224 {
225 wxON_BLOCK_EXIT_SET(count, 17);
226
227 CPPUNIT_ASSERT_EQUAL( 1, count );
228 }
229 CPPUNIT_ASSERT_EQUAL( 17, count );
230
231
232 wxString s("hi");
233 {
234 wxON_BLOCK_EXIT_SET(s, "bye");
235
236 CPPUNIT_ASSERT_EQUAL( "hi", s );
237 }
238 CPPUNIT_ASSERT_EQUAL( "bye", s );
239
240 ScopeGuardTestCase *p = this;
241 {
242 wxON_BLOCK_EXIT_NULL(p);
243
244 CPPUNIT_ASSERT( p );
245 }
246 CPPUNIT_ASSERT( !p );
247 }