FunctionOverridesTest.cpp [plain text]
#include "config.h"
#include "FunctionOverridesTest.h"
#include "FunctionOverrides.h"
#include "InitializeThreading.h"
#include "JSContextRefPrivate.h"
#include "JavaScript.h"
#include "Options.h"
#include <string>
using JSC::Options;
int testFunctionOverrides()
{
bool failed = false;
JSC::initializeThreading();
Options::initialize();
const char* oldFunctionOverrides = Options::functionOverrides();
Options::functionOverrides() = "./testapiScripts/testapi-function-overrides.js";
JSC::FunctionOverrides::reinstallOverrides();
JSGlobalContextRef context = JSGlobalContextCreateInGroup(nullptr, nullptr);
JSObjectRef globalObject = JSContextGetGlobalObject(context);
ASSERT_UNUSED(globalObject, JSValueIsObject(context, globalObject));
const char* scriptString =
"var str = '';" "\n"
"function f1() { /* Original f1 */ }" "\n"
"str += f1 + '\\n';" "\n"
"var f2 = function() {" "\n"
" // Original f2" "\n"
"}" "\n"
"str += f2 + '\\n';" "\n"
"str += (function() { /* Original f3 */ }) + '\\n';" "\n"
"var f4Source = '/* Original f4 */'" "\n"
"var f4 = new Function(f4Source);" "\n"
"str += f4 + '\\n';" "\n"
"\n"
"var expectedStr =" "\n"
"'function f1() { /* Overridden f1 */ }\\n"
"function () { /* Overridden f2 */ }\\n"
"function () { /* Overridden f3 */ }\\n"
"function anonymous() { /* Overridden f4 */ }\\n';"
"var result = (str == expectedStr);" "\n"
"result";
JSStringRef script = JSStringCreateWithUTF8CString(scriptString);
JSValueRef exception = nullptr;
JSValueRef resultRef = JSEvaluateScript(context, script, nullptr, nullptr, 1, &exception);
JSStringRelease(script);
if (!JSValueIsBoolean(context, resultRef) || !JSValueToBoolean(context, resultRef))
failed = true;
JSGlobalContextRelease(context);
JSC::Options::functionOverrides() = oldFunctionOverrides;
JSC::FunctionOverrides::reinstallOverrides();
printf("%s: function override tests.\n", failed ? "FAIL" : "PASS");
return failed;
}