diff options
author | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-16 01:38:49 +0000 |
---|---|---|
committer | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-16 01:38:49 +0000 |
commit | 7896d694115cb2e64971ed0df60f61e3df2f7375 (patch) | |
tree | c2778927f7bbef5ee5c1e7cae3a941b097e139ae /chrome/test/v8_unit_test.cc | |
parent | 6fa342707a9979b60fa0321f27983d170d728c66 (diff) | |
download | chromium_src-7896d694115cb2e64971ed0df60f61e3df2f7375.zip chromium_src-7896d694115cb2e64971ed0df60f61e3df2f7375.tar.gz chromium_src-7896d694115cb2e64971ed0df60f61e3df2f7375.tar.bz2 |
Commit issue 19737: Partial implementation of tests for
Greasemonkey API.
Review URL: http://codereview.chromium.org/21387
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@9847 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/test/v8_unit_test.cc')
-rw-r--r-- | chrome/test/v8_unit_test.cc | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/chrome/test/v8_unit_test.cc b/chrome/test/v8_unit_test.cc new file mode 100644 index 0000000..43db5f1 --- /dev/null +++ b/chrome/test/v8_unit_test.cc @@ -0,0 +1,93 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <iostream> + +#include "base/string_util.h" +#include "chrome/test/v8_unit_test.h" + +void V8UnitTest::SetUp() { + v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); + global->Set(v8::String::New("log"), + v8::FunctionTemplate::New(&V8UnitTest::Log)); + context_ = v8::Context::New(NULL, global); +} + +void V8UnitTest::ExecuteScriptInContext(const StringPiece& script_source, + const StringPiece& script_name) { + v8::Context::Scope context_scope(context_); + v8::HandleScope handle_scope; + v8::Handle<v8::String> source = v8::String::New(script_source.data(), + script_source.size()); + v8::Handle<v8::String> name = v8::String::New(script_name.data(), + script_source.size()); + + v8::TryCatch try_catch; + v8::Handle<v8::Script> script = v8::Script::Compile(source, name); + // Ensure the script compiled without errors. + if (script.IsEmpty()) { + FAIL() << ExceptionToString(&try_catch); + } + v8::Handle<v8::Value> result = script->Run(); + // Ensure the script ran without errors. + if (result.IsEmpty()) { + FAIL() << ExceptionToString(&try_catch); + } +} + +std::string V8UnitTest::ExceptionToString(v8::TryCatch* try_catch) { + std::string str; + v8::HandleScope handle_scope; + v8::String::Utf8Value exception(try_catch->Exception()); + v8::Handle<v8::Message> message = try_catch->Message(); + if (message.IsEmpty()) { + str.append(StringPrintf("%s\n", *exception)); + } else { + v8::String::Utf8Value filename(message->GetScriptResourceName()); + int linenum = message->GetLineNumber(); + int colnum = message->GetStartColumn(); + str.append(StringPrintf("%s:%i:%i %s\n", *filename, linenum, colnum, + *exception)); + v8::String::Utf8Value sourceline(message->GetSourceLine()); + str.append(StringPrintf("%s\n", *sourceline)); + } + return str; +} + +void V8UnitTest::TestFunction(const std::string& function_name) { + v8::Context::Scope context_scope(context_); + v8::HandleScope handle_scope; + + v8::Handle<v8::Value> functionProperty = + context_->Global()->Get(v8::String::New(function_name.c_str())); + ASSERT_FALSE(functionProperty.IsEmpty()); + ASSERT_TRUE(functionProperty->IsFunction()); + v8::Handle<v8::Function> function = + v8::Handle<v8::Function>::Cast(functionProperty); + + v8::TryCatch try_catch; + v8::Handle<v8::Value> result = function->Call(context_->Global(), 0, NULL); + // The test fails if an exception was thrown. + if (result.IsEmpty()) { + FAIL() << ExceptionToString(&try_catch); + } +} + +// static +v8::Handle<v8::Value> V8UnitTest::Log(const v8::Arguments& args) { + std::string message; + bool first = true; + for (int i = 0; i < args.Length(); i++) { + v8::HandleScope handle_scope; + if (first) { + first = false; + } else { + message += " "; + } + v8::String::Utf8Value str(args[i]); + message += *str; + } + std::cout << message << "\n"; + return v8::Undefined(); +} |