update c-library tests

This commit is contained in:
Axel Kohlmeyer
2020-09-13 17:00:26 -04:00
parent de49325c0f
commit a2fc33b419
3 changed files with 138 additions and 109 deletions

View File

@ -1,103 +1,121 @@
// unit tests for issuing command to a LAMMPS instance through the library interface // unit tests for issuing command to a LAMMPS instance through the library interface
#include "library.h"
#include "lammps.h" #include "lammps.h"
#include "library.h"
#include <string> #include <string>
#include "gmock/gmock.h"
#include "gtest/gtest.h" #include "gtest/gtest.h"
const char *demo_input[] = { #include "test_main.h"
"region box block 0 $x 0 2 0 2",
"create_box 1 box",
"create_atoms 1 single 1.0 1.0 ${zpos}" };
const char *cont_input[] = {
"create_atoms 1 single &",
"0.2 0.1 0.1" };
class LAMMPS_commands : public ::testing::Test using ::testing::HasSubstr;
{ using ::testing::StartsWith;
const char *demo_input[] = {"region box block 0 $x 0 2 0 2", "create_box 1 box",
"create_atoms 1 single 1.0 1.0 ${zpos}"};
const char *cont_input[] = {"create_atoms 1 single &", "0.2 0.1 0.1"};
class LAMMPS_commands : public ::testing::Test {
protected: protected:
void *lmp; void *lmp;
LAMMPS_commands() {}; LAMMPS_commands(){};
~LAMMPS_commands() override {}; ~LAMMPS_commands() override{};
void SetUp() override
{
const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite",
"-var", "x", "2", "-var", "zpos", "1.5"};
void SetUp() override {
const char *args[] = {"LAMMPS_test",
"-log", "none",
"-echo", "screen",
"-nocite", "-var","x","2",
"-var", "zpos", "1.5"};
char **argv = (char **)args; char **argv = (char **)args;
int argc = sizeof(args)/sizeof(char *); int argc = sizeof(args) / sizeof(char *);
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
lmp = lammps_open_no_mpi(argc, argv, NULL); lmp = lammps_open_no_mpi(argc, argv, NULL);
std::string output = ::testing::internal::GetCapturedStdout(); std::string output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.substr(0,8).c_str(), "LAMMPS ("); if (verbose) std::cout << output;
EXPECT_THAT(output, StartsWith("LAMMPS ("));
} }
void TearDown() override { void TearDown() override
{
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
lammps_close(lmp); lammps_close(lmp);
std::string output = ::testing::internal::GetCapturedStdout(); std::string output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:"); EXPECT_THAT(output, HasSubstr("Total wall time:"));
if (verbose) std::cout << output;
lmp = nullptr; lmp = nullptr;
} }
}; };
TEST_F(LAMMPS_commands, from_file) { TEST_F(LAMMPS_commands, from_file)
{
FILE *fp; FILE *fp;
const char demo_file[] = "in.test"; const char demo_file[] = "in.test";
const char cont_file[] = "in.cont"; const char cont_file[] = "in.cont";
fp = fopen(demo_file,"w"); fp = fopen(demo_file, "w");
for (unsigned int i=0; i < sizeof(demo_input)/sizeof(char *); ++i) { for (unsigned int i = 0; i < sizeof(demo_input) / sizeof(char *); ++i) {
fputs(demo_input[i],fp); fputs(demo_input[i], fp);
fputc('\n',fp); fputc('\n', fp);
} }
fclose(fp); fclose(fp);
fp = fopen(cont_file,"w"); fp = fopen(cont_file, "w");
for (unsigned int i=0; i < sizeof(cont_input)/sizeof(char *); ++i) { for (unsigned int i = 0; i < sizeof(cont_input) / sizeof(char *); ++i) {
fputs(cont_input[i],fp); fputs(cont_input[i], fp);
fputc('\n',fp); fputc('\n', fp);
} }
fclose(fp); fclose(fp);
EXPECT_EQ(lammps_get_natoms(lmp),0); EXPECT_EQ(lammps_get_natoms(lmp), 0);
lammps_file(lmp,demo_file); if (!verbose) ::testing::internal::CaptureStdout();
lammps_file(lmp,cont_file); lammps_file(lmp, demo_file);
EXPECT_EQ(lammps_get_natoms(lmp),2); if (!verbose) ::testing::internal::GetCapturedStdout();
EXPECT_EQ(lammps_get_natoms(lmp), 1);
if (!verbose) ::testing::internal::CaptureStdout();
lammps_file(lmp, cont_file);
if (!verbose) ::testing::internal::GetCapturedStdout();
EXPECT_EQ(lammps_get_natoms(lmp), 2);
unlink(demo_file); unlink(demo_file);
unlink(cont_file); unlink(cont_file);
}; };
TEST_F(LAMMPS_commands, from_line) { TEST_F(LAMMPS_commands, from_line)
EXPECT_EQ(lammps_get_natoms(lmp),0); {
for (unsigned int i=0; i < sizeof(demo_input)/sizeof(char *); ++i) { EXPECT_EQ(lammps_get_natoms(lmp), 0);
lammps_command(lmp,demo_input[i]); if (!verbose) ::testing::internal::CaptureStdout();
for (unsigned int i = 0; i < sizeof(demo_input) / sizeof(char *); ++i) {
lammps_command(lmp, demo_input[i]);
} }
EXPECT_EQ(lammps_get_natoms(lmp),1); if (!verbose) ::testing::internal::GetCapturedStdout();
EXPECT_EQ(lammps_get_natoms(lmp), 1);
}; };
TEST_F(LAMMPS_commands, from_list) { TEST_F(LAMMPS_commands, from_list)
EXPECT_EQ(lammps_get_natoms(lmp),0); {
lammps_commands_list(lmp,sizeof(demo_input)/sizeof(char *),demo_input); EXPECT_EQ(lammps_get_natoms(lmp), 0);
lammps_commands_list(lmp,sizeof(cont_input)/sizeof(char *),cont_input); if (!verbose) ::testing::internal::CaptureStdout();
EXPECT_EQ(lammps_get_natoms(lmp),2); lammps_commands_list(lmp, sizeof(demo_input) / sizeof(char *), demo_input);
lammps_commands_list(lmp, sizeof(cont_input) / sizeof(char *), cont_input);
if (!verbose) ::testing::internal::GetCapturedStdout();
EXPECT_EQ(lammps_get_natoms(lmp), 2);
}; };
TEST_F(LAMMPS_commands, from_string) { TEST_F(LAMMPS_commands, from_string)
{
std::string cmds(""); std::string cmds("");
for (unsigned int i=0; i < sizeof(demo_input)/sizeof(char *); ++i) { for (unsigned int i = 0; i < sizeof(demo_input) / sizeof(char *); ++i) {
cmds += demo_input[i]; cmds += demo_input[i];
cmds += "\n"; cmds += "\n";
} }
for (unsigned int i=0; i < sizeof(cont_input)/sizeof(char *); ++i) { for (unsigned int i = 0; i < sizeof(cont_input) / sizeof(char *); ++i) {
cmds += cont_input[i]; cmds += cont_input[i];
cmds += "\n"; cmds += "\n";
} }
EXPECT_EQ(lammps_get_natoms(lmp),0); EXPECT_EQ(lammps_get_natoms(lmp), 0);
lammps_commands_string(lmp,cmds.c_str()); if (!verbose) ::testing::internal::CaptureStdout();
EXPECT_EQ(lammps_get_natoms(lmp),2); lammps_commands_string(lmp, cmds.c_str());
if (!verbose) ::testing::internal::GetCapturedStdout();
EXPECT_EQ(lammps_get_natoms(lmp), 2);
}; };

