blob: d19c2a6fb89c05ef92e88589fe98df13cce5feff [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <zircon/syscalls.h>
#include <string>
#include "gtest/gtest.h"
#include "quickjs-libc.h"
#include "quickjs.h"
// Sanity check test to make sure Hello World works.
TEST(Qjs, Sanity) {
JSRuntime *rt = JS_NewRuntime();
ASSERT_NE(rt, nullptr) << "Cannot allocate JS runtime";
js_std_init_handlers(rt);
JSContext *ctx = JS_NewContext(rt);
ASSERT_NE(ctx, nullptr) << "Cannot allocate JS context";
/* system modules */
js_init_module_std(ctx, "std");
js_init_module_os(ctx, "os");
const char *str =
"import * as std from 'std';\n"
"import * as os from 'os';\n"
"globalThis.std = std;\n"
"globalThis.os = os;\n";
JSValue init_compile =
JS_Eval(ctx, str, strlen(str), "<input>", JS_EVAL_TYPE_MODULE | JS_EVAL_FLAG_COMPILE_ONLY);
ASSERT_FALSE(JS_IsException(init_compile));
js_module_set_import_meta(ctx, init_compile, 1, 1);
JSValue init_run = JS_EvalFunction(ctx, init_compile);
ASSERT_FALSE(JS_IsException(init_run));
std::string hello_world = "Hello World";
std::string test_val = "globalThis.std.printf('" + hello_world + "');";
JSValue result = JS_Eval(ctx, test_val.c_str(), test_val.length(), "test", 0);
int32_t len;
int to_int_32;
if ((to_int_32 = JS_ToInt32(ctx, &len, result)) != 0) {
js_std_dump_error(ctx);
ASSERT_EQ(0, JS_ToInt32(ctx, &len, result));
}
ASSERT_EQ(hello_world.length(), len);
}
// Testing os.setTimeout, for 1ms wait.
TEST(Qjs, SetTimeout) {
JSRuntime *rt = JS_NewRuntime();
ASSERT_NE(rt, nullptr) << "Cannot allocate JS runtime";
js_std_init_handlers(rt);
JSContext *ctx = JS_NewContext(rt);
ASSERT_NE(ctx, nullptr) << "Cannot allocate JS context";
/* system modules */
js_init_module_std(ctx, "std");
js_init_module_os(ctx, "os");
const char *str =
"import * as std from 'std';\n"
"import * as os from 'os';\n"
"globalThis.std = std;\n"
"globalThis.os = os;\n";
JSValue init_compile =
JS_Eval(ctx, str, strlen(str), "<input>", JS_EVAL_TYPE_MODULE | JS_EVAL_FLAG_COMPILE_ONLY);
ASSERT_FALSE(JS_IsException(init_compile));
js_module_set_import_meta(ctx, init_compile, 1, 1);
JSValue init_run = JS_EvalFunction(ctx, init_compile);
ASSERT_FALSE(JS_IsException(init_run));
js_std_loop(ctx);
std::string test_val =
"var a = false;"
"os.setTimeout(() => {a = true;}, 1);";
JSValue intermediate = JS_Eval(ctx, test_val.c_str(), test_val.length(), "test", 0);
zx_nanosleep(zx_deadline_after(ZX_MSEC(1)));
js_std_loop(ctx);
std::string test_val2 = "c = a;";
JSValue result = JS_Eval(ctx, test_val2.c_str(), test_val2.length(), "test", 0);
bool result_as_bool = JS_ToBool(ctx, result);
ASSERT_EQ(result_as_bool, true);
}