diff options
Diffstat (limited to 'js/src/jsapi-tests/tests.cpp')
-rw-r--r-- | js/src/jsapi-tests/tests.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/js/src/jsapi-tests/tests.cpp b/js/src/jsapi-tests/tests.cpp new file mode 100644 index 000000000..afd6af06b --- /dev/null +++ b/js/src/jsapi-tests/tests.cpp @@ -0,0 +1,149 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "jsapi-tests/tests.h" + +#include <stdio.h> + +#include "js/Initialization.h" +#include "js/RootingAPI.h" + +JSAPITest* JSAPITest::list; + +bool JSAPITest::init() +{ + cx = createContext(); + if (!cx) + return false; + if (!JS::InitSelfHostedCode(cx)) + return false; + JS_BeginRequest(cx); + global.init(cx); + createGlobal(); + if (!global) + return false; + JS_EnterCompartment(cx, global); + return true; +} + +void JSAPITest::uninit() +{ + if (oldCompartment) { + JS_LeaveCompartment(cx, oldCompartment); + oldCompartment = nullptr; + } + if (global) { + JS_LeaveCompartment(cx, nullptr); + global = nullptr; + } + if (cx) { + JS_EndRequest(cx); + destroyContext(); + cx = nullptr; + } +} + +bool JSAPITest::exec(const char* bytes, const char* filename, int lineno) +{ + JS::RootedValue v(cx); + JS::CompileOptions opts(cx); + opts.setFileAndLine(filename, lineno); + return JS::Evaluate(cx, opts, bytes, strlen(bytes), &v) || + fail(JSAPITestString(bytes), filename, lineno); +} + +bool JSAPITest::execDontReport(const char* bytes, const char* filename, int lineno) +{ + JS::RootedValue v(cx); + JS::CompileOptions opts(cx); + opts.setFileAndLine(filename, lineno); + return JS::Evaluate(cx, opts, bytes, strlen(bytes), &v); +} + +bool JSAPITest::evaluate(const char* bytes, const char* filename, int lineno, + JS::MutableHandleValue vp) +{ + JS::CompileOptions opts(cx); + opts.setFileAndLine(filename, lineno); + return JS::Evaluate(cx, opts, bytes, strlen(bytes), vp) || + fail(JSAPITestString(bytes), filename, lineno); +} + +bool JSAPITest::definePrint() +{ + return JS_DefineFunction(cx, global, "print", (JSNative) print, 0, 0); +} + +JSObject* JSAPITest::createGlobal(JSPrincipals* principals) +{ + /* Create the global object. */ + JS::RootedObject newGlobal(cx); + JS::CompartmentOptions options; + options.behaviors().setVersion(JSVERSION_LATEST); + newGlobal = JS_NewGlobalObject(cx, getGlobalClass(), principals, JS::FireOnNewGlobalHook, + options); + if (!newGlobal) + return nullptr; + + JSAutoCompartment ac(cx, newGlobal); + + // Populate the global object with the standard globals like Object and + // Array. + if (!JS_InitStandardClasses(cx, newGlobal)) + return nullptr; + + global = newGlobal; + return newGlobal; +} + +int main(int argc, char* argv[]) +{ + int total = 0; + int failures = 0; + const char* filter = (argc == 2) ? argv[1] : nullptr; + + if (!JS_Init()) { + printf("TEST-UNEXPECTED-FAIL | jsapi-tests | JS_Init() failed.\n"); + return 1; + } + + for (JSAPITest* test = JSAPITest::list; test; test = test->next) { + const char* name = test->name(); + if (filter && strstr(name, filter) == nullptr) + continue; + + total += 1; + + printf("%s\n", name); + if (!test->init()) { + printf("TEST-UNEXPECTED-FAIL | %s | Failed to initialize.\n", name); + failures++; + test->uninit(); + continue; + } + + if (test->run(test->global)) { + printf("TEST-PASS | %s | ok\n", name); + } else { + JSAPITestString messages = test->messages(); + printf("%s | %s | %.*s\n", + (test->knownFail ? "TEST-KNOWN-FAIL" : "TEST-UNEXPECTED-FAIL"), + name, (int) messages.length(), messages.begin()); + if (!test->knownFail) + failures++; + } + test->uninit(); + } + + JS_ShutDown(); + + if (failures) { + printf("\n%d unexpected failure%s.\n", failures, (failures == 1 ? "" : "s")); + return 1; + } + printf("\nPassed: ran %d tests.\n", total); + return 0; +} |