Skip to content

Commit a5d29aa

Browse files
committed
tests added
1 parent 67b14d6 commit a5d29aa

File tree

7 files changed

+251
-11
lines changed

7 files changed

+251
-11
lines changed

.github/workflows/ci.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,21 @@ jobs:
3737
- name: Build
3838
run: >
3939
cmake --build ${{ steps.strings.outputs.build-output-dir }}
40-
--config ${{ matrix.build_type }} --verbose
40+
--config ${{ matrix.build_type }}
4141
4242
- name: Test
4343
working-directory: ${{ steps.strings.outputs.build-output-dir }}
44-
run: ctest -C ${{ matrix.build_type }} --output-on-failure
44+
run: >
45+
ctest --build-config ${{ matrix.build_type }} --output-on-failure
46+
--test-dir ${{ steps.strings.outputs.build-output-dir }}/tests/cpp
4547
4648
python:
4749
runs-on: ${{ matrix.os }}
4850
strategy:
4951
fail-fast: false
5052
matrix:
5153
os: [ubuntu-latest, macos-latest]
52-
python-version: ['3.9', '3.10', '3.11']
54+
python-version: ['3.9', '3.10']
5355

5456
steps:
5557
- uses: actions/checkout@v4

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ if(BUILD_PYTHON)
4040
endif()
4141
# Build tests
4242
if(BUILD_TESTING)
43-
add_subdirectory(tests)
43+
add_subdirectory(tests/cpp)
4444
endif()
4545

4646
# Install targets and configuration

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ omit = ["tests/*", "*__init__.py", "docs/*"]
9191
show_missing = true
9292
ignore_errors = true
9393
#fail_under = 85
94-
exclude_also = ["*__init__.py", "docs/*", "raise NotImplementedError", "@jit"]
94+
exclude_lines = ['raise AssertionError', 'raise NotImplementedError']
9595

9696
[tool.coverage.path]
9797
source = "src/dmt"

tests/cpp/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ file(GLOB TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
1212
add_executable(${TARGET_TESTS} ${TEST_SOURCES})
1313
target_include_directories(${TARGET_TESTS} PUBLIC ${CMAKE_SOURCE_DIR}/include)
1414
target_include_directories(${TARGET_TESTS} PRIVATE ${CMAKE_SOURCE_DIR}/lib)
15-
target_link_libraries(${TARGET_TESTS} PRIVATE ${LIBRARY_NAME} Catch2::Catch2withMain)
15+
target_link_libraries(${TARGET_TESTS} PRIVATE ${LIBRARY_NAME} Catch2::Catch2WithMain)
1616

1717
include(Catch)
1818
include(CTest)

tests/cpp/fdmt_t.cpp

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,34 @@
11
#include <catch2/catch_test_macros.hpp>
22

3+
#include <cstddef>
34
#include <dmt/fdmt.hpp>
45

5-
TEST_CASE("make_vector", "[make_vector]") {
6-
REQUIRE(make_vector<int>(0) == std::vector<int>{});
7-
REQUIRE(make_vector<int>(5) == std::vector<int>{0, 1, 2, 3, 4});
8-
REQUIRE(make_vector<short>(3) == std::vector<short>{0, 1, 2});
9-
REQUIRE(make_vector<std::size_t>(4) == std::vector<std::size_t>{0, 1, 2, 3});
6+
TEST_CASE("FDMT class tests", "[fdmt]") {
7+
SECTION("Test case 1: Constructor and getter methods") {
8+
FDMT fdmt(1000.0F, 1500.0F, 500, 1024, 0.001F, 512, 1, 0);
9+
REQUIRE(fdmt.get_df() == 1.0F);
10+
REQUIRE(fdmt.get_correction() == 0.5F);
11+
REQUIRE(fdmt.get_dt_grid_final().size() == 513);
12+
REQUIRE(fdmt.get_niters() == 9);
13+
REQUIRE(fdmt.get_plan().df_top.size() == 10);
14+
REQUIRE(fdmt.get_plan().df_bot.size() == 10);
15+
REQUIRE(fdmt.get_plan().state_shape.size() == 10);
16+
REQUIRE(fdmt.get_plan().sub_plan.size() == 10);
17+
}
18+
SECTION("Test case 2: initialise method") {
19+
FDMT fdmt(1000.0F, 1500.0F, 500, 1024, 0.001F, 512, 1, 0);
20+
std::vector<float> waterfall(500 * 1024, 1.0f);
21+
const size_t dt_init_size = fdmt.get_dt_grid_init().size();
22+
std::vector<float> state(500 * 1024 * dt_init_size, 0.0f);
23+
REQUIRE_NOTHROW(fdmt.initialise(waterfall.data(), state.data()));
24+
}
25+
26+
SECTION("Test case 3: execute method") {
27+
FDMT fdmt(1000.0F, 1500.0F, 500, 1024, 0.001F, 512, 1, 0);
28+
std::vector<float> waterfall(500 * 1024, 1.0f);
29+
const size_t dt_final_size = fdmt.get_dt_grid_final().size();
30+
std::vector<float> dmt(dt_final_size * 1024, 0.0f);
31+
REQUIRE_NOTHROW(fdmt.execute(waterfall.data(), waterfall.size(),
32+
dmt.data(), dmt.size()));
33+
}
1034
}

tests/cpp/fdmt_utils_t.cpp

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
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+
}

tests/python/test_libdmt.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import numpy as np
2+
from dmt import libdmt
3+
4+
5+
class TestFDMT:
6+
def test_initialise_ones(self) -> None:
7+
nchans = 500
8+
nsamples = 1024
9+
dt_max = 512
10+
thefdmt = libdmt.FDMT(1000, 1500, nchans, nsamples, 0.001, dt_max)
11+
waterfall = np.ones((nchans, nsamples), dtype=np.float32)
12+
thefdmt_init = thefdmt.initialise(waterfall)
13+
np.testing.assert_equal(
14+
thefdmt_init.shape,
15+
(nchans, thefdmt.dt_grid_init.size, nsamples),
16+
)
17+
"""
18+
np.testing.assert_equal(
19+
thefdmt_init,
20+
np.ones((nchans, thefdmt.dt_grid_init.size, nsamples), dtype=np.float32),
21+
)
22+
"""

0 commit comments

Comments
 (0)