aboutsummaryrefslogtreecommitdiff
path: root/test/run_tests.cpp
diff options
context:
space:
mode:
authorJosh Wolfe <thejoshwolfe@gmail.com>2015-12-01 10:44:30 -0700
committerJosh Wolfe <thejoshwolfe@gmail.com>2015-12-01 10:44:30 -0700
commitab327344b671bff7f874f24691d7e3f19176167c (patch)
treec437760bbc1f7059417b21e37c3d15a42534d4e8 /test/run_tests.cpp
parent9278dbedd5242bf4253da29c0fab36eea9dda61b (diff)
parentdfb6682089ad758b7ba72733778a9aa8c544c164 (diff)
downloadzig-ab327344b671bff7f874f24691d7e3f19176167c.tar.gz
zig-ab327344b671bff7f874f24691d7e3f19176167c.zip
merge conflicts
Diffstat (limited to 'test/run_tests.cpp')
-rw-r--r--test/run_tests.cpp106
1 files changed, 88 insertions, 18 deletions
diff --git a/test/run_tests.cpp b/test/run_tests.cpp
index b54f0bd4c8..979ad38997 100644
--- a/test/run_tests.cpp
+++ b/test/run_tests.cpp
@@ -14,13 +14,13 @@
struct TestSourceFile {
const char *relative_path;
- const char *text;
+ const char *source_code;
};
struct TestCase {
const char *case_name;
const char *output;
- const char *source;
+ ZigList<TestSourceFile> source_files;
ZigList<const char *> compile_errors;
ZigList<const char *> compiler_args;
ZigList<const char *> program_args;
@@ -31,11 +31,20 @@ static const char *tmp_source_path = ".tmp_source.zig";
static const char *tmp_exe_path = "./.tmp_exe";
static const char *zig_exe = "./zig";
-static void add_simple_case(const char *case_name, const char *source, const char *output) {
+static void add_source_file(TestCase *test_case, const char *path, const char *source) {
+ test_case->source_files.add_one();
+ test_case->source_files.last().relative_path = path;
+ test_case->source_files.last().source_code = source;
+}
+
+static TestCase *add_simple_case(const char *case_name, const char *source, const char *output) {
TestCase *test_case = allocate<TestCase>(1);
test_case->case_name = case_name;
test_case->output = output;
- test_case->source = source;
+
+ test_case->source_files.resize(1);
+ test_case->source_files.at(0).relative_path = tmp_source_path;
+ test_case->source_files.at(0).source_code = source;
test_case->compiler_args.append("build");
test_case->compiler_args.append(tmp_source_path);
@@ -48,17 +57,23 @@ static void add_simple_case(const char *case_name, const char *source, const cha
test_case->compiler_args.append("--release");
test_case->compiler_args.append("--strip");
test_case->compiler_args.append("--verbose");
+ test_case->compiler_args.append("--color");
+ test_case->compiler_args.append("on");
test_cases.append(test_case);
+
+ return test_case;
}
-static void add_compile_fail_case(const char *case_name, const char *source, int count, ...) {
+static TestCase *add_compile_fail_case(const char *case_name, const char *source, int count, ...) {
va_list ap;
va_start(ap, count);
TestCase *test_case = allocate<TestCase>(1);
test_case->case_name = case_name;
- test_case->source = source;
+ test_case->source_files.resize(1);
+ test_case->source_files.at(0).relative_path = tmp_source_path;
+ test_case->source_files.at(0).source_code = source;
for (int i = 0; i < count; i += 1) {
const char *arg = va_arg(ap, const char *);
@@ -76,6 +91,8 @@ static void add_compile_fail_case(const char *case_name, const char *source, int
test_cases.append(test_case);
va_end(ap);
+
+ return test_case;
}
static void add_compiling_test_cases(void) {
@@ -133,13 +150,52 @@ static void add_compiling_test_cases(void) {
exit(0);
}
)SOURCE", "OK\n");
+
+ {
+ TestCase *tc = add_simple_case("multiple files with private function", R"SOURCE(
+ use "libc.zig";
+ use "foo.zig";
+
+ export fn _start() -> unreachable {
+ private_function();
+ }
+
+ fn private_function() -> unreachable {
+ print_text();
+ exit(0);
+ }
+ )SOURCE", "OK\n");
+
+ add_source_file(tc, "libc.zig", R"SOURCE(
+ #link("c")
+ extern {
+ pub fn puts(s: *mut u8) -> i32;
+ pub fn exit(code: i32) -> unreachable;
+ }
+ )SOURCE");
+
+ add_source_file(tc, "foo.zig", R"SOURCE(
+ use "libc.zig";
+
+ // purposefully conflicting function with main source file
+ // but it's private so it should be OK
+ fn private_function() {
+ puts("OK");
+ }
+
+ pub fn print_text() {
+ private_function();
+ }
+ )SOURCE");
+ }
+
}
static void add_compile_failure_test_cases(void) {
add_compile_fail_case("multiple function definitions", R"SOURCE(
fn a() {}
fn a() {}
- )SOURCE", 1, "Line 3, column 1: redefinition of 'a'");
+ )SOURCE", 1, ".tmp_source.zig:3:1: error: redefinition of 'a'");
add_compile_fail_case("bad directive", R"SOURCE(
#bogus1("")
@@ -148,37 +204,37 @@ extern {
}
#bogus2("")
fn a() {}
- )SOURCE", 2, "Line 2, column 1: invalid directive: 'bogus1'",
- "Line 6, column 1: invalid directive: 'bogus2'");
+ )SOURCE", 2, ".tmp_source.zig:2:1: error: invalid directive: 'bogus1'",
+ ".tmp_source.zig:6:1: error: invalid directive: 'bogus2'");
add_compile_fail_case("unreachable with return", R"SOURCE(
fn a() -> unreachable {return;}
- )SOURCE", 1, "Line 2, column 24: return statement in function with unreachable return type");
+ )SOURCE", 1, ".tmp_source.zig:2:24: error: return statement in function with unreachable return type");
add_compile_fail_case("control reaches end of non-void function", R"SOURCE(
fn a() -> i32 {}
- )SOURCE", 1, "Line 2, column 1: control reaches end of non-void function");
+ )SOURCE", 1, ".tmp_source.zig:2:1: error: control reaches end of non-void function");
add_compile_fail_case("undefined function call", R"SOURCE(
fn a() {
b();
}
- )SOURCE", 1, "Line 3, column 5: undefined function: 'b'");
+ )SOURCE", 1, ".tmp_source.zig:3:5: error: undefined function: 'b'");
add_compile_fail_case("wrong number of arguments", R"SOURCE(
fn a() {
b(1);
}
fn b(a: i32, b: i32, c: i32) { }
- )SOURCE", 1, "Line 3, column 5: wrong number of arguments. Expected 3, got 1.");
+ )SOURCE", 1, ".tmp_source.zig:3:5: error: wrong number of arguments. Expected 3, got 1.");
add_compile_fail_case("invalid type", R"SOURCE(
fn a() -> bogus {}
- )SOURCE", 1, "Line 2, column 11: invalid type name: 'bogus'");
+ )SOURCE", 1, ".tmp_source.zig:2:11: error: invalid type name: 'bogus'");
add_compile_fail_case("pointer to unreachable", R"SOURCE(
fn a() -> *mut unreachable {}
- )SOURCE", 1, "Line 2, column 11: pointer to unreachable not allowed");
+ )SOURCE", 1, ".tmp_source.zig:2:11: error: pointer to unreachable not allowed");
add_compile_fail_case("unreachable code", R"SOURCE(
fn a() {
@@ -187,12 +243,16 @@ fn a() {
}
fn b() {}
- )SOURCE", 1, "Line 4, column 5: unreachable code");
+ )SOURCE", 1, ".tmp_source.zig:4:5: error: unreachable code");
add_compile_fail_case("bad version string", R"SOURCE(
#version("aoeu")
export executable "test";
- )SOURCE", 1, "Line 2, column 1: invalid version string");
+ )SOURCE", 1, ".tmp_source.zig:2:1: error: invalid version string");
+
+ add_compile_fail_case("bad import", R"SOURCE(
+use "bogus-does-not-exist.zig";
+ )SOURCE", 1, ".tmp_source.zig:2:1: error: unable to open \"./bogus-does-not-exist.zig\": file not found");
}
static void print_compiler_invokation(TestCase *test_case, Buf *zig_stderr) {
@@ -205,7 +265,12 @@ static void print_compiler_invokation(TestCase *test_case, Buf *zig_stderr) {
}
static void run_test(TestCase *test_case) {
- os_write_file(buf_create_from_str(tmp_source_path), buf_create_from_str(test_case->source));
+ for (int i = 0; i < test_case->source_files.length; i += 1) {
+ TestSourceFile *test_source = &test_case->source_files.at(i);
+ os_write_file(
+ buf_create_from_str(test_source->relative_path),
+ buf_create_from_str(test_source->source_code));
+ }
Buf zig_stderr = BUF_INIT;
Buf zig_stdout = BUF_INIT;
@@ -263,6 +328,11 @@ static void run_test(TestCase *test_case) {
printf("=======================================\n");
exit(1);
}
+
+ for (int i = 0; i < test_case->source_files.length; i += 1) {
+ TestSourceFile *test_source = &test_case->source_files.at(i);
+ remove(test_source->relative_path);
+ }
}
static void run_all_tests(void) {