1
+ #include < catch2/catch_test_macros.hpp>
2
+
3
+ #include < dmt/fdmt_utils.hpp>
4
+
5
+ TEST_CASE (" cff" , " [fdmt_utils]" ) {
6
+ REQUIRE (fdmt::cff (1000 .0F , 1500 .0F , 1000 .0F , 1500 .0F ) == 1 .0F );
7
+ REQUIRE (fdmt::cff (1500 .0F , 1000 .0F , 1500 .0F , 1000 .0F ) == 1 .0F );
8
+ REQUIRE (fdmt::cff (1000 .0F , 1000 .0F , 1000 .0F , 1500 .0F ) == 0 .0F );
9
+ }
10
+
11
+ TEST_CASE (" calculate_dt_sub" , " [fdmt_utils]" ) {
12
+ REQUIRE (fdmt::calculate_dt_sub (1000 .0F , 1500 .0F , 1000 .0F , 1500 .0F , 100 )
13
+ == 100 );
14
+ REQUIRE (fdmt::calculate_dt_sub (1000 .0F , 1500 .0F , 1000 .0F , 1500 .0F , 0 ) == 0 );
15
+ }
16
+
17
+ TEST_CASE (" calculate_dt_grid_sub" , " [fdmt_utils]" ) {
18
+ SECTION (" Test case 1: only dt_max" ) {
19
+ const size_t dt_max = 512 ;
20
+ const size_t dt_step = 1 ;
21
+ const size_t dt_min = 0 ;
22
+ auto dt_grid = fdmt::calculate_dt_grid_sub (
23
+ 1000 .0F , 1500 .0F , 1000 .0F , 1500 .0F , dt_max, dt_step, dt_min);
24
+ REQUIRE (dt_grid.size () == dt_max - dt_min + 1 );
25
+ REQUIRE (dt_grid[0 ] == dt_min);
26
+ REQUIRE (dt_grid[512 ] == dt_max);
27
+ }
28
+ SECTION (" Test case 2: dt_max and dt_min" ) {
29
+ const size_t dt_max = 512 ;
30
+ const size_t dt_step = 1 ;
31
+ const size_t dt_min = 100 ;
32
+ auto dt_grid = fdmt::calculate_dt_grid_sub (
33
+ 1000 .0F , 1500 .0F , 1000 .0F , 1500 .0F , dt_max, dt_step, dt_min);
34
+ REQUIRE (dt_grid.size () == dt_max - dt_min + 1 );
35
+ REQUIRE (dt_grid[0 ] == dt_min);
36
+ REQUIRE (dt_grid[412 ] == dt_max);
37
+ }
38
+ }
39
+
40
+ TEST_CASE (" add_offset_kernel" , " [fdmt_utils]" ) {
41
+ SECTION (" Test case 1: Valid input and output vectors" ) {
42
+ std::vector<float > arr1 = {1 .0f , 2 .0f , 3 .0f , 4 .0f , 5 .0f };
43
+ std::vector<float > arr2 = {6 .0f , 7 .0f , 8 .0f };
44
+ std::vector<float > arr_out (8 , 0 .0f );
45
+ size_t offset = 2 ;
46
+ REQUIRE_NOTHROW (fdmt::add_offset_kernel (arr1.data (), arr1.size (),
47
+ arr2.data (), arr_out.data (),
48
+ arr_out.size (), offset));
49
+ std::vector<float > expected_output
50
+ = {1 .0f , 2 .0f , 9 .0f , 11 .0f , 13 .0f , 0 .0f , 0 .0f , 0 .0f };
51
+ REQUIRE (arr_out == expected_output);
52
+ }
53
+ SECTION (" Test case 2: Output size less than input size" ) {
54
+ std::vector<float > arr1 = {1 .0f , 2 .0f , 3 .0f , 4 .0f , 5 .0f };
55
+ std::vector<float > arr2 = {6 .0f , 7 .0f , 8 .0f };
56
+ std::vector<float > arr_out (4 , 0 .0f );
57
+ size_t offset = 2 ;
58
+ REQUIRE_THROWS_AS (fdmt::add_offset_kernel (arr1.data (), arr1.size (),
59
+ arr2.data (), arr_out.data (),
60
+ arr_out.size (), offset),
61
+ std::runtime_error);
62
+ }
63
+
64
+ SECTION (" Test case 3: Offset greater than input size" ) {
65
+ std::vector<float > arr1 = {1 .0f , 2 .0f , 3 .0f };
66
+ std::vector<float > arr2 = {4 .0f , 5 .0f };
67
+ std::vector<float > arr_out (5 , 0 .0f );
68
+ size_t offset = 4 ;
69
+ REQUIRE_THROWS_AS (fdmt::add_offset_kernel (arr1.data (), arr1.size (),
70
+ arr2.data (), arr_out.data (),
71
+ arr_out.size (), offset),
72
+ std::runtime_error);
73
+ }
74
+ SECTION (" Test case 4: Empty input vectors" ) {
75
+ std::vector<float > arr1;
76
+ std::vector<float > arr2;
77
+ std::vector<float > arr_out (3 , 0 .0f );
78
+ size_t offset = 0 ;
79
+ REQUIRE_THROWS_AS (fdmt::add_offset_kernel (arr1.data (), arr1.size (),
80
+ arr2.data (), arr_out.data (),
81
+ arr_out.size (), offset),
82
+ std::runtime_error);
83
+ }
84
+ }
85
+
86
+ TEST_CASE (" copy_kernel" , " [fdmt_utils]" ) {
87
+ SECTION (" Test case 1: Valid input and output vectors" ) {
88
+ std::vector<float > arr1 = {1 .0f , 2 .0f , 3 .0f , 4 .0f , 5 .0f };
89
+ std::vector<float > arr_out (10 , 0 .0f );
90
+ ;
91
+ REQUIRE_NOTHROW (fdmt::copy_kernel (arr1.data (), arr1.size (),
92
+ arr_out.data (), arr_out.size ()));
93
+ for (size_t i = 0 ; i < arr1.size (); ++i) {
94
+ REQUIRE (arr_out[i] == arr1[i]);
95
+ }
96
+ for (size_t i = arr1.size (); i < arr_out.size (); ++i) {
97
+ REQUIRE (arr_out[i] == 0 .0f );
98
+ }
99
+ }
100
+ SECTION (" Test case 2: Output size less than input size" ) {
101
+ std::vector<float > arr1 = {1 .0f , 2 .0f , 3 .0f , 4 .0f , 5 .0f };
102
+ std::vector<float > arr_out (3 , 0 .0f );
103
+ REQUIRE_THROWS_AS (fdmt::copy_kernel (arr1.data (), arr1.size (),
104
+ arr_out.data (), arr_out.size ()),
105
+ std::runtime_error);
106
+ }
107
+ SECTION (" Test case 4: Empty input vector" ) {
108
+ std::vector<float > arr1;
109
+ std::vector<float > arr_out (5 , 0 .0f );
110
+ REQUIRE_NOTHROW (fdmt::copy_kernel (arr1.data (), arr1.size (),
111
+ arr_out.data (), arr_out.size ()));
112
+ for (size_t i = 0 ; i < arr_out.size (); ++i) {
113
+ REQUIRE (arr_out[i] == 0 .0f );
114
+ }
115
+ }
116
+ }
117
+
118
+ TEST_CASE (" find_closest_index" , " [fdmt_utils]" ) {
119
+ SECTION (" Test case 1: Empty array" ) {
120
+ std::vector<size_t > arr_sorted;
121
+ REQUIRE_THROWS_AS (fdmt::find_closest_index (arr_sorted, 10 ),
122
+ std::runtime_error);
123
+ }
124
+
125
+ SECTION (" Test case 2: Array with one element - exact match" ) {
126
+ std::vector<size_t > arr_sorted{10 };
127
+ size_t val = 10 ;
128
+ size_t expected = 0 ;
129
+ size_t result = fdmt::find_closest_index (arr_sorted, val);
130
+ REQUIRE (result == expected);
131
+ }
132
+
133
+ SECTION (" Test case 3: Array with one element - closest match" ) {
134
+ std::vector<size_t > arr_sorted{10 };
135
+ size_t val = 15 ;
136
+ size_t expected = 0 ;
137
+ size_t result = fdmt::find_closest_index (arr_sorted, val);
138
+ REQUIRE (result == expected);
139
+ }
140
+
141
+ SECTION (" Test case 4: Array with multiple elements - exact match" ) {
142
+ std::vector<size_t > arr_sorted{10 , 20 , 30 , 40 , 50 };
143
+ size_t val = 30 ;
144
+ size_t expected = 2 ;
145
+ size_t result = fdmt::find_closest_index (arr_sorted, val);
146
+ REQUIRE (result == expected);
147
+ }
148
+
149
+ SECTION (
150
+ " Test case 5: Array with multiple elements - closest match (lower)" ) {
151
+ std::vector<size_t > arr_sorted{10 , 20 , 30 , 40 , 50 };
152
+ size_t val = 24 ;
153
+ size_t expected = 1 ;
154
+ size_t result = fdmt::find_closest_index (arr_sorted, val);
155
+ REQUIRE (result == expected);
156
+ }
157
+
158
+ SECTION (
159
+ " Test case 6: Array with multiple elements - closest match (upper)" ) {
160
+ std::vector<size_t > arr_sorted{10 , 20 , 30 , 40 , 50 };
161
+ size_t val = 26 ;
162
+ size_t expected = 2 ;
163
+ size_t result = fdmt::find_closest_index (arr_sorted, val);
164
+ REQUIRE (result == expected);
165
+ }
166
+
167
+ SECTION (" Test case 7: Array with multiple elements - value smaller than "
168
+ " all elements" ) {
169
+ std::vector<size_t > arr_sorted{10 , 20 , 30 , 40 , 50 };
170
+ size_t val = 5 ;
171
+ size_t expected = 0 ;
172
+ size_t result = fdmt::find_closest_index (arr_sorted, val);
173
+ REQUIRE (result == expected);
174
+ }
175
+
176
+ SECTION (" Test case 8: Array with multiple elements - value larger than all "
177
+ " elements" ) {
178
+ std::vector<size_t > arr_sorted{10 , 20 , 30 , 40 , 50 };
179
+ size_t val = 60 ;
180
+ size_t expected = 4 ;
181
+ size_t result = fdmt::find_closest_index (arr_sorted, val);
182
+ REQUIRE (result == expected);
183
+ }
184
+
185
+ SECTION (" Test case 9: Array with multiple elements - duplicate values" ) {
186
+ std::vector<size_t > arr_sorted{10 , 20 , 20 , 30 , 40 , 50 };
187
+ size_t val = 20 ;
188
+ size_t expected = 1 ;
189
+ size_t result = fdmt::find_closest_index (arr_sorted, val);
190
+ REQUIRE (result == expected);
191
+ }
192
+ }
0 commit comments