From 87ead738008799752bfb36b687899343baadb454 Mon Sep 17 00:00:00 2001 From: Jose Luis Cercos-Pita Date: Mon, 13 Jan 2025 09:07:04 +0100 Subject: [PATCH 1/3] feat(rust): First test using the Rust wrapper --- tests/CMakeLists.txt | 27 +++++++++++++++++++++++ tests/Cargo.toml | 11 ++++++++++ tests/rust_minimal.rs | 42 ++++++++++++++++++++++++++++++++++++ wrappers/rust/CMakeLists.txt | 1 + wrappers/rust/Cargo.toml | 1 + 5 files changed, 82 insertions(+) create mode 100644 tests/Cargo.toml create mode 100644 tests/rust_minimal.rs diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5987e7a7..cf75eb26 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -138,3 +138,30 @@ if(${MATLAB_WRAPPER}) UNITTEST_FILE ${CMAKE_CURRENT_BINARY_DIR}/matlab_bindings.m WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) endif() + +if(${RUST_WRAPPER}) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Cargo.toml + ${CMAKE_CURRENT_BINARY_DIR}/Cargo.toml + COPYONLY) + set(RUST_TESTS + rust_minimal + ) + foreach(TEST ${RUST_TESTS}) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${TEST}.rs + ${CMAKE_CURRENT_BINARY_DIR}/${TEST}.rs + COPYONLY) + endforeach() + + add_custom_target( + rust_make_tests ALL + ${CMAKE_COMMAND} -E env RUSTFLAGS="-L${CMAKE_BINARY_DIR}/source/" cargo build --release + ) + add_dependencies(rust_make_tests rust_wrapper) + + foreach(TEST ${RUST_TESTS}) + add_test(NAME ${TEST} + COMMAND ${CMAKE_CURRENT_BINARY_DIR}/target/release/${TEST}) + set_tests_properties(${TEST} + PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/source/:$ENV{LD_LIBRARY_PATH}") + endforeach() +endif() diff --git a/tests/Cargo.toml b/tests/Cargo.toml new file mode 100644 index 00000000..4b336670 --- /dev/null +++ b/tests/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "moordyn-tests" +version = "0.1.0" +edition = "2018" +[[bin]] +name = "rust_minimal" +test = true +bench = false +path = "rust_minimal.rs" +[dependencies] +moordyn-sys = { path = "../wrappers/rust/" } diff --git a/tests/rust_minimal.rs b/tests/rust_minimal.rs new file mode 100644 index 00000000..98c8a0aa --- /dev/null +++ b/tests/rust_minimal.rs @@ -0,0 +1,42 @@ +extern crate moordyn; +use std::ffi::CString; +use std::os::raw::c_uint; + +fn main() { + let mut err: i32; + + let fpath = CString::new("Mooring/lines.txt").expect("CString::new failed"); + unsafe { + let system = moordyn::MoorDyn_Create(fpath.as_ptr()); + + let mut n_dof: u32 = 0; + err = moordyn::MoorDyn_NCoupledDOF(system, &mut n_dof as *mut c_uint); + assert_eq!(err, moordyn::MOORDYN_SUCCESS as i32); + assert_eq!(n_dof, 9); + + let mut x = vec![0.0; 9]; + let mut dx = vec![0.0; 9]; + for i in 1..=3 { + let point = moordyn::MoorDyn_GetPoint(system, i); + let mut pos = vec![0.0; 3]; + err = moordyn::MoorDyn_GetPointPos(point, pos.as_mut_ptr()); + assert_eq!(err, moordyn::MOORDYN_SUCCESS as i32); + let slc : usize = (i - 1) as usize; + x[slc..slc+3].clone_from_slice(&pos); + } + + let ln = x.len(); + println!("{ln}"); + err = moordyn::MoorDyn_Init(system, x.as_ptr(), dx.as_ptr()); + assert_eq!(err, moordyn::MOORDYN_SUCCESS as i32); + + let mut f = Vec::::with_capacity(9); + let mut t: f64 = 0.0; + let mut dt: f64 = 0.5; + err = moordyn::MoorDyn_Step(system, x.as_ptr(), dx.as_ptr(), f.as_mut_ptr(), &mut t as *mut f64, &mut dt as *mut f64); + assert_eq!(err, moordyn::MOORDYN_SUCCESS as i32); + + err = moordyn::MoorDyn_Close(system); + assert_eq!(err, moordyn::MOORDYN_SUCCESS as i32); + } +} diff --git a/wrappers/rust/CMakeLists.txt b/wrappers/rust/CMakeLists.txt index 23afa777..d5154e9c 100644 --- a/wrappers/rust/CMakeLists.txt +++ b/wrappers/rust/CMakeLists.txt @@ -3,6 +3,7 @@ add_custom_target( COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/Cargo.toml" "${CMAKE_CURRENT_BINARY_DIR}/Cargo.toml" COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/lib.rs" "${CMAKE_CURRENT_BINARY_DIR}/lib.rs" COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/build.rs" "${CMAKE_CURRENT_BINARY_DIR}/build.rs" + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/target/release/deps COMMAND ${CMAKE_COMMAND} -E create_symlink $ ${CMAKE_CURRENT_BINARY_DIR}/target/release/deps/$ COMMAND bindgen ${CMAKE_SOURCE_DIR}/source/MoorDyn2.h -o ${CMAKE_CURRENT_BINARY_DIR}/bindings.rs ) diff --git a/wrappers/rust/Cargo.toml b/wrappers/rust/Cargo.toml index 3cf135bf..33a49e23 100644 --- a/wrappers/rust/Cargo.toml +++ b/wrappers/rust/Cargo.toml @@ -7,6 +7,7 @@ edition = "2018" [lib] plugin = true path = "./lib.rs" +name = "moordyn" [dependencies] libc = "0.2" [build-dependencies] From b8f8a144cef76a67f9cb594e58aee884dd3d93bd Mon Sep 17 00:00:00 2001 From: Jose Luis Cercos-Pita Date: Mon, 13 Jan 2025 09:08:45 +0100 Subject: [PATCH 2/3] fix(ci): Run the Rust tests on Linux --- .github/workflows/build-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 0a447c5b..8fbafbf4 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -125,7 +125,7 @@ jobs: mkdir -p ${{github.workspace}}/install - name: Configure CMake (Linux) - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_INSTALL_PREFIX=${{github.workspace}}/install -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -DEXTERNAL_EIGEN:BOOL=OFF -DPYTHON_WRAPPER:BOOL=OFF -DFORTRAN_WRAPPER:BOOL=ON -DRUST_WRAPPER:BOOL=OFF -DUSE_VTK=ON -DBUILD_TESTING=ON + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_INSTALL_PREFIX=${{github.workspace}}/install -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -DEXTERNAL_EIGEN:BOOL=OFF -DPYTHON_WRAPPER:BOOL=OFF -DFORTRAN_WRAPPER:BOOL=ON -DRUST_WRAPPER:BOOL=ON -DUSE_VTK=ON -DBUILD_TESTING=ON if: runner.os == 'Linux' - name: Configure CMake (MacOS) From 2695899ead16f5d83f5d7d2728310e18114cc505 Mon Sep 17 00:00:00 2001 From: Jose Luis Cercos-Pita Date: Mon, 13 Jan 2025 09:29:32 +0100 Subject: [PATCH 3/3] No need for that println --- tests/rust_minimal.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/rust_minimal.rs b/tests/rust_minimal.rs index 98c8a0aa..2b8e5a0d 100644 --- a/tests/rust_minimal.rs +++ b/tests/rust_minimal.rs @@ -25,8 +25,6 @@ fn main() { x[slc..slc+3].clone_from_slice(&pos); } - let ln = x.len(); - println!("{ln}"); err = moordyn::MoorDyn_Init(system, x.as_ptr(), dx.as_ptr()); assert_eq!(err, moordyn::MOORDYN_SUCCESS as i32);