From 53a331bc8b2fc33bd2b7e25a23b4128f89ee0b52 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 7 Jun 2019 10:47:47 +0200 Subject: Add assignment, while, extern, function signature type, start on bytecode --- tests/b.amal.z | 6 ++-- tests/bytecode.amal | 12 +++++++ tests/bytecode.amal.z | 11 +++++++ tests/errors/const_assign.amal | 4 +++ tests/errors/const_assign.amal.z | 6 ++++ tests/io.amal.z | 6 ++-- tests/main.amal | 22 ++++++++++++- tests/main.amal.z | 69 +++++++++++++++++++--------------------- tests/main.c | 45 ++++++++++++++++++-------- tests/sub/a.amal.z | 2 -- 10 files changed, 122 insertions(+), 61 deletions(-) create mode 100644 tests/bytecode.amal create mode 100644 tests/bytecode.amal.z create mode 100644 tests/errors/const_assign.amal create mode 100644 tests/errors/const_assign.amal.z (limited to 'tests') diff --git a/tests/b.amal.z b/tests/b.amal.z index bf8e698..b9e0013 100644 --- a/tests/b.amal.z +++ b/tests/b.amal.z @@ -1,4 +1,2 @@ -typedef i64 signed long long; -typedef f64 double; -void f0() { -} +FUNC_START 0 +FUNC_END diff --git a/tests/bytecode.amal b/tests/bytecode.amal new file mode 100644 index 0000000..c5b2cb3 --- /dev/null +++ b/tests/bytecode.amal @@ -0,0 +1,12 @@ +extern const printf: fn; + +const print = fn { + +} + +const main = fn { + var value = 23; + value = 34; + const str_value = "hello, world"; + print(); +} \ No newline at end of file diff --git a/tests/bytecode.amal.z b/tests/bytecode.amal.z new file mode 100644 index 0000000..2809b47 --- /dev/null +++ b/tests/bytecode.amal.z @@ -0,0 +1,11 @@ +FUNC_START 0 +FUNC_END +FUNC_START 0 +mov r0, i0 +mov r1, r0 +mov r2, i1 +mov r1, r2 +mov r3, s0 +mov r4, r3 +call 0 +FUNC_END diff --git a/tests/errors/const_assign.amal b/tests/errors/const_assign.amal new file mode 100644 index 0000000..b0b0ec4 --- /dev/null +++ b/tests/errors/const_assign.amal @@ -0,0 +1,4 @@ +const main = fn { + const value = 23; + value = 34; +} \ No newline at end of file diff --git a/tests/errors/const_assign.amal.z b/tests/errors/const_assign.amal.z new file mode 100644 index 0000000..99b1210 --- /dev/null +++ b/tests/errors/const_assign.amal.z @@ -0,0 +1,6 @@ +FUNC_START 0 +mov r0, i0 +mov r1, r0 +mov r2, i1 +mov r1, r2 +FUNC_END diff --git a/tests/io.amal.z b/tests/io.amal.z index bf8e698..b9e0013 100644 --- a/tests/io.amal.z +++ b/tests/io.amal.z @@ -1,4 +1,2 @@ -typedef i64 signed long long; -typedef f64 double; -void f0() { -} +FUNC_START 0 +FUNC_END diff --git a/tests/main.amal b/tests/main.amal index ae37816..c12ecba 100644 --- a/tests/main.amal +++ b/tests/main.amal @@ -20,8 +20,28 @@ const main = fn { episfjpseifipesf */ io.puts("lole"); + if num1 == 43 + print(2); } const print = fn { -} \ No newline at end of file +} + +/* +// Shader main function is guaranteed to be inline if run on CPU + +const vertex_passthrough = VertexShader { + const main = fn() vec4f { + return gl_ModelViewProjectionMatrix * gl_Vertex; + } +} + +const fragment_passthrough = FragmentShader { + tex: texture2d; + + const main = fn(coord: vec2f) vec2f { + return tex.getPixel(coord); + } +} +*/ diff --git a/tests/main.amal.z b/tests/main.amal.z index 73d9dae..eac48f6 100644 --- a/tests/main.amal.z +++ b/tests/main.amal.z @@ -1,36 +1,33 @@ -typedef i64 signed long long; -typedef f64 double; -void f0() { -void f1() { -} -const char* r0 = "hello"; -const char* r1 = r0; -PUSH r0 *** -const char* r2 = "world"; -PUSH r2 *** -i64 r3 = 356; -PUSH r3 *** -f64 r4 = 13.370000; -PUSH r4 *** -r5 = CALL 0x621000010bc8 *** -i64 r6 = 23232; -i64 r7 = r6; -i64 r8 = 30; -r9 = r0 * r8; -r10 = r0 + r9; -i64 r11 = r10; -r12 = r0 + r0; -i64 r13 = 34; -i64 r14 = 32; -r15 = r13 + r14; -i64 r16 = 2; -r17 = r15 / r16; -r18 = r0 * r17; -r19 = r12 * r18; -i64 r20 = r19; -const char* r21 = "lole"; -PUSH r21 *** -r22 = CALL 0x621000006948 *** -} -void f2() { -} +FUNC_START 0 +FUNC_START 0 +FUNC_END +mov r0, s0 +mov r1, r0 +push r1 +mov r2, s1 +push r2 +mov r3, i0 +push r3 +mov r4, i1 +push r4 +call 2 +mov r6, i2 +mov r7, i3 +mov r8, r7 +mov r9, i4 +mov r12, r11 +mov r14, i5 +mov r15, i6 +mov r17, i7 +mov r21, r20 +mov r22, s2 +push r22 +call 0 +mov r24, i8 +jz r25, 24 +mov r26, i9 +push r26 +call 2 +FUNC_END +FUNC_START 0 +FUNC_END diff --git a/tests/main.c b/tests/main.c index 04f2343..3080807 100644 --- a/tests/main.c +++ b/tests/main.c @@ -7,6 +7,9 @@ #include #include +static int num_successful_tests = 0; +static int num_tests_run = 0; + #define REQUIRE_EQ_INT(expected, actual) do{\ if((expected) != (actual)) {\ fprintf(stderr, "%s:%d: Assert failed (%s vs %s).\nExpected %d, got %d.\n", __FILE__, __LINE__, #expected, #actual, (expected), (actual));\ @@ -42,7 +45,7 @@ static CHECK_RESULT int test_hash_map() { return 0; } -#define FAIL_TEST(name) do { fprintf(stderr, "Test failed: %s\n", (name)); exit(1); } while(0) +#define FAIL_TEST(name) do { fprintf(stderr, "Test failed: %s\n", (name)); return; } while(0) typedef struct { char *filepath; @@ -56,8 +59,8 @@ typedef struct { static void error_callback_assert(const char *err_msg, int err_msg_len, void *userdata) { ErrorExpectedData *expected_data; - expected_data = userdata; int expected_err_msg_len; + expected_data = userdata; expected_err_msg_len = strlen(expected_data->expected_error); if(expected_data->got_expected_error) { @@ -74,14 +77,14 @@ static void error_callback_assert(const char *err_msg, int err_msg_len, void *us expected_data->got_expected_error = bool_true; } - +#if 0 static void error_callback(const char *err_msg, int err_msg_len, void *userdata) { ErrorUnexpectedData *data; data = userdata; fprintf(stderr, "Test failed: %s with error: %.*s\n", data->filepath, err_msg_len, err_msg); exit(1); } - +#endif static char* get_full_path(const char *filepath) { #define PATH_LEN 4096 char *buf; @@ -120,33 +123,39 @@ static char* join_str(const char *str1, const char *str2, char delimiter) { static void test_load(const char *filepath) { amal_compiler compiler; amal_compiler_options options; + char *full_path; int result; amal_compiler_options_init(&options); + ++num_tests_run; + full_path = get_full_path(filepath); + /* options.error_callback = error_callback; ErrorUnexpectedData data; data.filepath = get_full_path(filepath); options.error_callback_userdata = &data; + */ result = amal_compiler_init(&compiler, &options); if(result != AMAL_COMPILER_OK) { - fprintf(stderr, "Failed to initialize compiler, error code: %d\n", result); - FAIL_TEST(data.filepath); + fprintf(stderr, "Failed to initialize compiler to test %s, error code: %d\n", full_path, result); + FAIL_TEST(full_path); } result = amal_compiler_load_file(&compiler, filepath); if(result != AMAL_COMPILER_OK) { - fprintf(stderr, "Failed to load file %s, result: %d\n", data.filepath, result); - FAIL_TEST(data.filepath); + fprintf(stderr, "Failed to load file %s, result: %d\n", full_path, result); + FAIL_TEST(full_path); } if(amal_compiler_deinit(&compiler) != 0) { - fprintf(stderr, "Failed to deinitialize compiler.\n"); - FAIL_TEST(data.filepath); + fprintf(stderr, "Failed to deinitialize compiler for test %s\n", full_path); + FAIL_TEST(full_path); } - fprintf(stderr, "Test succeeded: %s\n", data.filepath); - free(data.filepath); + fprintf(stderr, "Test succeeded as expected: %s\n", full_path); + ++num_successful_tests; + free(full_path); } static void test_load_error(const char *filepath, const char *expected_error) { @@ -155,6 +164,7 @@ static void test_load_error(const char *filepath, const char *expected_error) { int result; amal_compiler_options_init(&options); + ++num_tests_run; options.error_callback = error_callback_assert; ErrorExpectedData expected_data; expected_data.filepath = get_full_path(filepath); @@ -184,7 +194,8 @@ static void test_load_error(const char *filepath, const char *expected_error) { FAIL_TEST(expected_data.filepath); } - fprintf(stderr, "Test succeeded: %s\n", expected_data.filepath); + fprintf(stderr, "Test failed as expected: %s\n", expected_data.filepath); + ++num_successful_tests; free(expected_data.filepath); free(expected_data.expected_error); } @@ -205,11 +216,17 @@ int main(int argc, char **argv) { " pub const num = 45;\n" " ^\n"); test_load_error("tests/errors/closure_no_lhs.amal", - "1:1: error: Expected variable declaration, string, variable or function call\n" + "1:1: error: Expected string, variable, closure, struct, function call or import\n" "fn {}\n" "^\n"); + test_load_error("tests/errors/const_assign.amal", + "3:5: error: Can't assign to a const value\n" + " value = 34;\n" + " ^\n"); + fprintf(stderr, "##### %d/%d tests succeeded #####\n", num_successful_tests, num_tests_run); } else if(argc == 2) { test_load(argv[1]); + fprintf(stderr, "##### %d/%d tests succeeded #####\n", num_successful_tests, num_tests_run); } else { fprintf(stderr, "usage: test [test-file-path]\n"); fprintf(stderr, "examples:\n"); diff --git a/tests/sub/a.amal.z b/tests/sub/a.amal.z index e0c566e..e69de29 100644 --- a/tests/sub/a.amal.z +++ b/tests/sub/a.amal.z @@ -1,2 +0,0 @@ -typedef i64 signed long long; -typedef f64 double; -- cgit v1.2.3