[CRT_APITEST]
[reactos.git] / rostests / apitests / crt / static_construct.cpp
1 /*
2 * PROJECT: ReactOS API tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for static C++ object construction
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8 #include <apitest.h>
9 #include "dll_startup.h"
10
11 extern "C"
12 {
13 extern int static_init_counter;
14
15 static int static_init_counter_at_startup;
16 static int static_construct_counter_at_startup;
17 static int m_uninit_at_startup;
18
19 int static_construct_counter = 789;
20 }
21
22 static struct init_static
23 {
24 int m_uninit;
25 int m_counter;
26
27 init_static() :
28 m_counter(2)
29 {
30 static_init_counter_at_startup = static_init_counter;
31 static_construct_counter_at_startup = static_construct_counter;
32 m_uninit_at_startup = m_uninit;
33 static_construct_counter++;
34 m_uninit++;
35 }
36 } init_static;
37
38 START_TEST(static_construct)
39 {
40 ok(static_init_counter_at_startup == 123, "static_init_counter at startup: %d\n", static_init_counter_at_startup);
41 ok(static_construct_counter_at_startup == 789, "static_construct_counter at startup: %d\n", static_construct_counter_at_startup);
42 ok(m_uninit_at_startup == 0, "init_static.m_uninit at startup: %d\n", m_uninit_at_startup);
43
44 ok(static_init_counter == 123, "static_init_counter: %d\n", static_init_counter);
45
46 ok(static_construct_counter == 790, "static_construct_counter: %d\n", static_construct_counter);
47 ok(init_static.m_counter == 2, "init_static.m_counter: %d\n", init_static.m_counter);
48 ok(init_static.m_uninit == 1, "init_static.m_uninit: %d\n", init_static.m_uninit);
49
50 counter_values values;
51 #if defined(TEST_MSVCRT)
52 HMODULE hDll = LoadLibraryW(L"msvcrt_crt_dll_startup.dll");
53 #elif defined(TEST_STATIC_CRT)
54 HMODULE hDll = LoadLibraryW(L"static_crt_dll_startup.dll");
55 #else
56 #error This test only makes sense for static CRT and msvcrt.dll
57 #endif
58 if (hDll == NULL)
59 {
60 skip("Helper dll not found\n");
61 return;
62 }
63 SET_COUNTER_VALUES_POINTER *pSetCounterValuesPointer = reinterpret_cast<SET_COUNTER_VALUES_POINTER*>(GetProcAddress(hDll, "SetCounterValuesPointer"));
64 if (pSetCounterValuesPointer == NULL)
65 {
66 skip("Helper function not found\n");
67 FreeLibrary(hDll);
68 return;
69 }
70 pSetCounterValuesPointer(&values);
71 ok(values.m_uninit_at_startup == 0, "m_uninit_at_startup = %d\n", values.m_uninit_at_startup);
72 ok(values.m_uninit == 1, "m_uninit = %d\n", values.m_uninit);
73 ok(values.m_counter == 2, "m_counter = %d\n", values.m_counter);
74 ok(values.static_construct_counter_at_startup == 5656, "static_construct_counter_at_startup = %d\n", values.static_construct_counter_at_startup);
75 ok(values.static_construct_counter == 5657, "static_construct_counter = %d\n", values.static_construct_counter);
76 ok(values.dtor_counter_at_detach == 0, "dtor_counter_at_detach = %d\n", values.dtor_counter_at_detach);
77 ok(values.dtor_counter == 0, "dtor_counter = %d\n", values.dtor_counter);
78 values.dtor_counter_at_detach = 78789;
79 values.dtor_counter = 7878;
80 FreeLibrary(hDll);
81 ok(values.m_uninit_at_startup == 0, "m_uninit_at_startup = %d\n", values.m_uninit_at_startup);
82 ok(values.m_uninit == 1, "m_uninit = %d\n", values.m_uninit);
83 ok(values.m_counter == 2, "m_counter = %d\n", values.m_counter);
84 ok(values.static_construct_counter_at_startup == 5656, "static_construct_counter_at_startup = %d\n", values.static_construct_counter_at_startup);
85 ok(values.static_construct_counter == 5657, "static_construct_counter = %d\n", values.static_construct_counter);
86 ok(values.dtor_counter_at_detach == 7878, "dtor_counter_at_detach = %d\n", values.dtor_counter_at_detach);
87 ok(values.dtor_counter == 7879, "dtor_counter = %d\n", values.dtor_counter);
88 }