diff --git a/Meta/Lagom/CMakeLists.txt b/Meta/Lagom/CMakeLists.txt index dd8621214da..c1ba75fe344 100644 --- a/Meta/Lagom/CMakeLists.txt +++ b/Meta/Lagom/CMakeLists.txt @@ -656,7 +656,6 @@ if (BUILD_LAGOM) # Extra tests from Tests/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) # Spreadsheet diff --git a/Tests/LibJS/CMakeLists.txt b/Tests/LibJS/CMakeLists.txt index 08b8bf97b77..5a66683f3a5 100644 --- a/Tests/LibJS/CMakeLists.txt +++ b/Tests/LibJS/CMakeLists.txt @@ -6,9 +6,6 @@ link_with_locale_data(test-js) serenity_test(test-invalid-unicode-js.cpp LibJS LIBS LibJS LibLocale) 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) link_with_locale_data(test-value-js) diff --git a/Tests/LibJS/test-bytecode-js.cpp b/Tests/LibJS/test-bytecode-js.cpp deleted file mode 100644 index 833c42419b3..00000000000 --- a/Tests/LibJS/test-bytecode-js.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 2022, David Tuin - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define SETUP_AND_PARSE(source) \ - auto vm = MUST(JS::VM::create()); \ - auto ast_interpreter = JS::Interpreter::create(*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. - 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');"); -}