diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b144db..a69a347 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ -cmake_minimum_required(VERSION 3.10) -project(BigInt) +cmake_minimum_required(VERSION 3.16) +project(Int2048) add_subdirectory(src) add_subdirectory(data) add_subdirectory(tester) \ No newline at end of file diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index 03f47d6..a75a0dc 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -3,7 +3,6 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_FLAGS "-g -O2") set(ENV{MAKEFLAGS} "-j16") include_directories(${PROJECT_SOURCE_DIR}/include) -include_directories(${PROJECT_SOURCE_DIR}/libs/clipp) link_directories(${PROJECT_SOURCE_DIR}/src) add_executable(C1T1 Integer1/1.cpp) target_link_libraries(C1T1 int2048) diff --git a/tester/CMakeLists.txt b/tester/CMakeLists.txt index d97ea68..614cf98 100644 --- a/tester/CMakeLists.txt +++ b/tester/CMakeLists.txt @@ -2,6 +2,6 @@ set(PROJECT_NAME ${CMAKE_PROJECT_NAME}) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_FLAGS "-g -O2") set(ENV{MAKEFLAGS} "-j16") -include_directories(${PROJECT_SOURCE_DIR}/libs/clipp) -include_directories(${PROJECT_SOURCE_DIR}/libs/json) -add_executable(tester tester.cpp) \ No newline at end of file +include_directories(${PROJECT_SOURCE_DIR}/libs) +add_executable(tester tester.cpp) +target_precompile_headers(tester PUBLIC ${PROJECT_SOURCE_DIR}/libs/clipp/clipp.h ${PROJECT_SOURCE_DIR}/libs/json/json.hpp) \ No newline at end of file diff --git a/tester/config.json b/tester/config.json index f496e53..ba755b4 100644 --- a/tester/config.json +++ b/tester/config.json @@ -1,5 +1,5 @@ { - "StatusInterpreter":{"0":"OK","1":"Error"}, + "StatusInterpreter":{"0":"OK","1":"Error","139":"Segmentation fault"}, "Cases": [ {"command":"timeout -s 9 10s /home/happyzym/CSWorkSpace/Proc/BigHomework/BH-int2048-2023/build/data/C1T1 >/tmp/C1T1.out && diff -b -B -u /tmp/C1T1.out /home/happyzym/CSWorkSpace/Proc/BigHomework/BH-int2048-2023/data/Integer1/1.out","uid":"#1","tid":"/1/1"}, diff --git a/tester/tester.cpp b/tester/tester.cpp index 5bd98b1..2d5e10e 100644 --- a/tester/tester.cpp +++ b/tester/tester.cpp @@ -5,8 +5,8 @@ #include #include -#include "clipp.h" -#include "json.hpp" +#include "clipp/clipp.h" +#include "json/json.hpp" std::string getDirectory(const std::string &filepath) { size_t found = filepath.find_last_of("/\\"); return filepath.substr(0, found); @@ -24,17 +24,24 @@ int main(int argc, char *argv[]) { std::string new_config = ""; bool test_sub_tree = false; std::string sub_tree; + bool read_lists_from_stdin = false; + bool read_lists_from_file = false; + std::string list_file_path; // clang-format off auto cli=( - clipp::option("-f","--file").set(config_file).doc("config file path") & clipp::value("config file path",config_file), + clipp::option("--config").set(config_file).doc("config file path") & clipp::value("config file path",config_file), clipp::option("-c","--continuous").set(continuous).doc("continuous mode"), - clipp::option("-a","--all").set(test_all).doc("test all"), - clipp::option("-s","--subtree").set(test_sub_tree).doc("test subtree") & clipp::value("subtree",sub_tree), - clipp::option("-l","--list").set(test_listed_cases).doc("test listed cases") & clipp::values("cases",listed_cases) + ( + clipp::required("-a","--all").set(test_all).doc("test all")| + (clipp::required("-s","--subtree").set(test_sub_tree).doc("test subtree") & clipp::value("subtree",sub_tree))| + (clipp::required("-l","--list").set(test_listed_cases).doc("test listed cases") & clipp::values("cases",listed_cases))| + (clipp::required("-i","--stdin").set(read_lists_from_stdin).doc("read test list from stdin"))| + (clipp::required("-f","--filelist").set(read_lists_from_file).doc("read test list from file") & clipp::value("file",list_file_path)) + ) ); // clang-format on - if (!parse(argc, argv, cli)) { - std::cout << make_man_page(cli, argv[0]); + if (!clipp::parse(argc, argv, cli)) { + std::cout << clipp::make_man_page(cli, argv[0]); return 0; } if (use_custoem_config) config_file = new_config; @@ -62,11 +69,33 @@ int main(int argc, char *argv[]) { listed_cases.push_back(DeEscape(config["Cases"][i]["tid"])); } } - } + } else if (read_lists_from_stdin) { + listed_cases.clear(); + std::string line; + while (std::getline(std::cin, line)) { + listed_cases.push_back(line); + } + } else if (read_lists_from_file) { + listed_cases.clear(); + std::ifstream list_file(list_file_path); + std::string line; + while (std::getline(list_file, line)) { + listed_cases.push_back(line); + } + } else + throw std::runtime_error("No test cases specified"); + int total_cases = 0, total_passed = 0; for (int i = 0; i < listed_cases.size(); i++) { std::cerr << "Testing " << listed_cases[i] << std::endl; + if (index.find(listed_cases[i]) == index.end()) { + std::cerr << "Test " << listed_cases[i] << " not found" << std::endl; + std::cerr << '\n' << std::endl; + continue; + } std::cerr << "Command = " << index[listed_cases[i]] << std::endl; int status = system(index[listed_cases[i]].c_str()) / 256; + total_cases++; + if (status == 0) total_passed++; if (status == 0) { std::cerr << "Test " << listed_cases[i] << " passed" << std::endl; } else { @@ -80,9 +109,13 @@ int main(int argc, char *argv[]) { : std::string("Unknown Error")) << std::endl; if (!continuous) { + std::cerr << total_passed << "/" << total_cases << " cases passed" + << std::endl; return 1; } } + std::cerr << total_passed << "/" << total_cases << " cases passed" + << std::endl; std::cerr << '\n' << std::endl; } return 0;