From 3ccc0d14a83181dca8cd7a647cec0e78ac6636b8 Mon Sep 17 00:00:00 2001 From: Sachin Pisal Date: Fri, 31 Jan 2025 09:58:26 -0800 Subject: [PATCH] Adding test_mocks for unittests Signed-off-by: Sachin Pisal --- runtime/cudaq/dynamics/cudm_time_stepper.cpp | 2 +- unittests/dynamics/test_cudm_time_stepper.cpp | 51 +++++-------------- unittests/dynamics/test_mocks.h | 33 ++++++++++++ 3 files changed, 47 insertions(+), 39 deletions(-) create mode 100644 unittests/dynamics/test_mocks.h diff --git a/runtime/cudaq/dynamics/cudm_time_stepper.cpp b/runtime/cudaq/dynamics/cudm_time_stepper.cpp index 90f1277f12..c803b9488b 100644 --- a/runtime/cudaq/dynamics/cudm_time_stepper.cpp +++ b/runtime/cudaq/dynamics/cudm_time_stepper.cpp @@ -45,7 +45,7 @@ cudm_state cudm_time_stepper::compute(cudm_state &state, double t, state.get_raw_data().size(), {0.0, 0.0}); cudm_state next_state(handle_, zero_initiailized_data, state.get_hilbert_space_dims()); - + if (!next_state.is_initialized()) { throw std::runtime_error("Next state failed to initialize."); } diff --git a/unittests/dynamics/test_cudm_time_stepper.cpp b/unittests/dynamics/test_cudm_time_stepper.cpp index 03807d99af..fbde6b089c 100644 --- a/unittests/dynamics/test_cudm_time_stepper.cpp +++ b/unittests/dynamics/test_cudm_time_stepper.cpp @@ -6,40 +6,23 @@ * the terms of the Apache License 2.0 which accompanies this distribution. * ******************************************************************************/ +#include "test_mocks.h" #include #include #include #include #include +#include +#include using namespace cudaq; -// Mock Liouvillian operator creation -cudensitymatOperator_t mock_liouvillian(cudensitymatHandle_t handle) { - cudensitymatOperator_t liouvillian; - std::vector dimensions = {2, 2}; - HANDLE_CUDM_ERROR(cudensitymatCreateOperator( - handle, static_cast(dimensions.size()), dimensions.data(), - &liouvillian)); - return liouvillian; -} - -// Mock Hilbert space dimensions -std::vector> mock_initial_state_data() { - return {{1.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}}; -} - -// Mock initial raw state data -std::vector mock_hilbert_space_dims() { return {2, 2}; } - class CuDensityMatTimeStepperTest : public ::testing::Test { protected: cudensitymatHandle_t handle_; cudensitymatOperator_t liouvillian_; - cudm_time_stepper *time_stepper_; - cudm_state *state_; - - // CuDensityMatTimeStepperTest() : state_(mock_initial_state_data()) {}; + std::unique_ptr time_stepper_; + std::unique_ptr state_; void SetUp() override { // Create library handle @@ -49,12 +32,10 @@ class CuDensityMatTimeStepperTest : public ::testing::Test { liouvillian_ = mock_liouvillian(handle_); // Initialize the time stepper - time_stepper_ = new cudm_time_stepper(handle_, liouvillian_); - - state_ = new cudm_state(handle_, mock_initial_state_data()); + time_stepper_ = std::make_unique(handle_, liouvillian_); - // Initialize the state - state_->init_state(mock_hilbert_space_dims()); + state_ = std::make_unique(handle_, mock_initial_state_data(), + mock_hilbert_space_dims()); ASSERT_TRUE(state_->is_initialized()); } @@ -63,17 +44,15 @@ class CuDensityMatTimeStepperTest : public ::testing::Test { // Clean up HANDLE_CUDM_ERROR(cudensitymatDestroyOperator(liouvillian_)); HANDLE_CUDM_ERROR(cudensitymatDestroy(handle_)); - delete time_stepper_; - delete state_; } }; // Test initialization of cudm_time_stepper -// TEST_F(CuDensityMatTimeStepperTest, Initialization) { -// ASSERT_NE(time_stepper_, nullptr); -// ASSERT_TRUE(state_->is_initialized()); -// ASSERT_FALSE(state_->is_density_matrix()); -// } +TEST_F(CuDensityMatTimeStepperTest, Initialization) { + ASSERT_NE(time_stepper_, nullptr); + ASSERT_TRUE(state_->is_initialized()); + ASSERT_FALSE(state_->is_density_matrix()); +} // Test a single compute step TEST_F(CuDensityMatTimeStepperTest, ComputeStep) { @@ -81,7 +60,3 @@ TEST_F(CuDensityMatTimeStepperTest, ComputeStep) { EXPECT_NO_THROW(time_stepper_->compute(*state_, 0.0, 1.0)); ASSERT_TRUE(state_->is_initialized()); } - -// // Add test to use construct_liouvillian and then use compute to step using -// this liouvillian -// // z0 * z1 diff --git a/unittests/dynamics/test_mocks.h b/unittests/dynamics/test_mocks.h new file mode 100644 index 0000000000..6b81e26d91 --- /dev/null +++ b/unittests/dynamics/test_mocks.h @@ -0,0 +1,33 @@ +/****************************************************************-*- C++ -*-**** + * Copyright (c) 2022 - 2025 NVIDIA Corporation & Affiliates. * + * All rights reserved. * + * * + * This source code and the accompanying materials are made available under * + * the terms of the Apache License 2.0 which accompanies this distribution. * + ******************************************************************************/ + +#pragma once + +#include +#include +#include +#include +#include + +// Mock Liouvillian operator creation +inline cudensitymatOperator_t mock_liouvillian(cudensitymatHandle_t handle) { + cudensitymatOperator_t liouvillian; + std::vector dimensions = {2, 2}; + HANDLE_CUDM_ERROR(cudensitymatCreateOperator( + handle, static_cast(dimensions.size()), dimensions.data(), + &liouvillian)); + return liouvillian; +} + +// Mock Hilbert space dimensions +inline std::vector> mock_initial_state_data() { + return {{1.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}}; +} + +// Mock initial raw state data +inline std::vector mock_hilbert_space_dims() { return {2, 2}; }