From 4ac351eba630c3155e5c90956025bc966a575602 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Fri, 19 Nov 2021 09:09:56 -0500 Subject: [PATCH] Add tags to force-style tests Adds an optional "tags" entry in the force style test YAML. This is a comma-separated list of keywords, which are parsed by CMake and added as labels for CTest. This allows more fine-grained filtering of tests. Any newly-generated YAML file automatically adds the "generated" tag. --- unittest/force-styles/CMakeLists.txt | 25 ++++++++++++++++++++ unittest/force-styles/test_config.h | 15 ++++++++++++ unittest/force-styles/test_config_reader.cpp | 11 +++++++++ unittest/force-styles/test_config_reader.h | 1 + unittest/force-styles/test_main.cpp | 3 +++ 5 files changed, 55 insertions(+) diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index 39730e6aeb..464cd9426a 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -12,6 +12,13 @@ if(NOT YAML_FOUND) add_library(Yaml::Yaml ALIAS yaml) endif() +function(extract_tags out yaml_file) + file(STRINGS ${yaml_file} TAGS_LINE REGEX "^tags:") + string(REPLACE "tags:" "" TAGS_LINE "${TAGS_LINE}") + string(REGEX MATCHALL "[^, \t\r\n]+" TAGS "${TAGS_LINE}") + set(${out} "${TAGS}" PARENT_SCOPE) +endfunction() + if(CMAKE_VERSION VERSION_LESS 3.12) # adjust so we find Python 3 versions before Python 2 on old systems with old CMake set(Python_ADDITIONAL_VERSIONS 3.8 3.7 3.6 3.5) @@ -73,24 +80,30 @@ if(FFT_SINGLE) endif() foreach(TEST ${MOL_PAIR_TESTS}) string(REGEX REPLACE "^.*mol-pair-(.*)\.yaml" "MolPairStyle:\\1" TNAME ${TEST}) + extract_tags(TEST_TAGS ${TEST}) add_test(NAME ${TNAME} COMMAND test_pair_style ${TEST} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}") + set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() # tests for metal-like atomic systems and related pair styles file(GLOB ATOMIC_PAIR_TESTS LIST_DIRECTORIES false ${TEST_INPUT_FOLDER}/atomic-pair-*.yaml) foreach(TEST ${ATOMIC_PAIR_TESTS}) string(REGEX REPLACE "^.*atomic-pair-(.*)\.yaml" "AtomicPairStyle:\\1" TNAME ${TEST}) + extract_tags(TEST_TAGS ${TEST}) add_test(NAME ${TNAME} COMMAND test_pair_style ${TEST} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}") + set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() # tests for Si-like manybody systems and related pair styles file(GLOB MANYBODY_PAIR_TESTS LIST_DIRECTORIES false ${TEST_INPUT_FOLDER}/manybody-pair-*.yaml) foreach(TEST ${MANYBODY_PAIR_TESTS}) string(REGEX REPLACE "^.*manybody-pair-(.*)\.yaml" "ManybodyPairStyle:\\1" TNAME ${TEST}) + extract_tags(TEST_TAGS ${TEST}) add_test(NAME ${TNAME} COMMAND test_pair_style ${TEST} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}") + set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() # bond style tester @@ -100,8 +113,10 @@ target_link_libraries(test_bond_style PRIVATE lammps style_tests) file(GLOB BOND_TESTS LIST_DIRECTORIES false ${TEST_INPUT_FOLDER}/bond-*.yaml) foreach(TEST ${BOND_TESTS}) string(REGEX REPLACE "^.*bond-(.*)\.yaml" "BondStyle:\\1" TNAME ${TEST}) + extract_tags(TEST_TAGS ${TEST}) add_test(NAME ${TNAME} COMMAND test_bond_style ${TEST} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}") + set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() # angle style tester @@ -111,8 +126,10 @@ target_link_libraries(test_angle_style PRIVATE lammps style_tests) file(GLOB ANGLE_TESTS LIST_DIRECTORIES false ${TEST_INPUT_FOLDER}/angle-*.yaml) foreach(TEST ${ANGLE_TESTS}) string(REGEX REPLACE "^.*angle-(.*)\.yaml" "AngleStyle:\\1" TNAME ${TEST}) + extract_tags(TEST_TAGS ${TEST}) add_test(NAME ${TNAME} COMMAND test_angle_style ${TEST} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}") + set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() # kspace style tester, currently uses the pair style tool @@ -123,8 +140,10 @@ if(FFT_SINGLE) endif() foreach(TEST ${KSPACE_TESTS}) string(REGEX REPLACE "^.*kspace-(.*)\.yaml" "KSpaceStyle:\\1" TNAME ${TEST}) + extract_tags(TEST_TAGS ${TEST}) add_test(NAME ${TNAME} COMMAND test_pair_style ${TEST} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}") + set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() # tester for timestepping fixes @@ -138,8 +157,10 @@ target_link_libraries(test_fix_timestep PRIVATE lammps style_tests) file(GLOB FIX_TIMESTEP_TESTS LIST_DIRECTORIES false ${TEST_INPUT_FOLDER}/fix-timestep-*.yaml) foreach(TEST ${FIX_TIMESTEP_TESTS}) string(REGEX REPLACE "^.*fix-timestep-(.*)\.yaml" "FixTimestep:\\1" TNAME ${TEST}) + extract_tags(TEST_TAGS ${TEST}) add_test(NAME ${TNAME} COMMAND test_fix_timestep ${TEST} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:${LAMMPS_PYTHON_DIR}:$ENV{PYTHONPATH}") + set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() # dihedral style tester @@ -149,8 +170,10 @@ target_link_libraries(test_dihedral_style PRIVATE lammps style_tests) file(GLOB DIHEDRAL_TESTS LIST_DIRECTORIES false ${TEST_INPUT_FOLDER}/dihedral-*.yaml) foreach(TEST ${DIHEDRAL_TESTS}) string(REGEX REPLACE "^.*dihedral-(.*)\.yaml" "DihedralStyle:\\1" TNAME ${TEST}) + extract_tags(TEST_TAGS ${TEST}) add_test(NAME ${TNAME} COMMAND test_dihedral_style ${TEST} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}") + set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() # improper style tester @@ -160,6 +183,8 @@ target_link_libraries(test_improper_style PRIVATE lammps style_tests) file(GLOB IMPROPER_TESTS LIST_DIRECTORIES false ${TEST_INPUT_FOLDER}/improper-*.yaml) foreach(TEST ${IMPROPER_TESTS}) string(REGEX REPLACE "^.*improper-(.*)\.yaml" "ImproperStyle:\\1" TNAME ${TEST}) + extract_tags(TEST_TAGS ${TEST}) add_test(NAME ${TNAME} COMMAND test_improper_style ${TEST} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}") + set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() diff --git a/unittest/force-styles/test_config.h b/unittest/force-styles/test_config.h index bf4f867f3b..ef4d911b60 100644 --- a/unittest/force-styles/test_config.h +++ b/unittest/force-styles/test_config.h @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -37,6 +38,7 @@ public: std::vector> prerequisites; std::vector pre_commands; std::vector post_commands; + std::vector tags; std::string input_file; std::string pair_style; std::string bond_style; @@ -96,6 +98,19 @@ public: } virtual ~TestConfig(){}; + std::string tags_line() const + { + if(tags.size() > 0) { + std::stringstream line; + line << tags[0]; + for(size_t i = 1; i < tags.size(); i++) { + line << ", " << tags[i]; + } + return line.str(); + } + return "generated"; + } + private: TestConfig(const TestConfig &){}; }; diff --git a/unittest/force-styles/test_config_reader.cpp b/unittest/force-styles/test_config_reader.cpp index 65e9e4b0f6..e6cf73f10e 100644 --- a/unittest/force-styles/test_config_reader.cpp +++ b/unittest/force-styles/test_config_reader.cpp @@ -27,10 +27,12 @@ #include using LAMMPS_NS::utils::split_words; +using LAMMPS_NS::utils::trim; TestConfigReader::TestConfigReader(TestConfig &config) : YamlReader(), config(config) { consumers["lammps_version"] = &TestConfigReader::lammps_version; + consumers["tags"] = &TestConfigReader::tags; consumers["date_generated"] = &TestConfigReader::date_generated; consumers["epsilon"] = &TestConfigReader::epsilon; consumers["skip_tests"] = &TestConfigReader::skip_tests; @@ -367,3 +369,12 @@ void TestConfigReader::global_vector(const yaml_event_t &event) config.global_vector.push_back(value); } } + +void TestConfigReader::tags(const yaml_event_t &event) +{ + std::stringstream data((char *)event.data.scalar.value); + config.tags.clear(); + for (std::string tag; std::getline(data, tag, ','); ) { + config.tags.push_back(trim(tag)); + } +} diff --git a/unittest/force-styles/test_config_reader.h b/unittest/force-styles/test_config_reader.h index bf69f149fe..1f0de8df0a 100644 --- a/unittest/force-styles/test_config_reader.h +++ b/unittest/force-styles/test_config_reader.h @@ -58,6 +58,7 @@ public: void run_energy(const yaml_event_t &event); void global_scalar(const yaml_event_t &event); void global_vector(const yaml_event_t &event); + void tags(const yaml_event_t &event); }; #endif diff --git a/unittest/force-styles/test_main.cpp b/unittest/force-styles/test_main.cpp index 1ad0b79455..2680804fdf 100644 --- a/unittest/force-styles/test_main.cpp +++ b/unittest/force-styles/test_main.cpp @@ -46,6 +46,9 @@ void write_yaml_header(YamlWriter *writer, TestConfig *cfg, const char *version) // lammps_version writer->emit("lammps_version", version); + // tags + writer->emit("tags", cfg->tags_line()); + // date_generated std::time_t now = time(nullptr); std::string block = trim(ctime(&now));