Reactos
1/*
2 * PROJECT: ReactOS api tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for CSimpleArray
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 CSimpleCreature
18{
19 static int s_nCount;
20 static int s_nCopyCount;
21 CSimpleCreature()
22 {
23 CSimpleCreature::s_nCount++;
24 }
25 CSimpleCreature(const CSimpleCreature& c)
26 {
27 CSimpleCreature::s_nCount++;
28 }
29 ~CSimpleCreature()
30 {
31 CSimpleCreature::s_nCount--;
32 }
33 CSimpleCreature& operator=(const CSimpleCreature& other)
34 {
35 CSimpleCreature::s_nCopyCount++;
36 return *this;
37 }
38};
39
40int CSimpleCreature::s_nCount = 0;
41int CSimpleCreature::s_nCopyCount = 0;
42
43
44START_TEST(CSimpleArray)
45{
46 CSimpleArray<int> array1;
47
48 ok_int(array1.GetSize(), 0);
49
50 array1.Add(123);
51
52 ok_int(array1.GetSize(), 1);
53 ok_int(array1.GetData()[0], 123);
54 ok_int(array1[0], 123);
55
56 array1.Add(456);
57
58 ok_int(array1.GetSize(), 2);
59 ok_int(array1.GetData()[0], 123);
60 ok_int(array1[0], 123);
61 ok_int(array1.GetData()[1], 456);
62 ok_int(array1[1], 456);
63
64 array1.RemoveAll();
65 ok_int(array1.GetSize(), 0);
66
67 array1.Add(1);
68 array1.Add(1);
69 array1.Add(1);
70 array1.Add(2);
71 array1.Add(2);
72 array1.Add(3);
73 ok_int(array1.GetSize(), 6);
74
75 array1.Remove(2);
76 ok_int(array1.GetSize(), 5);
77
78 array1.Remove(1);
79 ok_int(array1.GetSize(), 4);
80
81 ok_int(array1[0], 1);
82 ok_int(array1[1], 1);
83 ok_int(array1[2], 2);
84 ok_int(array1[3], 3);
85
86 ok_int(CSimpleCreature::s_nCount, 0);
87 ok_int(CSimpleCreature::s_nCopyCount, 0);
88
89 CSimpleArray<CSimpleCreature> array2;
90 {
91 CSimpleCreature creature1, creature2;
92
93 ok_int(CSimpleCreature::s_nCount, 2);
94 ok_int(CSimpleCreature::s_nCopyCount, 0);
95 array2.Add(creature1);
96 ok_int(CSimpleCreature::s_nCount, 3);
97 ok_int(CSimpleCreature::s_nCopyCount, 0);
98 array2.Add(creature2);
99 ok_int(CSimpleCreature::s_nCount, 4);
100 ok_int(CSimpleCreature::s_nCopyCount, 0);
101 }
102 ok_int(CSimpleCreature::s_nCount, 2);
103 ok_int(CSimpleCreature::s_nCopyCount, 0);
104
105 {
106 CSimpleArray<CSimpleCreature> array3(array2), array4, array5;
107 ok_int(CSimpleCreature::s_nCount, 4);
108 ok_int(CSimpleCreature::s_nCopyCount, 0);
109
110 array4 = array2;
111 ok_int(CSimpleCreature::s_nCount, 6);
112 ok_int(CSimpleCreature::s_nCopyCount, 0);
113
114 CSimpleCreature creature1;
115 ok_int(CSimpleCreature::s_nCount, 7);
116 ok_int(CSimpleCreature::s_nCopyCount, 0);
117
118 array4.Add(creature1);
119 ok_int(CSimpleCreature::s_nCount, 8);
120 ok_int(CSimpleCreature::s_nCopyCount, 0);
121
122 array3 = array4;
123 ok_int(CSimpleCreature::s_nCount, 9);
124 ok_int(CSimpleCreature::s_nCopyCount, 0);
125
126 array5 = array2;
127 ok_int(CSimpleCreature::s_nCount, 11);
128 ok_int(CSimpleCreature::s_nCopyCount, 0);
129
130 array5 = array2;
131 ok_int(CSimpleCreature::s_nCount, 11);
132 ok_int(CSimpleCreature::s_nCopyCount, 0);
133 }
134 ok_int(CSimpleCreature::s_nCount, 2);
135 ok_int(CSimpleCreature::s_nCopyCount, 0);
136
137 array2.RemoveAll();
138 ok_int(CSimpleCreature::s_nCount, 0);
139 ok_int(CSimpleCreature::s_nCopyCount, 0);
140
141 array1.RemoveAll();
142 ok_int(array1.GetSize(), 0);
143 for (int i = 0; i < 100; ++i)
144 {
145 array1.Add(i);
146 }
147 ok_int(array1.GetSize(), 100);
148
149 array1.RemoveAll();
150 ok_int(array1.GetSize(), 0);
151 array1.Add(123);
152 array1.Add(321);
153 ok(!!array1.RemoveAt(0), "Expected RemoveAt(0) to succeed\n");
154 ok_int(array1.GetSize(), 1);
155 if (array1.GetSize() == 1)
156 {
157 ok_int(array1[0], 321);
158 }
159 ok(!!array1.RemoveAt(0), "Expected RemoveAt(0) to succeed\n");
160 ok_int(array1.GetSize(), 0);
161}