diff options
-rw-r--r-- | test-ymake.cpp | 47 | ||||
-rw-r--r-- | yscan.cpp | 27 |
2 files changed, 64 insertions, 10 deletions
diff --git a/test-ymake.cpp b/test-ymake.cpp index dfed871..1df3ce0 100644 --- a/test-ymake.cpp +++ b/test-ymake.cpp @@ -187,14 +187,32 @@ TEST_F(ymakeTest, build_three_cpp) </ymake> )"); + EXPECT_TRUE(!fs::exists("hello.o")); + EXPECT_TRUE(!fs::exists("second.o")); + EXPECT_TRUE(!fs::exists("third.o")); + EXPECT_TRUE(!fs::exists("hello")); + std::vector<std::string> output; int result = run_command("../ymake", output); EXPECT_EQ(result, 0); EXPECT_EQ(output.size(), 4); // compile 3, link 1 + + EXPECT_TRUE(fs::exists("hello.o")); + EXPECT_TRUE(fs::exists("second.o")); + EXPECT_TRUE(fs::exists("third.o")); + EXPECT_TRUE(fs::exists("hello")); + + result = run_command("../ymake clean"); + EXPECT_EQ(result, 0); + + EXPECT_TRUE(!fs::exists("hello.o")); + EXPECT_TRUE(!fs::exists("second.o")); + EXPECT_TRUE(!fs::exists("third.o")); + EXPECT_TRUE(!fs::exists("hello")); } -// TODO: test .c .cc .cpp +// TODO: test file extensions .c .cc .cpp // TODO: multiple builds // TODO: test tests // TODO: test g++/clang++ @@ -234,7 +252,32 @@ TEST_F(yscanTest, one_cpp_file) )"); } -// TODO: test multiple files +TEST_F(yscanTest, one_three_files) +{ + create_file("hello.cpp", R"(int main(int argc, char* argv[]) +{ + return 0; +})"); + create_file("second.cpp", R"()"); + create_file("third.cpp", R"()"); + create_file("fourth.cpp", R"()"); + + std::string output; + int result = run_command("../yscan", output); + EXPECT_EQ(result, 0); + + EXPECT_EQ(output, R"(<ymake> + <build> + <name>testdir1</name> + <source>fourth.cpp</source> + <source>hello.cpp</source> + <source>second.cpp</source> + <source>third.cpp</source> + </build> +</ymake> +)"); +} + // TODO: test multiple builds // TODO: test tests @@ -2,9 +2,12 @@ #include "file.h" +#include <algorithm> #include <filesystem> #include <iostream> +#include <numeric> #include <string> +#include <vector> #include <fmt/format.h> @@ -18,24 +21,32 @@ int yscan(int argc, char* argv[]) try { std::string name {fs::current_path().stem().string()}; - std::string sources; - std::string test_sources; + std::vector<std::string> sources; + std::vector<std::string> test_sources; for (const auto& i: fs::directory_iterator(".")) { fs::path p{i.path().filename()}; if (is_compile_unit_source_by_extension(p)) { if (p.string().substr(0, 4) == "test") { - test_sources += " <source>" + p.string() + "</source>\n"; + test_sources.push_back(p.string()); } else { - sources += " <source>" + p.string() + "</source>\n"; + sources.push_back(p.string()); } } } - if (!test_sources.empty()) { - test_sources = fmt::format(R"( <test> + std::sort(sources.begin(), sources.end()); + std::sort(test_sources.begin(), test_sources.end()); + + std::string sources_string{std::accumulate(sources.begin(), sources.end(), std::string{}, + [](const std::string& sum, const std::string& i){return sum + " <source>" + i + "</source>\n";})}; + std::string test_sources_string{std::accumulate(test_sources.begin(), test_sources.end(), std::string{}, + [](const std::string& sum, const std::string& i){return sum + " <source>" + i + "</source>\n";})}; + + if (!test_sources_string.empty()) { + test_sources_string = fmt::format(R"( <test> <name>{}</name> {} </test> -)", "test-"s + name, test_sources); +)", "test-"s + name, test_sources_string); } std::string contents {R"(<ymake> @@ -43,7 +54,7 @@ int yscan(int argc, char* argv[]) <name>{}</name> {} </build> {}</ymake>)"}; - contents = fmt::format(contents, name, sources, test_sources); + contents = fmt::format(contents, name, sources_string, test_sources_string); std::cout << contents << std::endl; } catch (const std::exception& ex) { std::cerr << "yscan: " << ex.what() << std::endl; |