From 4eaf268eb538f1f4c3f88267d2923871e80b22fa Mon Sep 17 00:00:00 2001 From: lyndskg Date: Thu, 28 Dec 2023 08:35:49 -0500 Subject: [PATCH] Figuring out how to better organize CMakeLists.txt files esp w/ Google Test; beginning to try to write unit tests --- CMakeLists.txt | 331 +++----------------------------- gtest/CMakeLists.txt | 31 ++- main.cpp => src/main.cpp | 12 +- test/test_blackScholesModel.cpp | 18 ++ 4 files changed, 75 insertions(+), 317 deletions(-) rename main.cpp => src/main.cpp (90%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c4b331..347ca55 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,35 +1,16 @@ # Top-level CMakeLists.txt -# Download and unpack Google Test at configure time -configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt) -execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download ) -if(result) - message(FATAL_ERROR "CMake step for googletest failed: ${result}") -endif() -execute_process(COMMAND ${CMAKE_COMMAND} --build . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download ) -if(result) - message(FATAL_ERROR "Build step for googletest failed: ${result}") -endif() - -# Prevent overriding the parent project's compiler/linker settings -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) - -# Add googletest directly to our build. This adds the following targets: gtest, gtest_main, gmock, gmock_main -add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googletest-src - ${CMAKE_CURRENT_BINARY_DIR}/googletest-build - EXCLUDE_FROM_ALL) - +# Set the minimum required version of CMake cmake_minimum_required(VERSION 3.14) -project(black-scholes-cpp) -# GoogleTest requires at least C++14 +# Project configuration +project(black-scholes-cpp VERSION 1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) +# Download and unpack Google Test at configure time +# (Your existing Google Test configuration) + # Add the gtest directory add_subdirectory(gtest) @@ -45,288 +26,22 @@ include_directories(include/third_party) include_directories(docs) # Add the main executable -add_executable(black_scholes_cpp main.cpp) +add_executable(black_scholes_cpp src/main.cpp) # Link libraries if necessary (e.g., libcurl, OneMKL) -target_link_libraries(black_scholes_cpp curl OneMKL blackScholesLibrary) - - -# Now simply link against gtest or gtest_main as needed. Eg -add_executable(bs blackScholesModel.cpp Program.cpp inputReader.cpp OutputWriter.cpp optionGreeks.cpp optionGreeksModel.cpp hestonModel.cpp) -target_link_libraries(example gtest_main) -add_test(NAME example_test COMMAND example) - -######################################################################## -# -# CMake build script for Google Test. -# -# To run the tests for Google Test itself on Linux, use 'make test' or -# ctest. You can select which tests to run using 'ctest -R regex'. -# For more options, run 'ctest --help'. - -include(FetchContent) -FetchContent_Declare( - googletest - # Specify the commit you depend on and update it regularly. - URL https://github.com/google/googletest/archive/5376968f6948923e2411081fd9372e71a59d8e77.zip -) - -target_link_libraries(example gtest_main) -add_test(NAME example_test COMMAND example) - - -# When other libraries are using a shared version of runtime libraries, -# Google Test also has to use one. -option( - gtest_force_shared_crt - "Use shared (DLL) run-time lib even when Google Test is built as static lib." - OFF) - -option(gtest_build_tests "Build all of gtest's own tests." OFF) - -option(gtest_build_samples "Build gtest's sample programs." OFF) - -option(gtest_disable_pthreads "Disable uses of pthreads in gtest." OFF) - -option( - gtest_hide_internal_symbols - "Build gtest with internal symbols hidden in shared libraries." - OFF) - -# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build(). -include(cmake/hermetic_build.cmake OPTIONAL) - -if (COMMAND pre_project_set_up_hermetic_build) - pre_project_set_up_hermetic_build() -endif() - -######################################################################## -# -# Project-wide settings - -# Name of the project. -# -# CMake files in this project can refer to the root source directory -# as ${gtest_SOURCE_DIR} and to the root binary directory as -# ${gtest_BINARY_DIR}. -# Language "C" is required for find_package(Threads). - -# Project version: - -cmake_minimum_required(VERSION 3.14) -project(gtest VERSION ${GOOGLETEST_VERSION} LANGUAGES CXX C) - -if (COMMAND set_up_hermetic_build) - set_up_hermetic_build() -endif() - - -# These commands only run if this is the main project -if(CMAKE_PROJECT_NAME STREQUAL "gtest" OR CMAKE_PROJECT_NAME STREQUAL "googletest-distribution") - - # BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to - # make it prominent in the GUI. - option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF) - -else() - - mark_as_advanced( - gtest_force_shared_crt - gtest_build_tests - gtest_build_samples - gtest_disable_pthreads - gtest_hide_internal_symbols) - -endif() - - -if (gtest_hide_internal_symbols) - set(CMAKE_CXX_VISIBILITY_PRESET hidden) - set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) -endif() - -# Define helper functions and macros used by Google Test. -include(cmake/internal_utils.cmake) - -config_compiler_and_linker() # Defined in internal_utils.cmake. - -# Needed to set the namespace for both the export targets and the -# alias libraries -set(cmake_package_name GTest CACHE INTERNAL "") - -# Create the CMake package file descriptors. -if (INSTALL_GTEST) - include(CMakePackageConfigHelpers) - set(targets_export_name ${cmake_package_name}Targets CACHE INTERNAL "") - set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated" CACHE INTERNAL "") - set(cmake_files_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${cmake_package_name}") - set(version_file "${generated_dir}/${cmake_package_name}ConfigVersion.cmake") - write_basic_package_version_file(${version_file} VERSION ${GOOGLETEST_VERSION} COMPATIBILITY AnyNewerVersion) - install(EXPORT ${targets_export_name} - COMPONENT "${PROJECT_NAME}" - NAMESPACE ${cmake_package_name}:: - DESTINATION ${cmake_files_install_dir}) - set(config_file "${generated_dir}/${cmake_package_name}Config.cmake") - configure_package_config_file("${gtest_SOURCE_DIR}/cmake/Config.cmake.in" - "${config_file}" INSTALL_DESTINATION ${cmake_files_install_dir}) - install(FILES ${version_file} ${config_file} - COMPONENT "${PROJECT_NAME}" - DESTINATION ${cmake_files_install_dir}) -endif() - -# Where Google Test's .h files can be found. -set(gtest_build_include_dirs - "${gtest_SOURCE_DIR}/include" - "${gtest_SOURCE_DIR}") -include_directories(${gtest_build_include_dirs}) -include_directories(~/Downloads/googletest-main/googletest/include) - -######################################################################## -# -# Defines the gtest & gtest_main libraries. User tests should link -# with one of them. - -# Google Test libraries. We build them using more strict warnings than what -# are used for other targets, to ensure that gtest can be compiled by a user -# aggressive about warnings. -cxx_library(gtest "${cxx_strict}" src/gtest-all.cc) -set_target_properties(gtest PROPERTIES VERSION ${GOOGLETEST_VERSION}) -if(GTEST_HAS_ABSL) - target_compile_definitions(gtest PUBLIC GTEST_HAS_ABSL=1) - target_link_libraries(gtest PUBLIC - absl::failure_signal_handler - absl::stacktrace - absl::symbolize - absl::flags_parse - absl::flags_reflection - absl::flags_usage - absl::strings - absl::any - absl::optional - absl::variant - re2::re2 - ) -endif() -cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc) -set_target_properties(gtest_main PROPERTIES VERSION ${GOOGLETEST_VERSION}) -string(REPLACE ";" "$" dirs "${gtest_build_include_dirs}") -target_include_directories(gtest SYSTEM INTERFACE - "$" - "$/${CMAKE_INSTALL_INCLUDEDIR}>") -target_include_directories(gtest_main SYSTEM INTERFACE - "$" - "$/${CMAKE_INSTALL_INCLUDEDIR}>") -if(CMAKE_SYSTEM_NAME MATCHES "QNX") - target_link_libraries(gtest PUBLIC regex) -endif() -target_link_libraries(gtest_main PUBLIC gtest) - -######################################################################## -# -# Install rules -install_project(gtest gtest_main) - -######################################################################## -# -# Samples on how to link user tests with gtest or gtest_main. -# -# They are not built by default. To build them, set the -# gtest_build_samples option to ON. You can do it by running ccmake -# or specifying the -Dgtest_build_samples=ON flag when running cmake. - -if (gtest_build_samples) - cxx_executable(sample1_unittest samples gtest_main samples/sample1.cc) - cxx_executable(sample2_unittest samples gtest_main samples/sample2.cc) - cxx_executable(sample3_unittest samples gtest_main) - cxx_executable(sample4_unittest samples gtest_main samples/sample4.cc) - cxx_executable(sample5_unittest samples gtest_main samples/sample1.cc) - cxx_executable(sample6_unittest samples gtest_main) - cxx_executable(sample7_unittest samples gtest_main) - cxx_executable(sample8_unittest samples gtest_main) - cxx_executable(sample9_unittest samples gtest) - cxx_executable(sample10_unittest samples gtest) -endif() - -######################################################################## -# -# Google Test's own tests. -# -# You can skip this section if you aren't interested in testing -# Google Test itself. -# -# The tests are not built by default. To build them, set the -# gtest_build_tests option to ON. You can do it by running ccmake -# or specifying the -Dgtest_build_tests=ON flag when running cmake. - -if (gtest_build_tests) - # This must be set in the root directory for the tests to be run by - # 'make test' or ctest. - enable_testing() - - ############################################################ - # C++ tests built with standard compiler flags. - - cxx_test(googletest-death-test-test gtest_main) - cxx_test(gtest_environment_test gtest) - cxx_test(googletest-filepath-test gtest_main) - cxx_test(googletest-listener-test gtest_main) - cxx_test(gtest_main_unittest gtest_main) - cxx_test(googletest-message-test gtest_main) - cxx_test(gtest_no_test_unittest gtest) - cxx_test(googletest-options-test gtest_main) - cxx_test(googletest-param-test-test gtest - test/googletest-param-test2-test.cc) - cxx_test(googletest-port-test gtest_main) - cxx_test(gtest_pred_impl_unittest gtest_main) - cxx_test(gtest_premature_exit_test gtest - test/gtest_premature_exit_test.cc) - cxx_test(googletest-printers-test gtest_main) - cxx_test(gtest_prod_test gtest_main - test/production.cc) - cxx_test(gtest_repeat_test gtest) - cxx_test(gtest_sole_header_test gtest_main) - cxx_test(gtest_stress_test gtest) - cxx_test(googletest-test-part-test gtest_main) - cxx_test(gtest_throw_on_failure_ex_test gtest) - cxx_test(gtest-typed-test_test gtest_main - test/gtest-typed-test2_test.cc) - cxx_test(gtest_unittest gtest_main) - cxx_test(gtest-unittest-api_test gtest) - cxx_test(gtest_skip_in_environment_setup_test gtest_main) - cxx_test(gtest_skip_test gtest_main) - - ############################################################ - # C++ tests built with non-standard compiler flags. - - # MSVC 7.1 does not support STL with exceptions disabled. - if (NOT MSVC OR MSVC_VERSION GREATER 1310) - cxx_library(gtest_no_exception "${cxx_no_exception}" - src/gtest-all.cc) - cxx_library(gtest_main_no_exception "${cxx_no_exception}" - src/gtest-all.cc src/gtest_main.cc) - endif() - cxx_library(gtest_main_no_rtti "${cxx_no_rtti}" - src/gtest-all.cc src/gtest_main.cc) - - cxx_test_with_flags(gtest-death-test_ex_nocatch_test - "${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=0" - gtest test/googletest-death-test_ex_test.cc) - cxx_test_with_flags(gtest-death-test_ex_catch_test - "${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=1" - gtest test/googletest-death-test_ex_test.cc) - - cxx_test_with_flags(gtest_no_rtti_unittest "${cxx_no_rtti}" - gtest_main_no_rtti test/gtest_unittest.cc) - - cxx_shared_library(gtest_dll "${cxx_default}" - src/gtest-all.cc src/gtest_main.cc) - - cxx_executable_with_flags(gtest_dll_test_ "${cxx_default}" - gtest_dll test/gtest_all_test.cc) - set_target_properties(gtest_dll_test_ - PROPERTIES - COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1") -endif() - - - +target_link_libraries(black_scholes_cpp curl OneMKL blackScholesLibrary gtest_main) + +# Add your other targets and configurations... + +# Unit tests +add_executable(bs + src/blackScholesModel.cpp + src/Program.cpp + src/inputReader.cpp + src/outputWriter.cpp + src/optionGreeks.cpp + src/optionGreeksModel.cpp + src/hestonModel.cpp) + +target_link_libraries(bs gtest_main) +add_test(NAME bs_test COMMAND bs) diff --git a/gtest/CMakeLists.txt b/gtest/CMakeLists.txt index 6e5c12c..c4a2b30 100644 --- a/gtest/CMakeLists.txt +++ b/gtest/CMakeLists.txt @@ -3,12 +3,37 @@ # Locate the Google Test library find_package(GTest REQUIRED) +# Add your gtest files +# Specify the list of source files for your Google Test executable. +set(TEST_SOURCES + test_blackScholesModel.cpp + test_Program.cpp + test_inputReader.cpp + test_outputWriter.cpp + test_optionGreeks.cpp + test_optionGreeksModel.cpp + # Add more test files if needed +) + # Add the gtest executable -add_executable(run_tests_gtest your_gtest_files.cpp) +# Create an executable named 'run_tests_gtest' using the specified test source files. +add_executable(run_tests_gtest ${TEST_SOURCES}) # Link the test executable against Google Test -target_link_libraries(run_tests_gtest GTest::GTest GTest::Main) +# Specify the libraries to link against for the 'run_tests_gtest' executable. +target_link_libraries(run_tests_gtest PRIVATE gtest gtest_main) # Set up Google Test +# Enable testing for the project. enable_testing() -add_test(run_tests_gtest run_tests_gtest) + +# Add a test with a name and the command to run the executable +# Define a test with the name 'run_tests_gtest' that runs the 'run_tests_gtest' executable. +add_test(NAME run_tests_gtest COMMAND run_tests_gtest) + +# Optionally, enable CTest for running tests with 'make test' +# Include the GoogleTest module for integration with CTest. +include(GoogleTest) + +# Discover tests using Google Test. +gtest_discover_tests(run_tests_gtest) diff --git a/main.cpp b/src/main.cpp similarity index 90% rename from main.cpp rename to src/main.cpp index de8b4cb..9972e93 100644 --- a/main.cpp +++ b/src/main.cpp @@ -8,13 +8,13 @@ #include #include -#include "include/black-scholes-cpp/Program.h" -#include "include/black-scholes-cpp/inputReader.h" -#include "include/black-scholes-cpp/blackScholesModel.h" -#include "include/black-scholes-cpp/optionGreeks.h" -#include "include/black-scholes-cpp/optionGreeksModel.h" +#include "../include/black-scholes-cpp/Program.h" +#include "../include/black-scholes-cpp/inputReader.h" +#include "../include/black-scholes-cpp/blackScholesModel.h" +#include "../include/black-scholes-cpp/optionGreeks.h" +#include "../include/black-scholes-cpp/optionGreeksModel.h" -#include "xcode_redirect.hpp" +#include "../xcode_redirect.hpp" using namespace std; diff --git a/test/test_blackScholesModel.cpp b/test/test_blackScholesModel.cpp index e69bc6a..939813d 100644 --- a/test/test_blackScholesModel.cpp +++ b/test/test_blackScholesModel.cpp @@ -16,3 +16,21 @@ using namespace std; +// Test the default constructor of blackScholesModel +TEST(blackScholesModelTest, DefaultConstructor) { +// Arrange +blackScholesModel model; + +// Act (no action needed for a constructor) + +// Assert +EXPECT_EQ(0.0, model.getUnderlyingPrice()); +EXPECT_EQ(0.0, model.getStrikePrice()); +EXPECT_EQ(0.0, model.getRiskFreeRate()); +EXPECT_EQ(0.0, model.getTimeToExpiration()); +EXPECT_EQ(0.0, model.getVolatility()); +EXPECT_EQ(OptionType::CALL, model.getOptionType()); +} + +// Add more tests as needed +