SimpleKernel 1.17.0
Loading...
Searching...
No Matches
ctor_dtor_test.cpp
Go to the documentation of this file.
1
5#include <cpu_io.h>
6
7#include <cstdint>
8
9#include "arch.h"
10#include "basic_info.hpp"
11#include "kernel.h"
12#include "kstd_cstring"
13#include "kstd_libcxx.h"
14#include "system_test.h"
15
16template <uint32_t V>
18 public:
19 explicit TestStaticConstructDestruct(unsigned int& v) : _v(v) { _v |= V; }
21
22 private:
23 unsigned int& _v;
24};
25
26static int global_value_with_init = 42;
27static uint32_t global_u32_value_with_init{0xa1a2a3a4UL};
28static uint64_t global_u64_value_with_init{0xb1b2b3b4b5b6b7b8ULL};
29static uint16_t global_u16_value_with_init{0x1234};
30static uint8_t global_u8a_value_with_init{0x42};
31static uint8_t global_u8b_value_with_init{0x43};
32static uint8_t global_u8c_value_with_init{0x44};
33static uint8_t global_u8d_value_with_init{0x45};
34static volatile bool global_bool_keep_running{true};
35
36static unsigned int global_value1_with_constructor = 1;
37static unsigned int global_value2_with_constructor = 2;
38
47
48static int g_dtor_count = 0;
49
50class AbsClass {
51 public:
52 AbsClass() { val = 'B'; }
53 virtual ~AbsClass() { g_dtor_count++; }
54 virtual void Func() = 0;
55 char val = 'A';
56};
57
58class InsClass : public AbsClass {
59 public:
60 void Func() override { val = 'C'; }
61};
62
63auto ctor_dtor_test() -> bool {
64#ifdef __aarch64__
65 cpu_io::SetupFpu();
66#endif
67
68 klog::Info("Running C++ Runtime Tests...");
69
70 // 1. Verify Global Initialization
71 EXPECT_EQ(global_value_with_init, 42, "Global int init");
72 EXPECT_EQ(global_u32_value_with_init, 0xa1a2a3a4UL, "Global uint32 init");
73 EXPECT_EQ(global_u64_value_with_init, 0xb1b2b3b4b5b6b7b8ULL,
74 "Global uint64 init");
75 EXPECT_EQ(global_u16_value_with_init, 0x1234, "Global uint16 init");
76 EXPECT_EQ(global_u8a_value_with_init, 0x42, "Global uint8 a init");
77 EXPECT_EQ(global_u8b_value_with_init, 0x43, "Global uint8 b init");
78 EXPECT_EQ(global_u8c_value_with_init, 0x44, "Global uint8 c init");
79 EXPECT_EQ(global_u8d_value_with_init, 0x45, "Global uint8 d init");
80
81 // 2. Verify Global Constructors
82 // global_value1_with_constructor was initialized to 1
83 // constructor_destructor_1 adds 0x200
84 // constructor_destructor_4 adds 0x100000
85 // Expected: 1 | 0x200 | 0x100000 = 0x100201 (1049089)
86 unsigned int expected_v1 = 1 | 0x200 | 0x100000;
88 "Global constructor execution 1");
89
90 unsigned int expected_v2 = 2 | 0x200 | 0x100000;
92 "Global constructor execution 2");
93
94 // 3. Verify Class Member, Virtual Function, and Stack Object Destructor
95 int start_dtor = g_dtor_count;
96 {
97 auto inst_class = InsClass();
98 EXPECT_EQ(inst_class.val, 'B', "Class constructor body");
99 inst_class.Func();
100 EXPECT_EQ(inst_class.val, 'C', "Virtual function dispatch");
101 }
102 EXPECT_EQ(g_dtor_count, start_dtor + 1,
103 "Stack object destructor verification");
104
105 // 4. Verify Static Local Variable
106 static InsClass inst_class_static;
107 EXPECT_TRUE(inst_class_static.val == 'B' || inst_class_static.val == 'C',
108 "Static local object constructor/persistence");
109 inst_class_static.Func();
110 EXPECT_EQ(inst_class_static.val, 'C', "Static local object virtual func");
111
112 klog::Info("PASS: All C++ Runtime Tests passed.");
113
114 return true;
115}
virtual void Func()=0
virtual ~AbsClass()
void Func() override
TestStaticConstructDestruct(unsigned int &v)
static uint8_t global_u8d_value_with_init
static uint16_t global_u16_value_with_init
static unsigned int global_value2_with_constructor
static unsigned int global_value1_with_constructor
static uint64_t global_u64_value_with_init
static int global_value_with_init
static uint8_t global_u8b_value_with_init
static TestStaticConstructDestruct< 0x100000 > constructor_destructor_3
static uint32_t global_u32_value_with_init
static uint8_t global_u8c_value_with_init
static uint8_t global_u8a_value_with_init
static TestStaticConstructDestruct< 0x100000 > constructor_destructor_4
static volatile bool global_bool_keep_running
static TestStaticConstructDestruct< 0x200 > constructor_destructor_1(global_value1_with_constructor)
static TestStaticConstructDestruct< 0x200 > constructor_destructor_2(global_value2_with_constructor)
static int g_dtor_count
auto ctor_dtor_test() -> bool
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
#define EXPECT_TRUE(cond, msg)
#define EXPECT_EQ(val1, val2, msg)