1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Test for CAtlArray
5 * COPYRIGHT: Copyright 2016-2019 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6 * Copyright 2019 Mark Jansen (mark.jansen@reactos.org)
7 */
8
9 #ifdef HAVE_APITEST
10 #include <apitest.h>
11 #else
12 #include "atltest.h"
13 #endif
14
15 #include <atlbase.h>
16 #include <atlcoll.h>
17
18 struct CCreature
19 {
20 static int s_nCtorCount;
21 static int s_nCtorCount_Default;
22 static int s_nCCtorCount;
23 static int s_nDtorCount;
24 static int s_nOpIsCount;
25
26 int m_id;
27
CCreatureCCreature28 CCreature(int id = 0x123456)
29 :m_id(id)
30 {
31 CCreature::s_nCtorCount++;
32 if (id == 0x123456)
33 s_nCtorCount_Default++;
34 }
CCreatureCCreature35 CCreature(const CCreature& c)
36 :m_id(c.m_id)
37 {
38 CCreature::s_nCCtorCount++;
39 }
~CCreatureCCreature40 ~CCreature()
41 {
42 CCreature::s_nDtorCount++;
43 }
operator =CCreature44 CCreature& operator=(const CCreature& other)
45 {
46 m_id = other.m_id;
47 CCreature::s_nOpIsCount++;
48 return *this;
49 }
50 };
51
52 int CCreature::s_nCtorCount = 0;
53 int CCreature::s_nCtorCount_Default = 0;
54 int CCreature::s_nCCtorCount = 0;
55 int CCreature::s_nDtorCount = 0;
56 int CCreature::s_nOpIsCount = 0;
57
58
START_TEST(CAtlArray)59 START_TEST(CAtlArray)
60 {
61 {
62 CAtlArray<CCreature> array1;
63
64 ok_int(CCreature::s_nCtorCount, 0);
65 ok_int(CCreature::s_nCtorCount_Default, 0);
66 ok_int(CCreature::s_nCCtorCount, 0);
67 ok_int(CCreature::s_nDtorCount, 0);
68 ok_int(CCreature::s_nOpIsCount, 0);
69
70 array1.SetCount(2);
71
72 ok_int(CCreature::s_nCtorCount, 2);
73 ok_int(CCreature::s_nCtorCount_Default, 2);
74 ok_int(CCreature::s_nCCtorCount, 0);
75 ok_int(CCreature::s_nDtorCount, 0);
76 ok_int(CCreature::s_nOpIsCount, 0);
77
78 array1.SetCount(1);
79
80 ok_int(CCreature::s_nCtorCount, 2);
81 ok_int(CCreature::s_nCtorCount_Default, 2);
82 ok_int(CCreature::s_nCCtorCount, 0);
83 ok_int(CCreature::s_nDtorCount, 1);
84 ok_int(CCreature::s_nOpIsCount, 0);
85
86 CCreature test(111);
87
88 ok_int(CCreature::s_nCtorCount, 3);
89 ok_int(CCreature::s_nCtorCount_Default, 2);
90 ok_int(CCreature::s_nCCtorCount, 0);
91 ok_int(CCreature::s_nDtorCount, 1);
92 ok_int(CCreature::s_nOpIsCount, 0);
93
94 ok_size_t(array1.GetCount(), 1u);
95 ok_int(array1[0].m_id, 0x123456);
96 ok_int(array1.GetAt(0).m_id, 0x123456);
97
98 array1.Add(test);
99
100 ok_int(CCreature::s_nCtorCount, 3);
101 ok_int(CCreature::s_nCtorCount_Default, 2);
102 ok_int(CCreature::s_nCCtorCount, 1);
103 ok_int(CCreature::s_nDtorCount, 1);
104 ok_int(CCreature::s_nOpIsCount, 0);
105
106 ok_size_t(array1.GetCount(), 2u);
107 ok_int(array1[0].m_id, 0x123456);
108 ok_int(array1.GetAt(0).m_id, 0x123456);
109 ok_int(array1[1].m_id, 111);
110 ok_int(array1.GetAt(1).m_id, 111);
111
112 test.m_id = 222;
113 array1[0] = test;
114
115 ok_int(CCreature::s_nCtorCount, 3);
116 ok_int(CCreature::s_nCtorCount_Default, 2);
117 ok_int(CCreature::s_nCCtorCount, 1);
118 ok_int(CCreature::s_nDtorCount, 1);
119 ok_int(CCreature::s_nOpIsCount, 1);
120
121 // Default traits does not call anything when relocating objects!
122 array1.SetCount(100);
123
124 ok_int(CCreature::s_nCtorCount, 101);
125 ok_int(CCreature::s_nCtorCount_Default, 100);
126 ok_int(CCreature::s_nCCtorCount, 1);
127 ok_int(CCreature::s_nDtorCount, 1);
128 ok_int(CCreature::s_nOpIsCount, 1);
129
130 // Does not compile:
131 //CAtlArray<CCreature> array2(array1);
132
133 // Does not compile:
134 //CAtlArray<CCreature> array2;
135 //array2 = array1;
136 }
137
138 // Objects are cleaned up when the list goes away
139 ok_int(CCreature::s_nCtorCount, 101);
140 ok_int(CCreature::s_nCtorCount_Default, 100);
141 ok_int(CCreature::s_nCCtorCount, 1);
142 ok_int(CCreature::s_nDtorCount, 102);
143 ok_int(CCreature::s_nOpIsCount, 1);
144 }
145