annotate tests/code_exec.cpp @ 0:a4671277546c tip

created the repository for the thymian project
author ferencd
date Tue, 17 Aug 2021 11:19:54 +0200
parents
children
rev   line source
ferencd@0 1 #include "tests.h"
ferencd@0 2 #include "gtest/gtest.h"
ferencd@0 3
ferencd@0 4 /*
ferencd@0 5 * This file has the tests that are related to code execution in a
ferencd@0 6 * virtual machine as triggered by the "outsisde" world (ie: C runtime)
ferencd@0 7 */
ferencd@0 8
ferencd@0 9 /* Have some code in a VM.
ferencd@0 10 * Execute some other code in the VM.
ferencd@0 11 */
ferencd@0 12 TEST(CodeExecution, ExecuteSomeCodeInAVm)
ferencd@0 13 {
ferencd@0 14 nap_runtime* runtime = nap_runtime_create(0);
ferencd@0 15 int found_indicator = 0;
ferencd@0 16
ferencd@0 17 ASSERT_FALSE(runtime == NULL);
ferencd@0 18
ferencd@0 19 nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime,
ferencd@0 20 "int c = 0; \
ferencd@0 21 int a = 1; \
ferencd@0 22 int b = 2; \
ferencd@0 23 "
ferencd@0 24 ,0);
ferencd@0 25
ferencd@0 26 ASSERT_FALSE(bytecode == NULL);
ferencd@0 27 nap_runtime_execute(runtime, bytecode);
ferencd@0 28 nap_execute_code(runtime, "c = a + b");
ferencd@0 29 ASSERT_EQ(3, VAR_INT(c));
ferencd@0 30
ferencd@0 31 nap_runtime_shutdown(&runtime);
ferencd@0 32 ASSERT_TRUE(runtime == NULL);
ferencd@0 33 }
ferencd@0 34
ferencd@0 35
ferencd@0 36 /* Define a function. Call it via the runtime API
ferencd@0 37 * Use the function, see that it returns the default return value (0).
ferencd@0 38 */
ferencd@0 39 TEST(CodeExecution, ExternalCallingOfInternalMethod)
ferencd@0 40 {
ferencd@0 41 nap_runtime* runtime = nap_runtime_create(0);
ferencd@0 42 int found_indicator = 0;
ferencd@0 43
ferencd@0 44 ASSERT_FALSE(runtime == NULL);
ferencd@0 45
ferencd@0 46 nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime,
ferencd@0 47 "int c = 0; \
ferencd@0 48 int some_fun(int a , int b) \
ferencd@0 49 { \
ferencd@0 50 c = a + b; \
ferencd@0 51 }" ,0);
ferencd@0 52
ferencd@0 53 ASSERT_FALSE(bytecode == NULL);
ferencd@0 54 nap_runtime_execute(runtime, bytecode);
ferencd@0 55 nap_int_t p1 = 1;
ferencd@0 56 nap_int_t p2 = 2;
ferencd@0 57 nap_execute_method(runtime, 0, "some_fun", p1, p2);
ferencd@0 58 ASSERT_EQ(3, VAR_INT(c));
ferencd@0 59
ferencd@0 60 nap_runtime_shutdown(&runtime);
ferencd@0 61 ASSERT_TRUE(runtime == NULL);
ferencd@0 62 }
ferencd@0 63
ferencd@0 64
ferencd@0 65 /* Define a function. Call it via the runtime API
ferencd@0 66 * Use the function, see that it returns the default return value (0).
ferencd@0 67 */
ferencd@0 68 TEST(CodeExecution, ExternalCallingOfInternalMethodWithIntReturnType)
ferencd@0 69 {
ferencd@0 70 nap_runtime* runtime = nap_runtime_create(0);
ferencd@0 71 int found_indicator = 0;
ferencd@0 72
ferencd@0 73 ASSERT_FALSE(runtime == NULL);
ferencd@0 74
ferencd@0 75 nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime,
ferencd@0 76 "int c = 0; \
ferencd@0 77 int some_fun(int a , int b) \
ferencd@0 78 { \
ferencd@0 79 c = a + b; \
ferencd@0 80 return c; \
ferencd@0 81 }" ,0);
ferencd@0 82
ferencd@0 83 ASSERT_FALSE(bytecode == NULL);
ferencd@0 84 nap_runtime_execute(runtime, bytecode);
ferencd@0 85 nap_int_t p1 = 1;
ferencd@0 86 nap_int_t p2 = 2;
ferencd@0 87 nap_int_t ret = 0;
ferencd@0 88 nap_execute_method(runtime, &ret, "some_fun", p1, p2);
ferencd@0 89 ASSERT_EQ(3, VAR_INT(c));
ferencd@0 90 ASSERT_EQ(3, ret);
ferencd@0 91
ferencd@0 92 nap_runtime_shutdown(&runtime);
ferencd@0 93 ASSERT_TRUE(runtime == NULL);
ferencd@0 94 }
ferencd@0 95
ferencd@0 96 /* Define a function. Call it via the runtime API
ferencd@0 97 * Use the function, see that it returns the default return value (0).
ferencd@0 98 */
ferencd@0 99 TEST(CodeExecution, ExternalCallingOfInternalMethodWithStringReturnType)
ferencd@0 100 {
ferencd@0 101 nap_runtime* runtime = nap_runtime_create(0);
ferencd@0 102 int found_indicator = 0;
ferencd@0 103
ferencd@0 104 ASSERT_FALSE(runtime == NULL);
ferencd@0 105
ferencd@0 106 nap_bytecode_chunk* bytecode = nap_runtime_compile(runtime,
ferencd@0 107 "string c = \"ABC\"; \
ferencd@0 108 string some_fun(string a, string b) \
ferencd@0 109 { \
ferencd@0 110 c = a + b; \
ferencd@0 111 return c; \
ferencd@0 112 }" ,0);
ferencd@0 113
ferencd@0 114 ASSERT_FALSE(bytecode == NULL);
ferencd@0 115 nap_runtime_execute(runtime, bytecode);
ferencd@0 116 nap_string_t p1 = (nap_string_t)"DEF";
ferencd@0 117 nap_string_t p2 = (nap_string_t)"GHI";
ferencd@0 118 nap_string_t ret = 0;
ferencd@0 119 nap_execute_method(runtime, &ret, "some_fun", p1, p2);
ferencd@0 120 char *c = VAR_STRING(c);
ferencd@0 121 ASSERT_STREQ("DEFGHI", c);
ferencd@0 122 ASSERT_STREQ("DEFGHI", ret);
ferencd@0 123 free(ret);
ferencd@0 124 free(c);
ferencd@0 125
ferencd@0 126 nap_runtime_shutdown(&runtime);
ferencd@0 127 ASSERT_TRUE(runtime == NULL);
ferencd@0 128 }