mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-10-26 14:57:54 +03:00
Tests: Remove test-bytecode-js
This was meant to be a temporary unit testuntil we could run test-js in bytecode mode. This has been possible for a long time now, so let's remove the unnecessary extra program.
This commit is contained in:
parent
b7c30f3096
commit
6150960671
Notes:
sideshowbarker
2024-07-17 08:36:27 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/6150960671 Pull-request: https://github.com/SerenityOS/serenity/pull/19560 Reviewed-by: https://github.com/mattco98
@ -656,7 +656,6 @@ if (BUILD_LAGOM)
|
|||||||
|
|
||||||
# Extra tests from Tests/LibJS
|
# Extra tests from Tests/LibJS
|
||||||
lagom_test(../../Tests/LibJS/test-invalid-unicode-js.cpp LIBS LibJS)
|
lagom_test(../../Tests/LibJS/test-invalid-unicode-js.cpp LIBS LibJS)
|
||||||
lagom_test(../../Tests/LibJS/test-bytecode-js.cpp LIBS LibJS)
|
|
||||||
lagom_test(../../Tests/LibJS/test-value-js.cpp LIBS LibJS)
|
lagom_test(../../Tests/LibJS/test-value-js.cpp LIBS LibJS)
|
||||||
|
|
||||||
# Spreadsheet
|
# Spreadsheet
|
||||||
|
@ -6,9 +6,6 @@ link_with_locale_data(test-js)
|
|||||||
serenity_test(test-invalid-unicode-js.cpp LibJS LIBS LibJS LibLocale)
|
serenity_test(test-invalid-unicode-js.cpp LibJS LIBS LibJS LibLocale)
|
||||||
link_with_locale_data(test-invalid-unicode-js)
|
link_with_locale_data(test-invalid-unicode-js)
|
||||||
|
|
||||||
serenity_test(test-bytecode-js.cpp LibJS LIBS LibJS LibLocale)
|
|
||||||
link_with_locale_data(test-bytecode-js)
|
|
||||||
|
|
||||||
serenity_test(test-value-js.cpp LibJS LIBS LibJS LibLocale)
|
serenity_test(test-value-js.cpp LibJS LIBS LibJS LibLocale)
|
||||||
link_with_locale_data(test-value-js)
|
link_with_locale_data(test-value-js)
|
||||||
|
|
||||||
|
@ -1,137 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2022, David Tuin <davidot@serenityos.org>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <LibJS/AST.h>
|
|
||||||
#include <LibJS/Bytecode/Generator.h>
|
|
||||||
#include <LibJS/Bytecode/Interpreter.h>
|
|
||||||
#include <LibJS/Bytecode/PassManager.h>
|
|
||||||
#include <LibJS/Interpreter.h>
|
|
||||||
#include <LibJS/Runtime/VM.h>
|
|
||||||
#include <LibJS/Script.h>
|
|
||||||
#include <LibTest/TestCase.h>
|
|
||||||
|
|
||||||
#define SETUP_AND_PARSE(source) \
|
|
||||||
auto vm = MUST(JS::VM::create()); \
|
|
||||||
auto ast_interpreter = JS::Interpreter::create<JS::GlobalObject>(*vm); \
|
|
||||||
\
|
|
||||||
auto script = MUST(JS::Script::parse(source##sv, ast_interpreter->realm())); \
|
|
||||||
auto const& program = script->parse_node(); \
|
|
||||||
JS::Bytecode::Interpreter bytecode_interpreter(ast_interpreter->realm());
|
|
||||||
|
|
||||||
#define EXPECT_NO_EXCEPTION(executable) \
|
|
||||||
auto executable = MUST(JS::Bytecode::Generator::generate(program)); \
|
|
||||||
auto result = bytecode_interpreter.run(*script); \
|
|
||||||
if (result.is_error()) { \
|
|
||||||
FAIL("unexpected exception"); \
|
|
||||||
dbgln("Error: {}", MUST(result.throw_completion().value()->to_deprecated_string(vm))); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define EXPECT_NO_EXCEPTION_WITH_OPTIMIZATIONS(executable) \
|
|
||||||
auto& passes = JS::Bytecode::Interpreter::optimization_pipeline(); \
|
|
||||||
passes.perform(*executable); \
|
|
||||||
\
|
|
||||||
auto result_with_optimizations = bytecode_interpreter.run(*executable); \
|
|
||||||
\
|
|
||||||
if (result_with_optimizations.is_error()) { \
|
|
||||||
FAIL("unexpected exception"); \
|
|
||||||
dbgln("Error: {}", MUST(result_with_optimizations.throw_completion().value()->to_deprecated_string(vm))); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define EXPECT_NO_EXCEPTION_ALL(source) \
|
|
||||||
SETUP_AND_PARSE("(() => {\n" source "\n})()") \
|
|
||||||
EXPECT_NO_EXCEPTION(executable) \
|
|
||||||
EXPECT_NO_EXCEPTION_WITH_OPTIMIZATIONS(executable)
|
|
||||||
|
|
||||||
TEST_CASE(empty_program)
|
|
||||||
{
|
|
||||||
EXPECT_NO_EXCEPTION_ALL("");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE(if_statement_pass)
|
|
||||||
{
|
|
||||||
EXPECT_NO_EXCEPTION_ALL("if (false) throw new Exception('failed');");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE(if_statement_fail)
|
|
||||||
{
|
|
||||||
SETUP_AND_PARSE("if (true) throw new Exception('failed');");
|
|
||||||
|
|
||||||
auto executable = MUST(JS::Bytecode::Generator::generate(program));
|
|
||||||
auto result = bytecode_interpreter.run(*executable);
|
|
||||||
EXPECT(result.is_error());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE(trivial_program)
|
|
||||||
{
|
|
||||||
EXPECT_NO_EXCEPTION_ALL("if (1 + 1 !== 2) throw new Exception('failed');");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE(variables)
|
|
||||||
{
|
|
||||||
EXPECT_NO_EXCEPTION_ALL("var a = 1; \n"
|
|
||||||
"if (a + 1 !== 2) throw new Exception('failed'); ");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE(function_call)
|
|
||||||
{
|
|
||||||
EXPECT_NO_EXCEPTION_ALL("if (!isNaN(NaN)) throw new Exception('failed'); ");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE(function_delcaration_and_call)
|
|
||||||
{
|
|
||||||
EXPECT_NO_EXCEPTION_ALL("var passed = false; \n"
|
|
||||||
"function f() { passed = true; return 1; }\n"
|
|
||||||
"if (f() !== 1) throw new Exception('failed');\n"
|
|
||||||
// The passed !== true is needed as otherwise UBSAN
|
|
||||||
// complains about unaligned access, until that
|
|
||||||
// is fixed or ignored care must be taken to prevent such cases in tests.
|
|
||||||
"if (passed !== true) throw new Exception('failed');");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE(generator_function_call)
|
|
||||||
{
|
|
||||||
EXPECT_NO_EXCEPTION_ALL("function *g() { yield 2; }\n"
|
|
||||||
"var gen = g();\n"
|
|
||||||
"var result = gen.next();\n"
|
|
||||||
"if (result.value !== 2) throw new Exception('failed');");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE(loading_multiple_files)
|
|
||||||
{
|
|
||||||
// This is a testcase which is very much like test-js and test262
|
|
||||||
// which load some common files first and only then the actual test file.
|
|
||||||
|
|
||||||
SETUP_AND_PARSE("function f() { return 'hello'; }");
|
|
||||||
|
|
||||||
{
|
|
||||||
EXPECT_NO_EXCEPTION(common_file_executable);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
auto test_file_script = MUST(JS::Script::parse(
|
|
||||||
"if (f() !== 'hello') throw new Exception('failed'); "sv, ast_interpreter->realm()));
|
|
||||||
|
|
||||||
// TODO: This could be TRY_OR_FAIL(), if someone implements Formatter<JS::Completion>.
|
|
||||||
MUST(bytecode_interpreter.run(test_file_script));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE(catch_exception)
|
|
||||||
{
|
|
||||||
// FIXME: Currently it seems that try/catch with finally is broken so we test both at once.
|
|
||||||
EXPECT_NO_EXCEPTION_ALL("var hitCatch = false;\n"
|
|
||||||
"var hitFinally = false;\n"
|
|
||||||
"try {\n"
|
|
||||||
" a();\n"
|
|
||||||
"} catch (e) {\n"
|
|
||||||
" hitCatch = e instanceof ReferenceError;\n"
|
|
||||||
" !1\n" // This is here to fix the alignment issue until that is actually resolved.
|
|
||||||
"} finally {\n"
|
|
||||||
" hitFinally = true;\n"
|
|
||||||
"}\n"
|
|
||||||
"if (hitCatch !== true) throw new Exception('failed');\n"
|
|
||||||
"if (hitFinally !== true) throw new Exception('failed');");
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user