summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2025-04-02 21:54:55 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2025-12-29 12:22:47 +0100
commit0333f2eca72dfa464a71033363bfd15773718b48 (patch)
tree817051e224f074961931dcc451d13e19f93e7377 /test
parentd7f6ce94c5cbdf03e1630c150f2fd34af9f15349 (diff)
WIPmsvc
Diffstat (limited to 'test')
-rw-r--r--test/ctor.cc17
-rw-r--r--test/cycle_test.cc23
-rw-r--r--test/execute_test.cc24
-rw-r--r--test/generated_sources_test.cc20
-rw-r--r--test/source_type_test.cc8
-rw-r--r--test/suite/test.bat10
-rw-r--r--test/suite/test.cc5
-rwxr-xr-xtest/suite/test.sh2
-rw-r--r--test/testprog.cc38
-rw-r--r--test/tmpfile.h5
-rw-r--r--test/tools_test.cc3
11 files changed, 143 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/test.bat b/test/suite/test.bat
new file mode 100644
index 0000000..b6b2750
--- /dev/null
+++ b/test/suite/test.bat
@@ -0,0 +1,10 @@
+@echo off
+
+set CXX=cl.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 b9a6cc3..2494f02 100644
--- a/test/suite/test.cc
+++ b/test/suite/test.cc
@@ -64,8 +64,13 @@ 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", "/out:ctor.exe"};
+#else
{"-pthread", "-std=c++20", "-L", CTORDIR, "-lctor", "-I", "../../src",
"ctor.cc", "-o", "ctor"};
+#endif
// TODO: add support for quoted strings with spaces
if(!CXXFLAGS.empty())
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;
}