diff --git a/unittest/commands/test_variables.cpp b/unittest/commands/test_variables.cpp index f31959c3ff..663a2a78a1 100644 --- a/unittest/commands/test_variables.cpp +++ b/unittest/commands/test_variables.cpp @@ -105,8 +105,8 @@ protected: "# comments only\n five\n#END\n", fp); fclose(fp); - fp = fopen("test_variable.atomfile", "w"); + fp = fopen("test_variable.atomfile", "w"); fputs("# test file for atomfile style variable\n\n" "4 # four lines\n4 0.5 #with comment\n" "2 -0.5 \n3 1.5\n1 -1.5\n\n" diff --git a/unittest/formats/CMakeLists.txt b/unittest/formats/CMakeLists.txt index 4c6de98729..b4c637edfb 100644 --- a/unittest/formats/CMakeLists.txt +++ b/unittest/formats/CMakeLists.txt @@ -28,6 +28,11 @@ if(PKG_MANYBODY) set_tests_properties(EIMPotentialFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") endif() +add_executable(test_text_file_reader test_text_file_reader.cpp) +target_link_libraries(test_text_file_reader PRIVATE lammps GTest::GMock GTest::GTest) +add_test(NAME TextFileReader COMMAND test_text_file_reader WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +set_tests_properties(TextFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") + add_executable(test_file_operations test_file_operations.cpp) target_link_libraries(test_file_operations PRIVATE lammps GTest::GMock GTest::GTest) add_test(NAME FileOperations COMMAND test_file_operations WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/unittest/formats/test_text_file_reader.cpp b/unittest/formats/test_text_file_reader.cpp new file mode 100644 index 0000000000..e0bb2d42b5 --- /dev/null +++ b/unittest/formats/test_text_file_reader.cpp @@ -0,0 +1,148 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://lammps.sandia.gov/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "info.h" +#include "input.h" +#include "text_file_reader.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +#include "../testing/core.h" + +#include +#include +#include +#include + +using namespace LAMMPS_NS; +using LAMMPS_NS::utils::split_words; + +// whether to print verbose output (i.e. not capturing LAMMPS screen output). +bool verbose = false; + +class TextFileReaderTest : public ::testing::Test { + +protected: + void TearDown() override + { + unlink("text_reader_one.file"); + unlink("text_reader_two.file"); + } + + void test_files() + { + FILE *fp = fopen("text_reader_one.file", "w"); + fputs("# test file 1 for text file reader\n\n\none\n two \n\n" + "three # with comment\nfour ! with non-comment\n" + "# comments only\n five\n#END\n", + fp); + fclose(fp); + + fp = fopen("text_reader_two.file", "w"); + fputs("# test file for atomfile style variable\n\n" + "4 # four lines\n4 0.5 #with comment\n" + "2 -0.5 \n3 1.5\n1 -1.5\n\n" + "2\n10 1.0 # test\n13 1.0\n\n######\n" + "4\n1 4.0 # test\n2 3.0\n3 2.0\n4 1.0\n#END\n", + fp); + fclose(fp); + } +}; + +TEST_F(TextFileReaderTest, nofile) +{ + ASSERT_THROW({ TextFileReader reader("text_reader_noexist.file", "test"); }, + FileReaderException); +} + +TEST_F(TextFileReaderTest, permissions) +{ + FILE *fp = fopen("text_reader_noperms.file", "w"); + fputs("word\n", fp); + fclose(fp); + chmod("text_reader_noperms.file", 0); + ASSERT_THROW({ TextFileReader reader("text_reader_noperms.file", "test"); }, + FileReaderException); + unlink("text_reader_noperms.file"); +} + +TEST_F(TextFileReaderTest, comments) +{ + test_files(); + TextFileReader reader("text_reader_two.file", "test"); + reader.ignore_comments = true; + auto line = reader.next_line(); + ASSERT_STREQ(line, "4 "); + line = reader.next_line(1); + ASSERT_STREQ(line, "4 0.5 "); + ASSERT_NO_THROW({ reader.skip_line(); }); + auto values = reader.next_values(1); + ASSERT_EQ(values.count(), 2); + ASSERT_EQ(values.next_int(), 3); + ASSERT_STREQ(values.next_string().c_str(), "1.5"); + ASSERT_NE(reader.next_line(), nullptr); + double data[20]; + ASSERT_THROW({ reader.next_dvector(data,20); }, FileReaderException); + ASSERT_THROW({ reader.skip_line(); }, EOFException); + ASSERT_EQ(reader.next_line(), nullptr); +} + +TEST_F(TextFileReaderTest, nocomments) +{ + test_files(); + TextFileReader reader("text_reader_one.file", "test"); + reader.ignore_comments = false; + auto line = reader.next_line(); + ASSERT_STREQ(line, "# test file 1 for text file reader\n"); + line = reader.next_line(1); + ASSERT_STREQ(line, "one\n"); + ASSERT_NO_THROW({ reader.skip_line(); }); + auto values = reader.next_values(4); + ASSERT_EQ(values.count(), 4); + ASSERT_STREQ(values.next_string().c_str(), "three"); + ASSERT_STREQ(values.next_string().c_str(), "#"); + ASSERT_STREQ(values.next_string().c_str(), "with"); + try { + reader.next_values(100); + FAIL() << "No exception thrown\n"; + } catch (EOFException &e) { + ASSERT_STREQ(e.what(), "Incorrect format in test file! 9/100 parameters"); + } + ASSERT_THROW({ reader.skip_line(); }, EOFException); + ASSERT_EQ(reader.next_line(), nullptr); +} + +int main(int argc, char **argv) +{ + MPI_Init(&argc, &argv); + ::testing::InitGoogleMock(&argc, argv); + + if (Info::get_mpi_vendor() == "Open MPI" && !LAMMPS_NS::Info::has_exceptions()) + std::cout << "Warning: using OpenMPI without exceptions. " + "Death tests will be skipped\n"; + + // handle arguments passed via environment variable + if (const char *var = getenv("TEST_ARGS")) { + std::vector env = split_words(var); + for (auto arg : env) { + if (arg == "-v") { + verbose = true; + } + } + } + if ((argc > 1) && (strcmp(argv[1], "-v") == 0)) verbose = true; + + int rv = RUN_ALL_TESTS(); + MPI_Finalize(); + return rv; +}