Add unit tests for event.js


BUG=121479
TEST=supplied unit tests


Review URL: https://chromiumcodereview.appspot.com/10383035

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@136200 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/renderer/extensions/event_unittest.cc b/chrome/renderer/extensions/event_unittest.cc
new file mode 100644
index 0000000..ca1d9b04
--- /dev/null
+++ b/chrome/renderer/extensions/event_unittest.cc
@@ -0,0 +1,89 @@
+// 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 "grit/renderer_resources.h"
+
+namespace {
+
+class EventUnittest : public ModuleSystemTest {
+  virtual void SetUp() OVERRIDE {
+    ModuleSystemTest::SetUp();
+    module_system_->RunString("chrome = {};", "setup-chrome");
+
+    RegisterModule("event", IDR_EVENT_BINDINGS_JS);
+
+    // Mock out the native handler for event_bindings. These mocks will fail if
+    // any invariants maintained by the real event_bindings are broken.
+    OverrideNativeHandler("event_bindings",
+        "var assert = requireNative('assert');"
+        "var attachedListeners = exports.attachedListeners = {};"
+        "exports.AttachEvent = function(eventName) {"
+        "  assert.AssertFalse(!!attachedListeners[eventName]);"
+        "  attachedListeners[eventName] = 1;"
+        "};"
+        "exports.DetachEvent = function(eventName) {"
+        "  assert.AssertTrue(!!attachedListeners[eventName]);"
+        "  delete attachedListeners[eventName];"
+        "};");
+    OverrideNativeHandler("chrome_hidden",
+        "var chromeHidden = {};"
+        "exports.GetChromeHidden = function() { return chromeHidden; };");
+  }
+};
+
+TEST_F(EventUnittest, TestNothing) {
+  ExpectNoAssertionsMade();
+}
+
+TEST_F(EventUnittest, AddRemoveTwoListeners) {
+  ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+  RegisterModule("test",
+      "var assert = requireNative('assert');"
+      "var event = require('event');"
+      "var eventBindings = requireNative('event_bindings');"
+      "var myEvent = new event.Event('named-event');"
+      "var cb1 = function() {};"
+      "var cb2 = function() {};"
+      "myEvent.addListener(cb1);"
+      "myEvent.addListener(cb2);"
+      "myEvent.removeListener(cb1);"
+      "assert.AssertTrue(!!eventBindings.attachedListeners['named-event']);"
+      "myEvent.removeListener(cb2);"
+      "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);");
+  module_system_->Require("test");
+}
+
+TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) {
+  ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+  RegisterModule("test",
+      "var event = require('event');"
+      "var eventOpts = {supportsRules: true};"
+      "var assert = requireNative('assert');"
+      "var caught = false;"
+      "try {"
+      "  var myEvent = new event.Event(undefined, undefined, eventOpts);"
+      "} catch (e) {"
+      "  caught = true;"
+      "}"
+      "assert.AssertTrue(caught);");
+  module_system_->Require("test");
+}
+
+TEST_F(EventUnittest, NamedEventDispatch) {
+  ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+  RegisterModule("test",
+      "var event = require('event');"
+      "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();"
+      "var assert = requireNative('assert');"
+      "var e = new event.Event('myevent');"
+      "var called = false;"
+      "e.addListener(function() { called = true; });"
+      "chromeHidden.Event.dispatch('myevent', []);"
+      "assert.AssertTrue(called);");
+  module_system_->Require("test");
+}
+
+}  // namespace