VirtualBox

source: vbox/trunk/src/VBox/Additions/x11/VBoxClient/testcase/tstVector.cpp@ 37570

Last change on this file since 37570 was 37480, checked in by vboxsync, 14 years ago

OSE header fixes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.6 KB
Line 
1/* $Id: tstVector.cpp 37480 2011-06-15 18:57:55Z vboxsync $ */
2/** @file
3 * IPRT Testcase - Vector container structure.
4 */
5
6/*
7 * Copyright (C) 2011 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18/*******************************************************************************
19* Header Files *
20*******************************************************************************/
21#include "vector.h"
22
23#include <iprt/test.h>
24
25#include <stdlib.h> /* For realloc */
26
27/** Counter of the number of delete calls made so far */
28static unsigned s_cDeleteCalls = 0;
29
30/** Record the argument of the delete function here. */
31static void *s_apvDeleteArg[10];
32
33/** Dummy delete function for vector-of-void pointer elements */
34static void deletePVoid(void **ppv)
35{
36 if (s_cDeleteCalls < RT_ELEMENTS(s_apvDeleteArg))
37 s_apvDeleteArg[s_cDeleteCalls] = *ppv;
38 ++s_cDeleteCalls;
39}
40
41/** Dummy delete by value function for vector-of-void pointer elements */
42static void deletePVoidValue(void *pv)
43{
44 if (s_cDeleteCalls < RT_ELEMENTS(s_apvDeleteArg))
45 s_apvDeleteArg[s_cDeleteCalls] = pv;
46 ++s_cDeleteCalls;
47}
48
49/* Start by instantiating each function once for syntax checking */
50RTVEC_DECL_STRUCT(tstInstance, void *)
51RTVEC_DECL_STRUCT(tstInstance2, void *)
52
53RTVEC_DECLFN_DELETE_ADAPTER_ID(tstInstance, void *)
54RTVEC_DECLFN_DELETE_ADAPTER_TO_VALUE(tstInstance, void *)
55
56RTVEC_DECLFN_SIZE(tstInstance, void *)
57RTVEC_DECLFN_RESERVE(tstInstance, void *, rtvecReallocDefTag)
58RTVEC_DECLFN_BEGIN(tstInstance, void *)
59RTVEC_DECLFN_END(tstInstance, void *)
60RTVEC_DECLFN_PUSHBACK(tstInstance, void *)
61RTVEC_DECLFN_POPBACK(tstInstance)
62RTVEC_DECLFN_POPBACK_DELETE(tstInstance2, void *, deletePVoid,
63 tstInstanceDeleteAdapterId)
64RTVEC_DECLFN_CLEAR(tstInstance)
65RTVEC_DECLFN_CLEAR_DELETE(tstInstance2, deletePVoid,
66 tstInstanceDeleteAdapterId)
67RTVEC_DECLFN_DETACH(tstInstance, void *)
68
69RTVEC_DECL(tstSimple, void *)
70
71static void testVectorSimple(RTTEST hTest)
72{
73 RTTestISub("Vector structure, no cleanup callback");
74
75 struct tstSimple myVec = RTVEC_INITIALIZER;
76 void **ppvVal;
77
78 RTTESTI_CHECK(tstSimpleSize(&myVec) == 0);
79
80 ppvVal = tstSimplePushBack(&myVec);
81 /* AssertPtrReturnVoid(ppvVal); */
82 RTTESTI_CHECK(ppvVal == tstSimpleBegin(&myVec));
83 RTTESTI_CHECK(ppvVal + 1 == tstSimpleEnd(&myVec));
84 RTTESTI_CHECK(tstSimpleSize(&myVec) == 1);
85 *ppvVal = (void *)1;
86
87 ppvVal = tstSimplePushBack(&myVec);
88 /* AssertPtrReturnVoid(ppvVal); */
89 RTTESTI_CHECK(ppvVal - 1 == tstSimpleBegin(&myVec));
90 RTTESTI_CHECK(ppvVal + 1 == tstSimpleEnd(&myVec));
91 RTTESTI_CHECK(tstSimpleSize(&myVec) == 2);
92 RTTESTI_CHECK(ppvVal[-1] == (void *)1);
93
94 *ppvVal = (void *)3;
95 ppvVal = tstSimplePushBack(&myVec);
96 /* AssertPtrReturnVoid(ppvVal); */
97 RTTESTI_CHECK(ppvVal - 2 == tstSimpleBegin(&myVec));
98 RTTESTI_CHECK(ppvVal + 1 == tstSimpleEnd(&myVec));
99 RTTESTI_CHECK(tstSimpleSize(&myVec) == 3);
100 RTTESTI_CHECK(ppvVal[-2] == (void *)1);
101 RTTESTI_CHECK(ppvVal[-1] == (void *)3);
102
103 tstSimplePopBack(&myVec);
104 RTTESTI_CHECK(tstSimpleBegin(&myVec) + 2 == tstSimpleEnd(&myVec));
105 RTTESTI_CHECK(*tstSimpleBegin(&myVec) == (void *)1);
106 RTTESTI_CHECK(*(tstSimpleEnd(&myVec) - 1) == (void *)3);
107
108 tstSimpleClear(&myVec);
109 RTTESTI_CHECK(tstSimpleBegin(&myVec) == tstSimpleEnd(&myVec));
110 ppvVal = tstSimplePushBack(&myVec);
111 /* AssertPtrReturnVoid(ppvVal); */
112 RTTESTI_CHECK(ppvVal == tstSimpleBegin(&myVec));
113 RTTESTI_CHECK(ppvVal + 1 == tstSimpleEnd(&myVec));
114
115 tstSimpleClear(&myVec);
116 ppvVal = tstSimplePushBack(&myVec);
117 /* AssertPtrReturnVoid(ppvVal); */
118 *ppvVal = (void *)1;
119 ppvVal = tstSimplePushBack(&myVec);
120 /* AssertPtrReturnVoid(ppvVal); */
121 *ppvVal = (void *)3;
122 ppvVal = tstSimplePushBack(&myVec);
123 /* AssertPtrReturnVoid(ppvVal); */
124 *ppvVal = (void *)2;
125 ppvVal = tstSimpleDetach(&myVec);
126 RTTESTI_CHECK(tstSimpleBegin(&myVec) == NULL);
127 RTTESTI_CHECK(tstSimpleSize(&myVec) == 0);
128 RTTESTI_CHECK(ppvVal[0] == (void *)1);
129 RTTESTI_CHECK(ppvVal[1] == (void *)3);
130 RTTESTI_CHECK(ppvVal[2] == (void *)2);
131}
132
133RTVEC_DECL_DELETE(tstDelete, void *, deletePVoid)
134
135static void testVectorDelete(RTTEST hTest)
136{
137 RTTestISub("Vector structure with cleanup by pointer callback");
138
139 struct tstDelete myVec = RTVEC_INITIALIZER;
140 void **ppvVal;
141
142 ppvVal = tstDeletePushBack(&myVec);
143 /* AssertPtrReturnVoid(ppvVal); */
144 *ppvVal = (void *)1;
145 ppvVal = tstDeletePushBack(&myVec);
146 /* AssertPtrReturnVoid(ppvVal); */
147 *ppvVal = (void *)3;
148 ppvVal = tstDeletePushBack(&myVec);
149 /* AssertPtrReturnVoid(ppvVal); */
150 *ppvVal = (void *)2;
151
152 s_cDeleteCalls = 0;
153 tstDeletePopBack(&myVec);
154 RTTESTI_CHECK(s_cDeleteCalls == 1);
155 RTTESTI_CHECK(s_apvDeleteArg[0] == (void *)2);
156 RTTESTI_CHECK(tstDeleteBegin(&myVec) + 2 == tstDeleteEnd(&myVec));
157 RTTESTI_CHECK(*tstDeleteBegin(&myVec) == (void *)1);
158 RTTESTI_CHECK(*(tstDeleteEnd(&myVec) - 1) == (void *)3);
159
160 s_cDeleteCalls = 0;
161 tstDeleteClear(&myVec);
162 RTTESTI_CHECK(s_cDeleteCalls == 2);
163 RTTESTI_CHECK(s_apvDeleteArg[0] == (void *)1);
164 RTTESTI_CHECK(s_apvDeleteArg[1] == (void *)3);
165 RTTESTI_CHECK(tstDeleteBegin(&myVec) == tstDeleteEnd(&myVec));
166 ppvVal = tstDeletePushBack(&myVec);
167 /* AssertPtrReturnVoid(ppvVal); */
168 RTTESTI_CHECK(ppvVal == tstDeleteBegin(&myVec));
169 RTTESTI_CHECK(ppvVal + 1 == tstDeleteEnd(&myVec));
170}
171
172RTVEC_DECL_DELETE_BY_VALUE(tstDeleteValue, void *, deletePVoidValue)
173
174static void testVectorDeleteValue(RTTEST hTest)
175{
176 RTTestISub("Vector structure with cleanup by value callback");
177
178 struct tstDeleteValue myVec = RTVEC_INITIALIZER;
179 void **ppvVal;
180
181 ppvVal = tstDeleteValuePushBack(&myVec);
182 /* AssertPtrReturnVoid(ppvVal); */
183 *ppvVal = (void *)1;
184 ppvVal = tstDeleteValuePushBack(&myVec);
185 /* AssertPtrReturnVoid(ppvVal); */
186 *ppvVal = (void *)3;
187 ppvVal = tstDeleteValuePushBack(&myVec);
188 /* AssertPtrReturnVoid(ppvVal); */
189 *ppvVal = (void *)2;
190
191 s_cDeleteCalls = 0;
192 tstDeleteValuePopBack(&myVec);
193 RTTESTI_CHECK(s_cDeleteCalls == 1);
194 RTTESTI_CHECK(s_apvDeleteArg[0] == (void *)2);
195 RTTESTI_CHECK( tstDeleteValueBegin(&myVec) + 2
196 == tstDeleteValueEnd(&myVec));
197 RTTESTI_CHECK(*tstDeleteValueBegin(&myVec) == (void *)1);
198 RTTESTI_CHECK(*(tstDeleteValueEnd(&myVec) - 1) == (void *)3);
199
200 s_cDeleteCalls = 0;
201 tstDeleteValueClear(&myVec);
202 RTTESTI_CHECK(s_cDeleteCalls == 2);
203 RTTESTI_CHECK(s_apvDeleteArg[0] == (void *)1);
204 RTTESTI_CHECK(s_apvDeleteArg[1] == (void *)3);
205 RTTESTI_CHECK(tstDeleteValueBegin(&myVec) == tstDeleteValueEnd(&myVec));
206 ppvVal = tstDeleteValuePushBack(&myVec);
207 /* AssertPtrReturnVoid(ppvVal); */
208 RTTESTI_CHECK(ppvVal == tstDeleteValueBegin(&myVec));
209 RTTESTI_CHECK(ppvVal + 1 == tstDeleteValueEnd(&myVec));
210}
211
212
213
214int main()
215{
216 RTTEST hTest;
217 RTEXITCODE rcExit = RTTestInitAndCreate("tstVector", &hTest);
218 if (rcExit != RTEXITCODE_SUCCESS)
219 return rcExit;
220
221 testVectorSimple(hTest);
222 testVectorDelete(hTest);
223 testVectorDeleteValue(hTest);
224
225 return RTTestSummaryAndDestroy(hTest);
226}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette