michael@0: /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- michael@0: * vim: set ts=8 sts=4 et sw=4 tw=99: michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "jsapi-tests/tests.h" michael@0: michael@0: #include michael@0: michael@0: #include "js/RootingAPI.h" michael@0: michael@0: JSAPITest *JSAPITest::list; michael@0: michael@0: bool JSAPITest::init() michael@0: { michael@0: rt = createRuntime(); michael@0: if (!rt) michael@0: return false; michael@0: cx = createContext(); michael@0: if (!cx) michael@0: return false; michael@0: JS_BeginRequest(cx); michael@0: JS::RootedObject global(cx, createGlobal()); michael@0: if (!global) michael@0: return false; michael@0: JS_EnterCompartment(cx, global); michael@0: return true; michael@0: } michael@0: michael@0: bool JSAPITest::exec(const char *bytes, const char *filename, int lineno) michael@0: { michael@0: JS::RootedValue v(cx); michael@0: JS::HandleObject global = JS::HandleObject::fromMarkedLocation(this->global.unsafeGet()); michael@0: return JS_EvaluateScript(cx, global, bytes, strlen(bytes), filename, lineno, &v) || michael@0: fail(bytes, filename, lineno); michael@0: } michael@0: michael@0: bool JSAPITest::evaluate(const char *bytes, const char *filename, int lineno, michael@0: JS::MutableHandleValue vp) michael@0: { michael@0: JS::HandleObject global = JS::HandleObject::fromMarkedLocation(this->global.unsafeGet()); michael@0: return JS_EvaluateScript(cx, global, bytes, strlen(bytes), filename, lineno, vp) || michael@0: fail(bytes, filename, lineno); michael@0: } michael@0: michael@0: bool JSAPITest::definePrint() michael@0: { michael@0: JS::HandleObject global = JS::HandleObject::fromMarkedLocation(this->global.unsafeGet()); michael@0: return JS_DefineFunction(cx, global, "print", (JSNative) print, 0, 0); michael@0: } michael@0: michael@0: JSObject * JSAPITest::createGlobal(JSPrincipals *principals) michael@0: { michael@0: /* Create the global object. */ michael@0: JS::CompartmentOptions options; michael@0: options.setVersion(JSVERSION_LATEST); michael@0: global = JS_NewGlobalObject(cx, getGlobalClass(), principals, JS::FireOnNewGlobalHook, options); michael@0: if (!global) michael@0: return nullptr; michael@0: JS::AddNamedObjectRoot(cx, &global, "test-global"); michael@0: JS::HandleObject globalHandle = JS::HandleObject::fromMarkedLocation(global.unsafeGet()); michael@0: JSAutoCompartment ac(cx, globalHandle); michael@0: michael@0: /* Populate the global object with the standard globals, like Object and michael@0: Array. */ michael@0: if (!JS_InitStandardClasses(cx, globalHandle)) michael@0: return nullptr; michael@0: return global; michael@0: } michael@0: michael@0: int main(int argc, char *argv[]) michael@0: { michael@0: int total = 0; michael@0: int failures = 0; michael@0: const char *filter = (argc == 2) ? argv[1] : nullptr; michael@0: michael@0: if (!JS_Init()) { michael@0: printf("TEST-UNEXPECTED-FAIL | jsapi-tests | JS_Init() failed.\n"); michael@0: return 1; michael@0: } michael@0: michael@0: for (JSAPITest *test = JSAPITest::list; test; test = test->next) { michael@0: const char *name = test->name(); michael@0: if (filter && strstr(name, filter) == nullptr) michael@0: continue; michael@0: michael@0: total += 1; michael@0: michael@0: printf("%s\n", name); michael@0: if (!test->init()) { michael@0: printf("TEST-UNEXPECTED-FAIL | %s | Failed to initialize.\n", name); michael@0: failures++; michael@0: continue; michael@0: } michael@0: michael@0: JS::HandleObject global = JS::HandleObject::fromMarkedLocation(test->global.unsafeGet()); michael@0: if (test->run(global)) { michael@0: printf("TEST-PASS | %s | ok\n", name); michael@0: } else { michael@0: JSAPITestString messages = test->messages(); michael@0: printf("%s | %s | %.*s\n", michael@0: (test->knownFail ? "TEST-KNOWN-FAIL" : "TEST-UNEXPECTED-FAIL"), michael@0: name, (int) messages.length(), messages.begin()); michael@0: if (!test->knownFail) michael@0: failures++; michael@0: } michael@0: test->uninit(); michael@0: } michael@0: michael@0: JS_ShutDown(); michael@0: michael@0: if (failures) { michael@0: printf("\n%d unexpected failure%s.\n", failures, (failures == 1 ? "" : "s")); michael@0: return 1; michael@0: } michael@0: printf("\nPassed: ran %d tests.\n", total); michael@0: return 0; michael@0: }