diff --git a/unittest/python/test_python_package.cpp b/unittest/python/test_python_package.cpp index 723271c589..137278a9d2 100644 --- a/unittest/python/test_python_package.cpp +++ b/unittest/python/test_python_package.cpp @@ -20,6 +20,7 @@ #include #include #include +#include // location of '*.py' files required by tests #define STRINGIFY(val) XSTR(val) @@ -43,86 +44,107 @@ protected: void command(const std::string &line) { lmp->input->one(line.c_str()); } + void HIDE_OUTPUT(std::function f) { + if (!verbose) ::testing::internal::CaptureStdout(); + f(); + if (!verbose) ::testing::internal::GetCapturedStdout(); + } + + std::string CAPTURE_OUTPUT(std::function f) { + ::testing::internal::CaptureStdout(); + f(); + auto output = ::testing::internal::GetCapturedStdout(); + if (verbose) std::cout << output; + return output; + } + void SetUp() override { const char *args[] = {"PythonPackageTest", "-log", "none", "-echo", "screen", "-nocite"}; char **argv = (char **)args; int argc = sizeof(args) / sizeof(char *); - if (!verbose) ::testing::internal::CaptureStdout(); - lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); - if (!verbose) ::testing::internal::GetCapturedStdout(); + HIDE_OUTPUT([&] { + lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD); + }); ASSERT_NE(lmp, nullptr); info = new Info(lmp); - if (!verbose) ::testing::internal::CaptureStdout(); - command("units real"); - command("dimension 3"); - command("region box block -4 4 -4 4 -4 4"); - command("create_box 1 box"); - command("create_atoms 1 single 0.0 0.0 0.0 units box"); - command("create_atoms 1 single 1.9 -1.9 1.9999 units box"); - command("pair_style zero 2.0"); - command("pair_coeff * *"); - command("mass * 1.0"); - command("variable input_dir index " + INPUT_FOLDER); - if (!verbose) ::testing::internal::GetCapturedStdout(); + if (!info->has_package("PYTHON")) GTEST_SKIP(); + HIDE_OUTPUT([&] { + command("units real"); + command("dimension 3"); + command("region box block -4 4 -4 4 -4 4"); + command("create_box 1 box"); + command("create_atoms 1 single 0.0 0.0 0.0 units box"); + command("create_atoms 1 single 1.9 -1.9 1.9999 units box"); + command("pair_style zero 2.0"); + command("pair_coeff * *"); + command("mass * 1.0"); + command("variable input_dir index " + INPUT_FOLDER); + }); } void TearDown() override { - if (!verbose) ::testing::internal::CaptureStdout(); - delete info; - delete lmp; - if (!verbose) ::testing::internal::GetCapturedStdout(); + HIDE_OUTPUT([&] { + delete info; + delete lmp; + info = nullptr; + lmp = nullptr; + }); } }; -TEST_F(PythonPackageTest, python_invoke) +TEST_F(PythonPackageTest, InvokeFunctionFromFile) { - if (!info->has_package("PYTHON")) GTEST_SKIP(); // execute python function from file - if (!verbose) ::testing::internal::CaptureStdout(); - command("python printnum file ${input_dir}/func.py"); - if (!verbose) ::testing::internal::GetCapturedStdout(); - ::testing::internal::CaptureStdout(); - command("python printnum invoke"); - std::string output = ::testing::internal::GetCapturedStdout(); - if (verbose) std::cout << output; + HIDE_OUTPUT([&] { + command("python printnum file ${input_dir}/func.py"); + }); + + auto output = CAPTURE_OUTPUT([&]() { + command("python printnum invoke"); + }); ASSERT_THAT(output, HasSubstr("2.25\n")); +} +TEST_F(PythonPackageTest, InvokeOtherFunctionFromFile) +{ // execute another python function from same file - if (!verbose) ::testing::internal::CaptureStdout(); - command("python printtxt exists"); - if (!verbose) ::testing::internal::GetCapturedStdout(); - ::testing::internal::CaptureStdout(); - command("python printtxt invoke"); - output = ::testing::internal::GetCapturedStdout(); - if (verbose) std::cout << output; - ASSERT_THAT(output, HasSubstr("sometext\n")); + HIDE_OUTPUT([&] { + command("python printnum file ${input_dir}/func.py"); + command("python printtxt exists"); + }); + auto output = CAPTURE_OUTPUT([&] { + command("python printtxt invoke"); + }); + ASSERT_THAT(output, HasSubstr("sometext\n")); +} + +TEST_F(PythonPackageTest, InvokeFunctionThatUsesLAMMPSModule) +{ // execute python function that uses the LAMMPS python module - if (!verbose) ::testing::internal::CaptureStdout(); - command("variable idx equal 2.25"); - command("python getidxvar input 1 SELF format p exists"); - if (!verbose) ::testing::internal::GetCapturedStdout(); - ::testing::internal::CaptureStdout(); - command("python getidxvar invoke"); - output = ::testing::internal::GetCapturedStdout(); - if (verbose) std::cout << output; + HIDE_OUTPUT([&] { + command("python printnum file ${input_dir}/func.py"); + command("variable idx equal 2.25"); + command("python getidxvar input 1 SELF format p exists"); + }); + auto output = CAPTURE_OUTPUT([&] { + command("python getidxvar invoke"); + }); ASSERT_THAT(output, HasSubstr("2.25\n")); } TEST_F(PythonPackageTest, python_variable) { - if (!info->has_package("PYTHON")) GTEST_SKIP(); - if (!verbose) ::testing::internal::CaptureStdout(); - command("variable sq python square"); - command("variable val index 1.5"); - command("python square input 1 v_val return v_sq format ff file ${input_dir}/func.py"); - if (!verbose) ::testing::internal::GetCapturedStdout(); - ::testing::internal::CaptureStdout(); - command("print \"${sq}\""); - std::string output = ::testing::internal::GetCapturedStdout(); - if (verbose) std::cout << output; + HIDE_OUTPUT([&] { + command("variable sq python square"); + command("variable val index 1.5"); + command("python square input 1 v_val return v_sq format ff file ${input_dir}/func.py"); + }); + std::string output = CAPTURE_OUTPUT([&] { + command("print \"${sq}\""); + }); ASSERT_THAT(output, MatchesRegex("print.*2.25.*")); }