Reactos
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 HAVE_APITEST
9 #include <apitest.h>
10#else
11 #include "atltest.h"
12#endif
13
14#include <atlbase.h>
15#include <atlsimpcoll.h>
16
17struct CMonster
18{
19 static int s_nCount;
20 static int s_nCopyCount;
21
22 CMonster()
23 {
24 CMonster::s_nCount++;
25 }
26 CMonster(const CMonster& c)
27 {
28 CMonster::s_nCount++;
29 }
30 ~CMonster()
31 {
32 CMonster::s_nCount--;
33 }
34 CMonster& operator=(const CMonster& other)
35 {
36 CMonster::s_nCopyCount++;
37 return *this;
38 }
39};
40
41int CMonster::s_nCount = 0;
42int CMonster::s_nCopyCount = 0;
43
44START_TEST(CSimpleMap)
45{
46 CSimpleMap<int, int> map1;
47
48 ok_int(map1.GetSize(), 0);
49
50 map1.Add(1, 2);
51 ok_int(map1.GetSize(), 1);
52 map1.Add(2, 3);
53 ok_int(map1.GetSize(), 2);
54
55 ok_int(map1.Lookup(1), 2);
56 ok_int(map1.Lookup(2), 3);
57 ok_int(map1.Lookup(-1), 0);
58
59 ok_int(map1.ReverseLookup(2), 1);
60 ok_int(map1.ReverseLookup(3), 2);
61
62 ok_int(map1.GetKeyAt(0), 1);
63 ok_int(map1.GetKeyAt(1), 2);
64
65 ok_int(map1.GetValueAt(0), 2);
66 ok_int(map1.GetValueAt(1), 3);
67
68 map1.SetAt(2, 4);
69
70 ok_int(map1.Lookup(1), 2);
71 ok_int(map1.Lookup(2), 4);
72
73 ok_int(map1.ReverseLookup(2), 1);
74 ok_int(map1.ReverseLookup(4), 2);
75
76 map1.Remove(1);
77 ok_int(map1.GetSize(), 1);
78 map1.Remove(2);
79 ok_int(map1.GetSize(), 0);
80
81 map1.Add(1, 4);
82 ok_int(map1.GetSize(), 1);
83 map1.Add(2, 8);
84 ok_int(map1.GetSize(), 2);
85 map1.Add(3, 12);
86 ok_int(map1.GetSize(), 3);
87
88 map1.RemoveAll();
89 ok_int(map1.GetSize(), 0);
90
91 ok_int(CMonster::s_nCount, 0);
92 ok_int(CMonster::s_nCopyCount, 0);
93
94 CSimpleMap<CMonster, CMonster> map2;
95 ok_int(map2.GetSize(), 0);
96
97 ok_int(CMonster::s_nCount, 0);
98 ok_int(CMonster::s_nCopyCount, 0);
99
100 {
101 CMonster m1;
102 ok_int(CMonster::s_nCount, 1);
103 ok_int(CMonster::s_nCopyCount, 0);
104
105 CMonster m2;
106 ok_int(CMonster::s_nCount, 2);
107 ok_int(CMonster::s_nCopyCount, 0);
108
109 map2.Add(m1, m2);
110 ok_int(CMonster::s_nCount, 4);
111 ok_int(CMonster::s_nCopyCount, 0);
112 }
113
114 ok_int(map2.GetSize(), 1);
115 ok_int(CMonster::s_nCount, 2);
116 ok_int(CMonster::s_nCopyCount, 0);
117
118 {
119 CMonster m1;
120 ok_int(CMonster::s_nCount, 3);
121 ok_int(CMonster::s_nCopyCount, 0);
122
123 CMonster m2;
124 ok_int(CMonster::s_nCount, 4);
125 ok_int(CMonster::s_nCopyCount, 0);
126
127 map2.Add(m1, m2);
128 ok_int(CMonster::s_nCount, 6);
129 ok_int(CMonster::s_nCopyCount, 0);
130 }
131
132 ok_int(map2.GetSize(), 2);
133 ok_int(CMonster::s_nCount, 4);
134 ok_int(CMonster::s_nCopyCount, 0);
135
136 map2.RemoveAt(0);
137 ok_int(CMonster::s_nCount, 2);
138 ok_int(map2.GetSize(), 1);
139 ok_int(CMonster::s_nCopyCount, 0);
140
141 map2.RemoveAt(0);
142 ok_int(CMonster::s_nCount, 0);
143 ok_int(map2.GetSize(), 0);
144 ok_int(CMonster::s_nCopyCount, 0);
145
146 CSimpleMap<int, CMonster> map3;
147 ok_int(map3.GetSize(), 0);
148
149 CMonster m3;
150 ok_int(CMonster::s_nCount, 1);
151
152 map3.Add(1, m3);
153 ok_int(map3.GetSize(), 1);
154 ok_int(CMonster::s_nCount, 2);
155
156 map3.Add(2, m3);
157 ok_int(map3.GetSize(), 2);
158 ok_int(CMonster::s_nCount, 3);
159
160 map3.Add(3, m3);
161 ok_int(map3.GetSize(), 3);
162 ok_int(CMonster::s_nCount, 4);
163
164 map3.Remove(2);
165 ok_int(map3.GetSize(), 2);
166 ok_int(CMonster::s_nCount, 3);
167
168 map3.RemoveAll();
169 ok_int(map3.GetSize(), 0);
170 ok_int(CMonster::s_nCount, 1);
171
172 map1.Add(1, 2);
173 ok_int(map1.GetSize(), 1);
174 map1.Add(2, 3);
175 ok_int(map1.GetSize(), 2);
176
177 ok(!!map1.RemoveAt(0), "Expected RemoveAt(0) to succeed\n");
178 ok_int(map1.GetSize(), 1);
179 ok(!!map1.RemoveAt(0), "Expected RemoveAt(0) to succeed\n");
180 ok_int(map1.GetSize(), 0);
181}