summaryrefslogtreecommitdiffstats
path: root/chrome/test/base/module_system_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/test/base/module_system_test.cc')
-rw-r--r--chrome/test/base/module_system_test.cc116
1 files changed, 116 insertions, 0 deletions
diff --git a/chrome/test/base/module_system_test.cc b/chrome/test/base/module_system_test.cc
new file mode 100644
index 0000000..2a4e529
--- /dev/null
+++ b/chrome/test/base/module_system_test.cc
@@ -0,0 +1,116 @@
+// Copyright (c) 2012 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 "chrome/test/base/module_system_test.h"
+
+#include "base/callback.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/string_piece.h"
+#include "chrome/renderer/native_handler.h"
+
+#include <map>
+#include <string>
+
+// Native JS functions for doing asserts.
+class AssertNatives : public NativeHandler {
+ public:
+ AssertNatives()
+ : assertion_made_(false),
+ failed_(false) {
+ RouteFunction("AssertTrue", base::Bind(&AssertNatives::AssertTrue,
+ base::Unretained(this)));
+ RouteFunction("AssertFalse", base::Bind(&AssertNatives::AssertFalse,
+ base::Unretained(this)));
+ }
+
+ bool assertion_made() { return assertion_made_; }
+ bool failed() { return failed_; }
+
+ v8::Handle<v8::Value> AssertTrue(const v8::Arguments& args) {
+ CHECK_EQ(1, args.Length());
+ assertion_made_ = true;
+ failed_ = failed_ || !args[0]->ToBoolean()->Value();
+ return v8::Undefined();
+ }
+
+ v8::Handle<v8::Value> AssertFalse(const v8::Arguments& args) {
+ CHECK_EQ(1, args.Length());
+ assertion_made_ = true;
+ failed_ = failed_ || args[0]->ToBoolean()->Value();
+ return v8::Undefined();
+ }
+
+ private:
+ bool assertion_made_;
+ bool failed_;
+};
+
+// Source map that operates on std::strings.
+class StringSourceMap : public ModuleSystem::SourceMap {
+ public:
+ StringSourceMap() {}
+ virtual ~StringSourceMap() {}
+
+ v8::Handle<v8::Value> GetSource(const std::string& name) OVERRIDE {
+ if (source_map_.count(name) == 0)
+ return v8::Undefined();
+ return v8::String::New(source_map_[name].c_str());
+ }
+
+ bool Contains(const std::string& name) OVERRIDE {
+ return source_map_.count(name);
+ }
+
+ void RegisterModule(const std::string& name, const std::string& source) {
+ CHECK_EQ(0u, source_map_.count(name));
+ source_map_[name] = source;
+ }
+
+ private:
+ std::map<std::string, std::string> source_map_;
+};
+
+ModuleSystemTest::ModuleSystemTest()
+ : context_(v8::Context::New()),
+ source_map_(new StringSourceMap()),
+ should_assertions_be_made_(true) {
+ context_->Enter();
+ assert_natives_ = new AssertNatives();
+ module_system_.reset(new ModuleSystem(context_, source_map_.get()));
+ module_system_->RegisterNativeHandler("assert", scoped_ptr<NativeHandler>(
+ assert_natives_));
+ try_catch_.SetCaptureMessage(true);
+}
+
+ModuleSystemTest::~ModuleSystemTest() {
+ module_system_.reset();
+ context_->Exit();
+ context_.Dispose();
+}
+
+void ModuleSystemTest::RegisterModule(const std::string& name,
+ const std::string& code) {
+ source_map_->RegisterModule(name, code);
+}
+
+void ModuleSystemTest::TearDown() {
+ EXPECT_FALSE(try_catch_.HasCaught())
+ << *v8::String::Utf8Value(try_catch_.Message()->Get());
+ // All tests must assert at least once unless otherwise specified.
+ EXPECT_EQ(should_assertions_be_made_,
+ assert_natives_->assertion_made());
+ EXPECT_FALSE(assert_natives_->failed());
+}
+
+void ModuleSystemTest::ExpectNoAssertionsMade() {
+ should_assertions_be_made_ = false;
+}
+
+v8::Handle<v8::Object> ModuleSystemTest::CreateGlobal(const std::string& name) {
+ v8::HandleScope handle_scope;
+ v8::Handle<v8::Object> object = v8::Object::New();
+ v8::Context::GetCurrent()->Global()->Set(v8::String::New(name.c_str()),
+ object);
+ return handle_scope.Close(object);
+}