[ATL_APITEST] Remove dependency on rpcrt4. CORE-10029
[reactos.git] / rostests / apitests / atl / CSimpleMap.cpp
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for CSimpleMap
5 * PROGRAMMER: Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6 */
7
8 #ifdef __REACTOS__
9 #include <apitest.h>
10 #else
11 #include <stdlib.h>
12 #include <stdio.h>
13 #include <stdarg.h>
14 int g_tests_executed = 0;
15 int g_tests_failed = 0;
16 void ok_func(const char *file, int line, bool value, const char *fmt, ...)
17 {
18 va_list va;
19 va_start(va, fmt);
20 if (!value)
21 {
22 printf("%s (%d): ", file, line);
23 vprintf(fmt, va);
24 g_tests_failed++;
25 }
26 g_tests_executed++;
27 va_end(va);
28 }
29 #undef ok
30 #define ok(value, ...) ok_func(__FILE__, __LINE__, value, __VA_ARGS__)
31 #define START_TEST(x) int main(void)
32 #endif
33
34 #include <atlbase.h>
35 #include <atlsimpcoll.h>
36
37 struct CMonster
38 {
39 static int s_nCount;
40 static int s_nCopyCount;
41
42 CMonster()
43 {
44 CMonster::s_nCount++;
45 }
46 CMonster(const CMonster& c)
47 {
48 CMonster::s_nCount++;
49 }
50 ~CMonster()
51 {
52 CMonster::s_nCount--;
53 }
54 CMonster& operator=(const CMonster& other)
55 {
56 CMonster::s_nCopyCount++;
57 return *this;
58 }
59 };
60
61 int CMonster::s_nCount = 0;
62 int CMonster::s_nCopyCount = 0;
63
64 START_TEST(CSimpleMap)
65 {
66 CSimpleMap<int, int> map1;
67
68 ok(map1.GetSize() == 0, "Expected map1's size is zero, was %d\n", map1.GetSize());
69
70 map1.Add(1, 2);
71 ok(map1.GetSize() == 1, "Expected map1's size is 1, was %d\n", map1.GetSize());
72 map1.Add(2, 3);
73 ok(map1.GetSize() == 2, "Expected map1's size is 2, was %d\n", map1.GetSize());
74
75 ok(map1.Lookup(1) == 2, "Expected map1.Lookup(1) is 2, was %d\n", map1.Lookup(1));
76 ok(map1.Lookup(2) == 3, "Expected map1.Lookup(2) is 3, was %d\n", map1.Lookup(2));
77 ok(map1.Lookup(-1) == 0, "Expected map1.Lookup(-1) is 0, was %d\n", map1.Lookup(-1));
78
79 ok(map1.ReverseLookup(2) == 1, "Expected map1.ReverseLookup(2) is 1, was %d\n", map1.ReverseLookup(2));
80 ok(map1.ReverseLookup(3) == 2, "Expected map1.ReverseLookup(3) is 2, was %d\n", map1.ReverseLookup(3));
81
82 ok(map1.GetKeyAt(0) == 1, "Expected map1.GetKeyAt(0) is 1, was %d\n", map1.GetKeyAt(0));
83 ok(map1.GetKeyAt(1) == 2, "Expected map1.GetKeyAt(1) is 2, was %d\n", map1.GetKeyAt(1));
84
85 ok(map1.GetValueAt(0) == 2, "Expected map1.GetValueAt(0) is 2, was %d\n", map1.GetValueAt(0));
86 ok(map1.GetValueAt(1) == 3, "Expected map1.GetValueAt(1) is 3, was %d\n", map1.GetValueAt(1));
87
88 map1.SetAt(2, 4);
89
90 ok(map1.Lookup(1) == 2, "Expected map1.Lookup(1) is 2, was %d\n", map1.Lookup(1));
91 ok(map1.Lookup(2) == 4, "Expected map1.Lookup(2) is 4, was %d\n", map1.Lookup(2));
92
93 ok(map1.ReverseLookup(2) == 1, "Expected map1.ReverseLookup(2) is 1, was %d\n", map1.ReverseLookup(2));
94 ok(map1.ReverseLookup(4) == 2, "Expected map1.ReverseLookup(4) is 2, was %d\n", map1.ReverseLookup(4));
95
96 map1.Remove(1);
97 ok(map1.GetSize() == 1, "Expected map1's size is 1, was %d\n", map1.GetSize());
98 map1.Remove(2);
99 ok(map1.GetSize() == 0, "Expected map1's size is 0, was %d\n", map1.GetSize());
100
101 map1.Add(1, 4);
102 ok(map1.GetSize() == 1, "Expected map1's size is 1, was %d\n", map1.GetSize());
103 map1.Add(2, 8);
104 ok(map1.GetSize() == 2, "Expected map1's size is 2, was %d\n", map1.GetSize());
105 map1.Add(3, 12);
106 ok(map1.GetSize() == 3, "Expected map1's size is 3, was %d\n", map1.GetSize());
107
108 map1.RemoveAll();
109 ok(map1.GetSize() == 0, "Expected map1's size is 0, was %d\n", map1.GetSize());
110
111 ok(CMonster::s_nCount == 0, "Expected CMonster::s_nCount is 0, was %d\n", CMonster::s_nCount);
112 ok(CMonster::s_nCopyCount == 0, "Expected CMonster::s_nCopyCount is 0, was %d\n", CMonster::s_nCopyCount);
113
114 CSimpleMap<CMonster, CMonster> map2;
115 ok(map2.GetSize() == 0, "Expected map2's size is zero, was %d\n", map2.GetSize());
116
117 ok(CMonster::s_nCount == 0, "Expected CMonster::s_nCount is 0, was %d\n", CMonster::s_nCount);
118 ok(CMonster::s_nCopyCount == 0, "Expected CMonster::s_nCopyCount is 0, was %d\n", CMonster::s_nCopyCount);
119
120 {
121 CMonster m1;
122 ok(CMonster::s_nCount == 1, "Expected CMonster::s_nCount is 1, was %d\n", CMonster::s_nCount);
123 ok(CMonster::s_nCopyCount == 0, "Expected CMonster::s_nCopyCount is 0, was %d\n", CMonster::s_nCopyCount);
124
125 CMonster m2;
126 ok(CMonster::s_nCount == 2, "Expected CMonster::s_nCount is 2, was %d\n", CMonster::s_nCount);
127 ok(CMonster::s_nCopyCount == 0, "Expected CMonster::s_nCopyCount is 0, was %d\n", CMonster::s_nCopyCount);
128
129 map2.Add(m1, m2);
130 ok(CMonster::s_nCount == 4, "Expected CMonster::s_nCount is 4, was %d\n", CMonster::s_nCount);
131 ok(CMonster::s_nCopyCount == 0, "Expected CMonster::s_nCopyCount is 0, was %d\n", CMonster::s_nCopyCount);
132 }
133
134 ok(map2.GetSize() == 1, "Expected map2's size is 1, was %d\n", map2.GetSize());
135 ok(CMonster::s_nCount == 2, "Expected CMonster::s_nCount is 2, was %d\n", CMonster::s_nCount);
136 ok(CMonster::s_nCopyCount == 0, "Expected CMonster::s_nCopyCount is 0, was %d\n", CMonster::s_nCopyCount);
137
138 {
139 CMonster m1;
140 ok(CMonster::s_nCount == 3, "Expected CMonster::s_nCount is 3, was %d\n", CMonster::s_nCount);
141 ok(CMonster::s_nCopyCount == 0, "Expected CMonster::s_nCopyCount is 0, was %d\n", CMonster::s_nCopyCount);
142
143 CMonster m2;
144 ok(CMonster::s_nCount == 4, "Expected CMonster::s_nCount is 4, was %d\n", CMonster::s_nCount);
145 ok(CMonster::s_nCopyCount == 0, "Expected CMonster::s_nCopyCount is 0, was %d\n", CMonster::s_nCopyCount);
146
147 map2.Add(m1, m2);
148 ok(CMonster::s_nCount == 6, "Expected CMonster::s_nCount is 6, was %d\n", CMonster::s_nCount);
149 ok(CMonster::s_nCopyCount == 0, "Expected CMonster::s_nCopyCount is 0, was %d\n", CMonster::s_nCopyCount);
150 }
151
152 ok(map2.GetSize() == 2, "Expected map2's size is 2, was %d\n", map2.GetSize());
153 ok(CMonster::s_nCount == 4, "Expected CMonster::s_nCount is 4, was %d\n", CMonster::s_nCount);
154 ok(CMonster::s_nCopyCount == 0, "Expected CMonster::s_nCopyCount is 0, was %d\n", CMonster::s_nCopyCount);
155
156 map2.RemoveAt(0);
157 ok(CMonster::s_nCount == 2, "Expected CMonster::s_nCount is 2, was %d\n", CMonster::s_nCount);
158 ok(map2.GetSize() == 1, "Expected map2's size is 1, was %d\n", map2.GetSize());
159 ok(CMonster::s_nCopyCount == 0, "Expected CMonster::s_nCopyCount is 0, was %d\n", CMonster::s_nCopyCount);
160
161 map2.RemoveAt(0);
162 ok(CMonster::s_nCount == 0, "Expected CMonster::s_nCount is 0, was %d\n", CMonster::s_nCount);
163 ok(map2.GetSize() == 0, "Expected map2's size is 0, was %d\n", map2.GetSize());
164 ok(CMonster::s_nCopyCount == 0, "Expected CMonster::s_nCopyCount is 0, was %d\n", CMonster::s_nCopyCount);
165
166 CSimpleMap<int, CMonster> map3;
167 ok(map3.GetSize() == 0, "Expected map3's size is 0, was %d\n", map3.GetSize());
168
169 CMonster m3;
170 ok(CMonster::s_nCount == 1, "Expected CMonster::s_nCount is 1, was %d\n", CMonster::s_nCount);
171
172 map3.Add(1, m3);
173 ok(map3.GetSize() == 1, "Expected map3's size is 1, was %d\n", map3.GetSize());
174 ok(CMonster::s_nCount == 2, "Expected CMonster::s_nCount is 2, was %d\n", CMonster::s_nCount);
175
176 map3.Add(2, m3);
177 ok(map3.GetSize() == 2, "Expected map3's size is 2, was %d\n", map3.GetSize());
178 ok(CMonster::s_nCount == 3, "Expected CMonster::s_nCount is 3, was %d\n", CMonster::s_nCount);
179
180 map3.Add(3, m3);
181 ok(map3.GetSize() == 3, "Expected map3's size is 3, was %d\n", map3.GetSize());
182 ok(CMonster::s_nCount == 4, "Expected CMonster::s_nCount is 4, was %d\n", CMonster::s_nCount);
183
184 map3.Remove(2);
185 ok(map3.GetSize() == 2, "Expected map3's size is 2, was %d\n", map3.GetSize());
186 ok(CMonster::s_nCount == 3, "Expected CMonster::s_nCount is 3, was %d\n", CMonster::s_nCount);
187
188 map3.RemoveAll();
189 ok(map3.GetSize() == 0, "Expected map3's size is 0, was %d\n", map3.GetSize());
190 ok(CMonster::s_nCount == 1, "Expected CMonster::s_nCount is 1, was %d\n", CMonster::s_nCount);
191
192 map1.Add(1, 2);
193 ok(map1.GetSize() == 1, "Expected map1's size is 1, was %d\n", map1.GetSize());
194 map1.Add(2, 3);
195 ok(map1.GetSize() == 2, "Expected map1's size is 2, was %d\n", map1.GetSize());
196
197 ok(!!map1.RemoveAt(0), "Expected RemoveAt(0) to succeed\n");
198 ok(map1.GetSize() == 1, "Expected map1's size is 1, was %d\n", map1.GetSize());
199 ok(!!map1.RemoveAt(0), "Expected RemoveAt(0) to succeed\n");
200 ok(map1.GetSize() == 0, "Expected map1's size is 0, was %d\n", map1.GetSize());
201
202 #ifndef __REACTOS__
203 printf("CSimpleMap: %i tests executed (0 marked as todo, %i failures), 0 skipped.\n", g_tests_executed, g_tests_failed);
204 return g_tests_failed;
205 #endif
206 }