diff options
| author | Bent Bisballe Nyeng <deva@aasimon.org> | 2025-12-28 21:48:09 +0100 |
|---|---|---|
| committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2026-01-02 13:20:17 +0100 |
| commit | fe9183b22f09254a756cb47d6897b1475ad811b1 (patch) | |
| tree | 18fe5c6f16e97bfbf952cdbbcfb12a8f0b410042 /test | |
| parent | e4f612979e9361e006f049ff445e9c78497adbbd (diff) | |
WIPmsvc
Diffstat (limited to 'test')
| -rw-r--r-- | test/ctor.cc | 17 | ||||
| -rw-r--r-- | test/cycle_test.cc | 23 | ||||
| -rw-r--r-- | test/execute_test.cc | 24 | ||||
| -rw-r--r-- | test/generated_sources_test.cc | 20 | ||||
| -rw-r--r-- | test/source_type_test.cc | 8 | ||||
| -rw-r--r-- | test/suite/ctor_files/ctor.cc.bar | 1 | ||||
| -rw-r--r-- | test/suite/ctor_files/ctor.cc.base | 1 | ||||
| -rw-r--r-- | test/suite/ctor_files/ctor.cc.generated | 20 | ||||
| -rw-r--r-- | test/suite/ctor_files/ctor.cc.multi | 1 | ||||
| -rw-r--r-- | test/suite/test.bat | 13 | ||||
| -rw-r--r-- | test/suite/test.cc | 17 | ||||
| -rwxr-xr-x | test/suite/test.sh | 2 | ||||
| -rw-r--r-- | test/testprog.cc | 38 | ||||
| -rw-r--r-- | test/tmpfile.h | 5 | ||||
| -rw-r--r-- | test/tools_test.cc | 3 |
15 files changed, 181 insertions, 12 deletions
diff --git a/test/ctor.cc b/test/ctor.cc index 8b89f6d..ca9b402 100644 --- a/test/ctor.cc +++ b/test/ctor.cc @@ -22,6 +22,7 @@ ctor::build_configurations ctorTestConfigs(const ctor::settings& settings) "-std=c++20", "-O3", "-Wall", "-I../src", "-Iuunit", "-DOUTPUT=\"argparser\"", + "-fexceptions", }, }, }, @@ -39,6 +40,7 @@ ctor::build_configurations ctorTestConfigs(const ctor::settings& settings) "-std=c++20", "-O3", "-Wall", "-I../src", "-Iuunit", "-DOUTPUT=\"generated_sources\"", + "-fexceptions", }, }, }, @@ -56,6 +58,7 @@ ctor::build_configurations ctorTestConfigs(const ctor::settings& settings) "-std=c++20", "-O3", "-Wall", "-I../src", "-Iuunit", "-DOUTPUT=\"argsplit\"", + "-fexceptions", }, }, }, @@ -73,6 +76,7 @@ ctor::build_configurations ctorTestConfigs(const ctor::settings& settings) "-std=c++20", "-O3", "-Wall", "-I../src", "-Iuunit", "-DOUTPUT=\"pointerlist\"", + "-fexceptions", }, }, }, @@ -91,7 +95,9 @@ ctor::build_configurations ctorTestConfigs(const ctor::settings& settings) .cxxflags = { "-std=c++20", "-O3", "-Wall", "-I../src", "-Iuunit", + "-I../json/include", "-DOUTPUT=\"deps\"", + "-fexceptions", }, }, }, @@ -104,7 +110,8 @@ ctor::build_configurations ctorTestConfigs(const ctor::settings& settings) }, .flags = { .cxxflags = { - "-std=c++20", "-O3", "-Wall", + "-std=c++20", "-O3", "-Wall", "-Werror", + "-fexceptions", }, }, }, @@ -125,6 +132,7 @@ ctor::build_configurations ctorTestConfigs(const ctor::settings& settings) "-std=c++20", "-O3", "-Wall", "-I../src", "-Iuunit", "-DOUTPUT=\"execute\"", + "-fexceptions", }, .ldflags = { "-pthread" }, }, @@ -143,6 +151,7 @@ ctor::build_configurations ctorTestConfigs(const ctor::settings& settings) "-std=c++20", "-O3", "-Wall", "-I../src", "-Iuunit", "-DOUTPUT=\"tasks\"", + "-fexceptions", }, .ldflags = { "-pthread" }, }, @@ -161,6 +170,7 @@ ctor::build_configurations ctorTestConfigs(const ctor::settings& settings) "-std=c++20", "-O3", "-Wall", "-I../src", "-Iuunit", "-DOUTPUT=\"cycle\"", + "-fexceptions", }, .ldflags = { "-pthread" }, }, @@ -179,6 +189,7 @@ ctor::build_configurations ctorTestConfigs(const ctor::settings& settings) "-std=c++20", "-O3", "-Wall", "-I../src", "-Iuunit", "-DOUTPUT=\"source_type\"", + "-fexceptions", }, .ldflags = { "-pthread" }, }, @@ -199,6 +210,7 @@ ctor::build_configurations ctorTestConfigs(const ctor::settings& settings) "-std=c++20", "-O3", "-Wall", "-I../src", "-Iuunit", "-DOUTPUT=\"tools\"", + "-fexceptions", }, }, }, @@ -223,11 +235,14 @@ ctor::build_configurations ctorTestConfigs(const ctor::settings& settings) "../src/tools.cc", "../src/util.cc", "../src/externals_manual.cc", + "../configuration.cc", }, .flags = { .cxxflags = { "-std=c++20", "-O3", "-Wall", "-I../src", + "-I../json/include", + "-fexceptions", }, .ldflags = { "-pthread" }, }, diff --git a/test/cycle_test.cc b/test/cycle_test.cc index 3b45632..caf672b 100644 --- a/test/cycle_test.cc +++ b/test/cycle_test.cc @@ -51,10 +51,25 @@ public: const auto& tasks = getTasks(settings); uASSERT_EQUAL(4u, tasks.size()); - uASSERT_EQUAL("target0"s, tasks[0]->target()); - uASSERT_EQUAL("target1"s, tasks[1]->target()); - uASSERT_EQUAL("target2"s, tasks[2]->target()); - uASSERT_EQUAL("target3"s, tasks[3]->target()); + const auto& c = ctor::get_configuration(); + std::string ext; + switch(c.build_arch) + { + case ctor::arch::unix: + case ctor::arch::apple: + ext = ""; + break; + case ctor::arch::windows: + ext = ".exe"; + break; + case ctor::arch::unknown: + break; + } + + uASSERT_EQUAL("target0"s+ext, tasks[0]->target()); + uASSERT_EQUAL("target1"s+ext, tasks[1]->target()); + uASSERT_EQUAL("target2"s+ext, tasks[2]->target()); + uASSERT_EQUAL("target3"s+ext, tasks[3]->target()); for(auto task : tasks) { diff --git a/test/execute_test.cc b/test/execute_test.cc index 11b067f..3cdb309 100644 --- a/test/execute_test.cc +++ b/test/execute_test.cc @@ -23,6 +23,13 @@ public: void return_value() { +#if defined(_WIN32) + constexpr int segfault_return_value = 3; + constexpr int exception_return_value = 0xC0000409; +#else + constexpr int segfault_return_value = 11; + constexpr int exception_return_value = 6; +#endif ctor::settings s; auto cur_path = std::filesystem::path(paths::argv_0).parent_path(); std::vector<std::string> paths{{cur_path.string()}}; @@ -31,16 +38,21 @@ public: auto value = execute(s, cmd, {"retval", "0"}, {}, false); uASSERT_EQUAL(0, value); + value = execute(s, cmd, {"retval", "1"}, {}, false); uASSERT_EQUAL(1, value); + value = execute(s, "no-such-binary", {}, {}, false); uASSERT_EQUAL(1, value); + value = execute(s, cmd, {"segfault"}, {}, false); - uASSERT_EQUAL(11, value); + uASSERT_EQUAL(segfault_return_value, value); + value = execute(s, cmd, {"throw"}, {}, false); - uASSERT_EQUAL(6, value); + uASSERT_EQUAL(exception_return_value, value); + value = execute(s, cmd, {"abort"}, {}, false); - uASSERT_EQUAL(6, value); + uASSERT_EQUAL(exception_return_value, value); } void env() @@ -83,11 +95,13 @@ public: chk = std::find(vars.begin(), vars.end(), "bar=42"s); uASSERT(chk != vars.end()); - // Check the one that should have overwritten the existing one (probably LANG=en_US.UTF-8 or something) + // Check the one that should have overwritten the existing one (probably + // LANG=en_US.UTF-8 or something) chk = std::find(vars.begin(), vars.end(), "LANG=foo"s); uASSERT(chk != vars.end()); - // Check that other vars are also there (ie. the env wasn't cleared on entry) + // Check that other vars are also there (ie. the env wasn't cleared on + // entry) uASSERT(vars.size() > 3); } }; diff --git a/test/generated_sources_test.cc b/test/generated_sources_test.cc index 1ea7538..82b2de8 100644 --- a/test/generated_sources_test.cc +++ b/test/generated_sources_test.cc @@ -26,6 +26,21 @@ public: { using namespace std::string_literals; + const auto& c = ctor::get_configuration(); + std::string ext; + switch(c.build_arch) + { + case ctor::arch::unix: + case ctor::arch::apple: + ext = ""; + break; + case ctor::arch::windows: + ext = ".exe"; + break; + case ctor::arch::unknown: + break; + } + ctor::reg( [](const ctor::settings&) { @@ -62,13 +77,14 @@ public: bool found{false}; for(const auto& task : tasks) { - if(task->target() == "test1") + if(task->target() == "test1"+ext) { auto deps_test1 = task->getDependsTasks(); uASSERT_EQUAL(1u, deps_test1.size()); auto deps_foo_o = deps_test1[0]->getDependsTasks(); uASSERT_EQUAL(1u, deps_foo_o.size()); - uASSERT_EQUAL("test/bar.x"s, deps_foo_o[0]->source()); + uASSERT_EQUAL(std::filesystem::path("test/bar.x"), + std::filesystem::path(deps_foo_o[0]->source())); found = true; } } diff --git a/test/source_type_test.cc b/test/source_type_test.cc index 288f1e5..657260e 100644 --- a/test/source_type_test.cc +++ b/test/source_type_test.cc @@ -26,6 +26,14 @@ std::ostream& operator<<(std::ostream& stream, const ctor::language& lang) return stream; } +const ctor::configuration& ctor::get_configuration() +{ + static ctor::configuration cfg{}; + cfg.build_toolchain = ctor::toolchain::gcc; + cfg.build_arch = ctor::arch::unix; + return cfg; +} + class TestableTaskCC : public TaskCC { diff --git a/test/suite/ctor_files/ctor.cc.bar b/test/suite/ctor_files/ctor.cc.bar index 218f9cc..ab88379 100644 --- a/test/suite/ctor_files/ctor.cc.bar +++ b/test/suite/ctor_files/ctor.cc.bar @@ -23,6 +23,7 @@ ctor::build_configurations ctorConfigs(const ctor::settings& settings) "-g", "-Wall", "-Werror", + "-fexceptions", }, }, .externals = {"bar"}, diff --git a/test/suite/ctor_files/ctor.cc.base b/test/suite/ctor_files/ctor.cc.base index eab39c4..a8b3c92 100644 --- a/test/suite/ctor_files/ctor.cc.base +++ b/test/suite/ctor_files/ctor.cc.base @@ -23,6 +23,7 @@ ctor::build_configurations ctorConfigs(const ctor::settings& settings) "-g", "-Wall", "-Werror", + "-fexceptions", }, }, .externals = {"bar"}, diff --git a/test/suite/ctor_files/ctor.cc.generated b/test/suite/ctor_files/ctor.cc.generated index 5f82fd4..59927b9 100644 --- a/test/suite/ctor_files/ctor.cc.generated +++ b/test/suite/ctor_files/ctor.cc.generated @@ -16,12 +16,32 @@ ctor::build_configurations ctorConfigs(const ctor::settings& settings) .sources = { { "world.cc", ctor::source_type::generated }, }, + .flags = { + .cxxflags = { + "-std=c++20", + "-O3", + "-g", + "-Wall", + "-Werror", + "-fexceptions", + }, + }, }, { .target = "foo", .sources = { { "foo.cc", ctor::source_type::generated }, }, + .flags = { + .cxxflags = { + "-std=c++20", + "-O3", + "-g", + "-Wall", + "-Werror", + "-fexceptions", + }, + }, }, { .target = "this_is_unused", diff --git a/test/suite/ctor_files/ctor.cc.multi b/test/suite/ctor_files/ctor.cc.multi index 2b88afe..157d96c 100644 --- a/test/suite/ctor_files/ctor.cc.multi +++ b/test/suite/ctor_files/ctor.cc.multi @@ -25,6 +25,7 @@ ctor::build_configurations ctorConfigs(const ctor::settings& settings) "-g", "-Wall", "-Werror", + "-fexceptions", }, }, .externals = {"bar"}, diff --git a/test/suite/test.bat b/test/suite/test.bat new file mode 100644 index 0000000..20f0846 --- /dev/null +++ b/test/suite/test.bat @@ -0,0 +1,13 @@ +@echo off + +set CXX=cl.exe +set CC=cl.exe +set AR=lib.exe +set LD=link.exe +set CTORDIR=..\..\build + +%CXX% /nologo /MT /std:c++20 /D_X86_ /EHsc test.cc /link /out:test.exe +@if %errorlevel% neq 0 exit /b %errorlevel% + +test.exe +@if %errorlevel% neq 0 exit /b %errorlevel% diff --git a/test/suite/test.cc b/test/suite/test.cc index 0ab1299..faa72b3 100644 --- a/test/suite/test.cc +++ b/test/suite/test.cc @@ -33,8 +33,13 @@ int fail(int value = 1, return value; } +#if _MSC_VER && !__INTEL_COMPILER +const std::string ctor_exe{"ctor.exe"}; +const std::string obj_ext{".obj"}; +#else const std::string ctor_exe{"./ctor"}; const std::string obj_ext{".o"}; +#endif void copy_config(std::string cfg) { @@ -69,6 +74,9 @@ int main() // Wipe the board std::filesystem::remove_all(BUILDDIR); +#if _MSC_VER && !__INTEL_COMPILER + std::filesystem::create_directory(BUILDDIR); +#endif std::filesystem::remove("configuration.cc"); std::filesystem::remove("config.h"); std::filesystem::remove("ctor"); @@ -78,8 +86,14 @@ int main() // Compile bootstrap binary std::vector<std::string> args = +#if _MSC_VER && !__INTEL_COMPILER + {"/nologo", "/MT", "/std:c++20", "/D_X86_", "/EHsc", "/I..\\..\\src", + "ctor.cc", "/link", "/LIBPATH:"+CTORDIR, "libctor.lib", + "/subsystem:console", "/out:" + ctor_exe}; +#else {"-pthread", "-std=c++20", "-L", CTORDIR, "-lctor", "-I", "../../src", "ctor.cc", "-o", ctor_exe}; +#endif // TODO: add support for quoted strings with spaces if(!CXXFLAGS.empty()) @@ -107,11 +121,14 @@ int main() ////////////////////////////////////////////////////////////////////////////// { +#if _MSC_VER && !__INTEL_COMPILER +#else // No build files should have been created yet if(std::filesystem::exists(BUILDDIR)) { return fail(); } +#endif // capture ctor binary before configure is called auto ctor_bin = readFile(ctor_exe); diff --git a/test/suite/test.sh b/test/suite/test.sh index 4638c0d..8272247 100755 --- a/test/suite/test.sh +++ b/test/suite/test.sh @@ -1,4 +1,6 @@ #!/bin/bash +#set -x + : ${CXX:=g++} $CXX $LDFLAGS $CXXFLAGS -std=c++20 -Wall test.cc -o test && ./test diff --git a/test/testprog.cc b/test/testprog.cc index 93edc3f..18c2c74 100644 --- a/test/testprog.cc +++ b/test/testprog.cc @@ -5,6 +5,14 @@ extern char **environ; +#if defined(_WIN32) +#define WINDOWS_LEAN_AND_MEAN +#include <windows.h> +#undef max +#else +extern char **environ; // see 'man environ' +#endif + int main(int argc, const char* argv[]) { if(argc < 2) @@ -20,11 +28,41 @@ int main(int argc, const char* argv[]) { return 0; } + std::ofstream ostrm(argv[2], std::ios::binary); + if(ostrm.bad()) + { + std::cout << "Error: Could not write to " << argv[2] << "\n"; + } +#if defined(_WIN32) + auto env_strings = GetEnvironmentStrings(); + const char* ptr = env_strings; + std::string env; + while(true) + { + if(*ptr == '\0') + { + if(env.empty()) + { + // no more + break; + } + ostrm << env << "\n"; + env.clear(); + ++ptr; + continue; + } + + env += *ptr; + ++ptr; + } + FreeEnvironmentStrings(env_strings); +#else for(auto current = environ; *current; ++current) { ostrm << (*current) << "\n"; } +#endif } if(cmd == "retval") diff --git a/test/tmpfile.h b/test/tmpfile.h index 0f83a20..5887e36 100644 --- a/test/tmpfile.h +++ b/test/tmpfile.h @@ -17,7 +17,12 @@ public: while(!fp) { filename = tmp_file_template.string() + std::to_string(counter++); + // TODO: Use std::fstream.open() with openmode noreplace when using c++23 +#if defined(_WIN32) + fopen_s(&fp, filename.data(), "wx"); +#else fp = std::fopen(filename.data(), "wx"); +#endif } std::fwrite(data.data(), data.size(), 1, fp); std::fclose(fp); diff --git a/test/tools_test.cc b/test/tools_test.cc index 5ae04c3..15270b3 100644 --- a/test/tools_test.cc +++ b/test/tools_test.cc @@ -22,6 +22,9 @@ std::ostream& operator<<(std::ostream& stream, const ctor::toolchain& toolchain) case ctor::toolchain::clang: stream << "ctor::toolchain::clang"; break; + case ctor::toolchain::msvc: + stream << "ctor::toolchain::msvc"; + break; } return stream; } |
