diff --git a/modules/rostests/apitests/atl/CAtlArray.cpp b/modules/rostests/apitests/atl/CAtlArray.cpp new file mode 100644 index 00000000000..8527c4ac47d --- /dev/null +++ b/modules/rostests/apitests/atl/CAtlArray.cpp @@ -0,0 +1,169 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Test for CAtlArray + * COPYRIGHT: Copyright 2016-2019 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com) + * Copyright 2019 Mark Jansen (mark.jansen@reactos.org) + */ + +#ifdef HAVE_APITEST + #include +#else + #include + #include + #include + int g_tests_executed = 0; + int g_tests_failed = 0; + void ok_func(const char *file, int line, bool value, const char *fmt, ...) + { + va_list va; + va_start(va, fmt); + if (!value) + { + printf("%s (%d): ", file, line); + vprintf(fmt, va); + g_tests_failed++; + } + g_tests_executed++; + va_end(va); + } + #undef ok + #define ok(value, ...) ok_func(__FILE__, __LINE__, value, __VA_ARGS__) + #define START_TEST(x) int main(void) +#endif + +#include +#include + +struct CCreature +{ + static int s_nCtorCount; + static int s_nCtorCount_Default; + static int s_nCCtorCount; + static int s_nDtorCount; + static int s_nOpIsCount; + + int m_id; + + CCreature(int id = 0x123456) + :m_id(id) + { + CCreature::s_nCtorCount++; + if (id == 0x123456) + s_nCtorCount_Default++; + } + CCreature(const CCreature& c) + :m_id(c.m_id) + { + CCreature::s_nCCtorCount++; + } + ~CCreature() + { + CCreature::s_nDtorCount++; + } + CCreature& operator=(const CCreature& other) + { + m_id = other.m_id; + CCreature::s_nOpIsCount++; + return *this; + } +}; + +int CCreature::s_nCtorCount = 0; +int CCreature::s_nCtorCount_Default = 0; +int CCreature::s_nCCtorCount = 0; +int CCreature::s_nDtorCount = 0; +int CCreature::s_nOpIsCount = 0; + + +START_TEST(CAtlArray) +{ + { + CAtlArray array1; + + ok(CCreature::s_nCtorCount == 0, "Expected CCreature::s_nCtorCount is zero, was: %d\n", CCreature::s_nCtorCount); + ok(CCreature::s_nCtorCount_Default == 0, "Expected CCreature::s_nCtorCount_Default is zero, was: %d\n", CCreature::s_nCtorCount_Default); + ok(CCreature::s_nCCtorCount == 0, "Expected CCreature::s_nCCtorCount is zero, was: %d\n", CCreature::s_nCCtorCount); + ok(CCreature::s_nDtorCount == 0, "Expected CCreature::s_nDtorCount is zero, was: %d\n", CCreature::s_nDtorCount); + ok(CCreature::s_nOpIsCount == 0, "Expected CCreature::s_nOpIsCount is zero, was: %d\n", CCreature::s_nOpIsCount); + + array1.SetCount(2); + + ok(CCreature::s_nCtorCount == 2, "Expected CCreature::s_nCtorCount is 2, was: %d\n", CCreature::s_nCtorCount); + ok(CCreature::s_nCtorCount_Default == 2, "Expected CCreature::s_nCtorCount_Default is 2, was: %d\n", CCreature::s_nCtorCount_Default); + ok(CCreature::s_nCCtorCount == 0, "Expected CCreature::s_nCCtorCount is zero, was: %d\n", CCreature::s_nCCtorCount); + ok(CCreature::s_nDtorCount == 0, "Expected CCreature::s_nDtorCount is zero, was: %d\n", CCreature::s_nDtorCount); + ok(CCreature::s_nOpIsCount == 0, "Expected CCreature::s_nOpIsCount is zero, was: %d\n", CCreature::s_nOpIsCount); + + array1.SetCount(1); + + ok(CCreature::s_nCtorCount == 2, "Expected CCreature::s_nCtorCount is 2, was: %d\n", CCreature::s_nCtorCount); + ok(CCreature::s_nCtorCount_Default == 2, "Expected CCreature::s_nCtorCount_Default is 2, was: %d\n", CCreature::s_nCtorCount_Default); + ok(CCreature::s_nCCtorCount == 0, "Expected CCreature::s_nCCtorCount is zero, was: %d\n", CCreature::s_nCCtorCount); + ok(CCreature::s_nDtorCount == 1, "Expected CCreature::s_nDtorCount is 1, was: %d\n", CCreature::s_nDtorCount); + ok(CCreature::s_nOpIsCount == 0, "Expected CCreature::s_nOpIsCount is zero, was: %d\n", CCreature::s_nOpIsCount); + + CCreature test(111); + + ok(CCreature::s_nCtorCount == 3, "Expected CCreature::s_nCtorCount is 3, was: %d\n", CCreature::s_nCtorCount); + ok(CCreature::s_nCtorCount_Default == 2, "Expected CCreature::s_nCtorCount_Default is 2, was: %d\n", CCreature::s_nCtorCount_Default); + ok(CCreature::s_nCCtorCount == 0, "Expected CCreature::s_nCCtorCount is zero, was: %d\n", CCreature::s_nCCtorCount); + ok(CCreature::s_nDtorCount == 1, "Expected CCreature::s_nDtorCount is 1, was: %d\n", CCreature::s_nDtorCount); + ok(CCreature::s_nOpIsCount == 0, "Expected CCreature::s_nOpIsCount is zero, was: %d\n", CCreature::s_nOpIsCount); + + ok(array1.GetCount() == 1u, "Expected GetCount() to be 1, was %u\n", array1.GetCount()); + ok(array1[0].m_id == 0x123456, "Got %d\n", array1[0].m_id); + ok(array1.GetAt(0).m_id == 0x123456, "Got %d\n", array1.GetAt(0).m_id); + + array1.Add(test); + + ok(CCreature::s_nCtorCount == 3, "Expected CCreature::s_nCtorCount is 3, was: %d\n", CCreature::s_nCtorCount); + ok(CCreature::s_nCtorCount_Default == 2, "Expected CCreature::s_nCtorCount_Default is 2, was: %d\n", CCreature::s_nCtorCount_Default); + ok(CCreature::s_nCCtorCount == 1, "Expected CCreature::s_nCCtorCount is 1, was: %d\n", CCreature::s_nCCtorCount); + ok(CCreature::s_nDtorCount == 1, "Expected CCreature::s_nDtorCount is 1, was: %d\n", CCreature::s_nDtorCount); + ok(CCreature::s_nOpIsCount == 0, "Expected CCreature::s_nOpIsCount is zero, was: %d\n", CCreature::s_nOpIsCount); + + ok(array1.GetCount() == 2u, "Expected GetCount() to be 2, was %u\n", array1.GetCount()); + ok(array1[0].m_id == 0x123456, "Got %d\n", array1[0].m_id); + ok(array1.GetAt(0).m_id == 0x123456, "Got %d\n", array1.GetAt(0).m_id); + ok(array1[1].m_id == 111, "Got %d\n", array1[1].m_id); + ok(array1.GetAt(1).m_id == 111, "Got %d\n", array1.GetAt(1).m_id); + + test.m_id = 222; + array1[0] = test; + + ok(CCreature::s_nCtorCount == 3, "Expected CCreature::s_nCtorCount is 3, was: %d\n", CCreature::s_nCtorCount); + ok(CCreature::s_nCtorCount_Default == 2, "Expected CCreature::s_nCtorCount_Default is 2, was: %d\n", CCreature::s_nCtorCount_Default); + ok(CCreature::s_nCCtorCount == 1, "Expected CCreature::s_nCCtorCount is 1, was: %d\n", CCreature::s_nCCtorCount); + ok(CCreature::s_nDtorCount == 1, "Expected CCreature::s_nDtorCount is 1, was: %d\n", CCreature::s_nDtorCount); + ok(CCreature::s_nOpIsCount == 1, "Expected CCreature::s_nOpIsCount is 1, was: %d\n", CCreature::s_nOpIsCount); + + // Default traits does not call anything when relocating objects! + array1.SetCount(100); + + ok(CCreature::s_nCtorCount == 101, "Expected CCreature::s_nCtorCount is 101, was: %d\n", CCreature::s_nCtorCount); + ok(CCreature::s_nCtorCount_Default == 100, "Expected CCreature::s_nCtorCount_Default is 100, was: %d\n", CCreature::s_nCtorCount_Default); + ok(CCreature::s_nCCtorCount == 1, "Expected CCreature::s_nCCtorCount is 1, was: %d\n", CCreature::s_nCCtorCount); + ok(CCreature::s_nDtorCount == 1, "Expected CCreature::s_nDtorCount is 1, was: %d\n", CCreature::s_nDtorCount); + ok(CCreature::s_nOpIsCount == 1, "Expected CCreature::s_nOpIsCount is 1, was: %d\n", CCreature::s_nOpIsCount); + + // Does not compile: + //CAtlArray array2(array1); + + // Does not compile: + //CAtlArray array2; + //array2 = array1; + } + + // Objects are cleaned up when the list goes away + ok(CCreature::s_nCtorCount == 101, "Expected CCreature::s_nCtorCount is 101, was: %d\n", CCreature::s_nCtorCount); + ok(CCreature::s_nCtorCount_Default == 100, "Expected CCreature::s_nCtorCount_Default is 100, was: %d\n", CCreature::s_nCtorCount_Default); + ok(CCreature::s_nCCtorCount == 1, "Expected CCreature::s_nCCtorCount is 1, was: %d\n", CCreature::s_nCCtorCount); + ok(CCreature::s_nDtorCount == 102, "Expected CCreature::s_nDtorCount is 102, was: %d\n", CCreature::s_nDtorCount); + ok(CCreature::s_nOpIsCount == 1, "Expected CCreature::s_nOpIsCount is 1, was: %d\n", CCreature::s_nOpIsCount); + +#ifndef HAVE_APITEST + printf("CAtlArray: %i tests executed (0 marked as todo, %i failures), 0 skipped.\n", g_tests_executed, g_tests_failed); + return g_tests_failed; +#endif +} diff --git a/modules/rostests/apitests/atl/devenv/ATLTest.sln b/modules/rostests/apitests/atl/devenv/ATLTest.sln index 044cdd3c3ad..bfb2408196e 100644 --- a/modules/rostests/apitests/atl/devenv/ATLTest.sln +++ b/modules/rostests/apitests/atl/devenv/ATLTest.sln @@ -17,6 +17,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CComQIPtr", "CComQIPtr.vcxp EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CAtlFileMapping", "CAtlFile.vcxproj", "{3AE82A8E-D43D-41F6-8093-9C687283FAB6}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CAtlArray", "CAtlArray.vcxproj", "{E3DB2078-6AE9-463E-830F-36C03FFE5DC3}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CAtlList", "CAtlList.vcxproj", "{00C3325D-0E3D-43F1-92C8-F7D5C32F70C6}" EndProject Global @@ -83,6 +85,14 @@ Global {3AE82A8E-D43D-41F6-8093-9C687283FAB6}.Release|x64.Build.0 = Release|x64 {3AE82A8E-D43D-41F6-8093-9C687283FAB6}.Release|x86.ActiveCfg = Release|Win32 {3AE82A8E-D43D-41F6-8093-9C687283FAB6}.Release|x86.Build.0 = Release|Win32 + {E3DB2078-6AE9-463E-830F-36C03FFE5DC3}.Debug|x64.ActiveCfg = Debug|x64 + {E3DB2078-6AE9-463E-830F-36C03FFE5DC3}.Debug|x64.Build.0 = Debug|x64 + {E3DB2078-6AE9-463E-830F-36C03FFE5DC3}.Debug|x86.ActiveCfg = Debug|Win32 + {E3DB2078-6AE9-463E-830F-36C03FFE5DC3}.Debug|x86.Build.0 = Debug|Win32 + {E3DB2078-6AE9-463E-830F-36C03FFE5DC3}.Release|x64.ActiveCfg = Release|x64 + {E3DB2078-6AE9-463E-830F-36C03FFE5DC3}.Release|x64.Build.0 = Release|x64 + {E3DB2078-6AE9-463E-830F-36C03FFE5DC3}.Release|x86.ActiveCfg = Release|Win32 + {E3DB2078-6AE9-463E-830F-36C03FFE5DC3}.Release|x86.Build.0 = Release|Win32 {00C3325D-0E3D-43F1-92C8-F7D5C32F70C6}.Debug|x64.ActiveCfg = Debug|x64 {00C3325D-0E3D-43F1-92C8-F7D5C32F70C6}.Debug|x64.Build.0 = Debug|x64 {00C3325D-0E3D-43F1-92C8-F7D5C32F70C6}.Debug|x86.ActiveCfg = Debug|Win32 diff --git a/modules/rostests/apitests/atl/devenv/CAtlArray.vcxproj b/modules/rostests/apitests/atl/devenv/CAtlArray.vcxproj new file mode 100644 index 00000000000..665928a42b1 --- /dev/null +++ b/modules/rostests/apitests/atl/devenv/CAtlArray.vcxproj @@ -0,0 +1,180 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {E3DB2078-6AE9-463E-830F-36C03FFE5DC3} + 8.1 + AtlProj + + + + Application + true + v140_xp + Unicode + + + Application + false + v140_xp + Unicode + + + Application + true + v140_xp + Unicode + + + Application + false + v140_xp + Unicode + + + + + + + + + + + + + + + + + + + + + true + true + $(ProjectName)\$(Configuration)\ + + + true + true + $(ProjectName)\$(Platform)\$(Configuration)\ + + + true + false + $(ProjectName)\$(Configuration)\ + + + true + false + $(ProjectName)\$(Platform)\$(Configuration)\ + + + + NotUsing + Level3 + Disabled + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + true + + + 0x0409 + $(IntDir);%(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + + + Console + true + + + + + NotUsing + Level3 + Disabled + _WINDOWS;_DEBUG;%(PreprocessorDefinitions) + true + + + 0x0409 + $(IntDir);%(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + + + Console + true + + + + + NotUsing + Level3 + MaxSpeed + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + true + + + 0x0409 + $(IntDir);%(AdditionalIncludeDirectories) + NDEBUG;%(PreprocessorDefinitions) + + + Console + true + true + true + + + + + NotUsing + Level3 + MaxSpeed + _WINDOWS;NDEBUG;%(PreprocessorDefinitions) + true + + + 0x0409 + $(IntDir);%(AdditionalIncludeDirectories) + NDEBUG;%(PreprocessorDefinitions) + + + Console + true + true + true + + + + + MultiThreaded + MultiThreaded + MultiThreadedDebug + MultiThreadedDebug + NotUsing + NotUsing + NotUsing + NotUsing + + + + + + \ No newline at end of file