View File

@ -1,21 +1,29 @@
// unit tests for the LAMMPS base class // unit tests creating LAMMPS instances via the library interface
#include "library.h"
#include "lammps.h" #include "lammps.h"
#include "library.h"
#include <cstdio> // for stdin, stdout
#include <mpi.h> #include <mpi.h>
#include <cstdio> // for stdin, stdout
#include <string> #include <string>
#include "gmock/gmock.h"
#include "gtest/gtest.h" #include "gtest/gtest.h"
TEST(lammps_open, null_args) { #include "test_main.h"
using ::testing::HasSubstr;
using ::testing::StartsWith;
TEST(lammps_open, null_args)
{
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
void *handle = lammps_open(0,NULL, MPI_COMM_WORLD, NULL); void *handle = lammps_open(0, NULL, MPI_COMM_WORLD, NULL);
std::string output = ::testing::internal::GetCapturedStdout(); std::string output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.substr(0,6).c_str(),"LAMMPS"); EXPECT_THAT(output, StartsWith("LAMMPS ("));
int mpi_init=0; if (verbose) std::cout << output;
int mpi_init = 0;
MPI_Initialized(&mpi_init); MPI_Initialized(&mpi_init);
EXPECT_GT(mpi_init,0); EXPECT_GT(mpi_init, 0);
LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle; LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle;
EXPECT_EQ(lmp->world, MPI_COMM_WORLD); EXPECT_EQ(lmp->world, MPI_COMM_WORLD);
EXPECT_EQ(lmp->infile, stdin); EXPECT_EQ(lmp->infile, stdin);
@ -24,25 +32,26 @@ TEST(lammps_open, null_args) {
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
lammps_close(handle); lammps_close(handle);
output = ::testing::internal::GetCapturedStdout(); output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:"); EXPECT_THAT(output, HasSubstr("Total wall time:"));
if (verbose) std::cout << output;
} }
TEST(lammps_open, with_args) { TEST(lammps_open, with_args)
const char *args[] = {"liblammps", {
"-log", "none", const char *args[] = {"liblammps", "-log", "none", "-nocite"};
"-nocite"}; char **argv = (char **)args;
char **argv = (char **)args; int argc = sizeof(args) / sizeof(char *);
int argc = sizeof(args)/sizeof(char *);
// MPI is already initialized // MPI is already initialized
MPI_Comm mycomm; MPI_Comm mycomm;
MPI_Comm_split(MPI_COMM_WORLD, 0, 1, &mycomm); MPI_Comm_split(MPI_COMM_WORLD, 0, 1, &mycomm);
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
void *alt_ptr; void *alt_ptr;
void *handle = lammps_open(argc, argv, mycomm, &alt_ptr); void *handle = lammps_open(argc, argv, mycomm, &alt_ptr);
std::string output = ::testing::internal::GetCapturedStdout(); std::string output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.substr(0,6).c_str(),"LAMMPS"); EXPECT_THAT(output, StartsWith("LAMMPS ("));
EXPECT_EQ(handle,alt_ptr); if (verbose) std::cout << output;
EXPECT_EQ(handle, alt_ptr);
LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle; LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle;
// MPI STUBS uses no real communicators // MPI STUBS uses no real communicators
@ -60,24 +69,24 @@ TEST(lammps_open, with_args) {
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
lammps_close(handle); lammps_close(handle);
output = ::testing::internal::GetCapturedStdout(); output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:"); EXPECT_THAT(output, HasSubstr("Total wall time:"));
if (verbose) std::cout << output;
} }
TEST(lammps_open, with_kokkos) { TEST(lammps_open, with_kokkos)
{
if (!LAMMPS_NS::LAMMPS::is_installed_pkg("KOKKOS")) GTEST_SKIP(); if (!LAMMPS_NS::LAMMPS::is_installed_pkg("KOKKOS")) GTEST_SKIP();
const char *args[] = {"liblammps", const char *args[] = {"liblammps", "-k", "on", "t", "2", "-sf", "kk", "-log", "none"};
"-k", "on", "t", "2", char **argv = (char **)args;
"-sf", "kk", int argc = sizeof(args) / sizeof(char *);
"-log", "none" };
char **argv = (char **)args;
int argc = sizeof(args)/sizeof(char *);
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
void *alt_ptr; void *alt_ptr;
void *handle = lammps_open(argc, argv, MPI_COMM_WORLD, &alt_ptr); void *handle = lammps_open(argc, argv, MPI_COMM_WORLD, &alt_ptr);
std::string output = ::testing::internal::GetCapturedStdout(); std::string output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.substr(0,6).c_str(),"LAMMPS"); EXPECT_THAT(output, StartsWith("LAMMPS ("));
EXPECT_EQ(handle,alt_ptr); if (verbose) std::cout << output;
EXPECT_EQ(handle, alt_ptr);
LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle; LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle;
EXPECT_EQ(lmp->world, MPI_COMM_WORLD); EXPECT_EQ(lmp->world, MPI_COMM_WORLD);
@ -91,23 +100,22 @@ TEST(lammps_open, with_kokkos) {
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
lammps_close(handle); lammps_close(handle);
output = ::testing::internal::GetCapturedStdout(); output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:"); EXPECT_THAT(output, HasSubstr("Total wall time:"));
if (verbose) std::cout << output;
} }
TEST(lammps_open_no_mpi, no_screen) { TEST(lammps_open_no_mpi, no_screen)
const char *args[] = {"liblammps", {
"-log", "none", const char *args[] = {"liblammps", "-log", "none", "-screen", "none", "-nocite"};
"-screen", "none", char **argv = (char **)args;
"-nocite"}; int argc = sizeof(args) / sizeof(char *);
char **argv = (char **)args;
int argc = sizeof(args)/sizeof(char *);
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
void *alt_ptr; void *alt_ptr;
void *handle = lammps_open_no_mpi(argc, argv, &alt_ptr); void *handle = lammps_open_no_mpi(argc, argv, &alt_ptr);
std::string output = ::testing::internal::GetCapturedStdout(); std::string output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.c_str(),""); EXPECT_STREQ(output.c_str(), "");
EXPECT_EQ(handle,alt_ptr); EXPECT_EQ(handle, alt_ptr);
LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle; LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle;
EXPECT_EQ(lmp->world, MPI_COMM_WORLD); EXPECT_EQ(lmp->world, MPI_COMM_WORLD);
@ -125,22 +133,21 @@ TEST(lammps_open_no_mpi, no_screen) {
EXPECT_STREQ(output.c_str(), ""); EXPECT_STREQ(output.c_str(), "");
} }
TEST(lammps_open_no_mpi, with_omp) { TEST(lammps_open_no_mpi, with_omp)
{
if (!LAMMPS_NS::LAMMPS::is_installed_pkg("USER-OMP")) GTEST_SKIP(); if (!LAMMPS_NS::LAMMPS::is_installed_pkg("USER-OMP")) GTEST_SKIP();
const char *args[] = {"liblammps", const char *args[] = {"liblammps", "-pk", "omp", "2", "neigh", "no",
"-pk", "omp", "2", "neigh", "no", "-sf", "omp", "-log", "none", "-nocite"};
"-sf", "omp", char **argv = (char **)args;
"-log", "none", int argc = sizeof(args) / sizeof(char *);
"-nocite"};
char **argv = (char **)args;
int argc = sizeof(args)/sizeof(char *);
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
void *alt_ptr; void *alt_ptr;
void *handle = lammps_open_no_mpi(argc, argv, &alt_ptr); void *handle = lammps_open_no_mpi(argc, argv, &alt_ptr);
std::string output = ::testing::internal::GetCapturedStdout(); std::string output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.substr(0,6).c_str(),"LAMMPS"); EXPECT_THAT(output, StartsWith("LAMMPS ("));
EXPECT_EQ(handle,alt_ptr); if (verbose) std::cout << output;
EXPECT_EQ(handle, alt_ptr);
LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle; LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle;
EXPECT_EQ(lmp->world, MPI_COMM_WORLD); EXPECT_EQ(lmp->world, MPI_COMM_WORLD);
@ -155,18 +162,21 @@ TEST(lammps_open_no_mpi, with_omp) {
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
lammps_close(handle); lammps_close(handle);
output = ::testing::internal::GetCapturedStdout(); output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:"); EXPECT_THAT(output, HasSubstr("Total wall time:"));
if (verbose) std::cout << output;
} }
TEST(lammps_open_fortran, no_args) { TEST(lammps_open_fortran, no_args)
{
// MPI is already initialized // MPI is already initialized
MPI_Comm mycomm; MPI_Comm mycomm;
MPI_Comm_split(MPI_COMM_WORLD, 0, 1, &mycomm); MPI_Comm_split(MPI_COMM_WORLD, 0, 1, &mycomm);
int fcomm = MPI_Comm_c2f(mycomm); int fcomm = MPI_Comm_c2f(mycomm);
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
void *handle = lammps_open_fortran(0, NULL, fcomm); void *handle = lammps_open_fortran(0, NULL, fcomm);
std::string output = ::testing::internal::GetCapturedStdout(); std::string output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.substr(0,6).c_str(),"LAMMPS"); EXPECT_THAT(output, StartsWith("LAMMPS ("));
if (verbose) std::cout << output;
LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle; LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle;
// MPI STUBS uses no real communicators // MPI STUBS uses no real communicators
@ -182,5 +192,6 @@ TEST(lammps_open_fortran, no_args) {
::testing::internal::CaptureStdout(); ::testing::internal::CaptureStdout();
lammps_close(handle); lammps_close(handle);
output = ::testing::internal::GetCapturedStdout(); output = ::testing::internal::GetCapturedStdout();
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:"); EXPECT_THAT(output, HasSubstr("Total wall time:"));
if (verbose) std::cout << output;
} }

View File

@ -1,7 +1,7 @@
// unit tests for checking and changing simulation properties through the library interface // unit tests for checking and changing simulation properties through the library interface
#include "lammps.h"
#include "library.h" #include "library.h"
#include "lammps.h"
#include <string> #include <string>
#include "gmock/gmock.h" #include "gmock/gmock.h"