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 
17 struct 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 
41 int CMonster::s_nCount = 0;
42 int CMonster::s_nCopyCount = 0;
43 
44 START_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 }
182