]>
Commit | Line | Data |
---|---|---|
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 | ||
30 | static int gs_count = 0; | |
31 | ||
32 | static void IncGlobal() { gs_count++; } | |
33 | static void Inc(int *n) { (*n)++; } | |
34 | static void IncBy(int *n, int m) { (*n) += m; } | |
35 | ||
36 | class Counter | |
37 | { | |
38 | public: | |
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 | ||
47 | private: | |
48 | int m_count; | |
49 | }; | |
50 | ||
51 | // ---------------------------------------------------------------------------- | |
52 | // test class | |
53 | // ---------------------------------------------------------------------------- | |
54 | ||
55 | class ScopeGuardTestCase : public CppUnit::TestCase | |
56 | { | |
57 | public: | |
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 | |
72 | CPPUNIT_TEST_SUITE_REGISTRATION(ScopeGuardTestCase); | |
73 | ||
74 | // also include in it's own registry so that these tests can be run alone | |
75 | CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ScopeGuardTestCase, | |
76 | "ScopeGuardTestCase"); | |
77 | ||
78 | // ============================================================================ | |
79 | // ScopeGuardTestCase implementation | |
80 | // ============================================================================ | |
81 | ||
82 | void 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 | ||
107 | void 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 | ||
132 | void 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 | ||
154 | void 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 |