Index: ui/views/controls/menu/menu_runner_cocoa_unittest.mm |
diff --git a/ui/views/controls/menu/menu_runner_cocoa_unittest.mm b/ui/views/controls/menu/menu_runner_cocoa_unittest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b43c6e86ca0ae877cb7694e39b7443c53b1698d1 |
--- /dev/null |
+++ b/ui/views/controls/menu/menu_runner_cocoa_unittest.mm |
@@ -0,0 +1,107 @@ |
+// Copyright 2014 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. |
+ |
+#import "ui/views/controls/menu/menu_runner_impl_cocoa.h" |
+ |
+#include "base/strings/utf_string_conversions.h" |
+#include "ui/base/models/simple_menu_model.h" |
+#include "ui/events/event_utils.h" |
+#include "ui/views/test/views_test_base.h" |
+ |
+namespace views { |
+namespace test { |
+ |
+class MenuRunnerCocoaTest : public ViewsTestBase { |
+ public: |
+ MenuRunnerCocoaTest() : runner_(NULL) {} |
+ virtual ~MenuRunnerCocoaTest() {} |
+ |
+ virtual void SetUp() OVERRIDE { |
+ ViewsTestBase::SetUp(); |
+ |
+ menu_.reset(new ui::SimpleMenuModel(NULL)); |
+ menu_->AddItem(0, base::ASCIIToUTF16("Menu Item")); |
+ |
+ runner_ = new internal::MenuRunnerImplCocoa(menu_.get()); |
+ EXPECT_FALSE(runner_->IsRunning()); |
+ } |
+ |
+ virtual void TearDown() OVERRIDE { |
+ if (runner_) { |
+ runner_->Release(); |
+ runner_ = NULL; |
+ } |
+ |
+ ViewsTestBase::TearDown(); |
+ } |
+ |
+ // Runs the menu after scheduling |block| on the run loop. |
+ MenuRunner::RunResult RunMenu(dispatch_block_t block) { |
+ CFRunLoopPerformBlock(CFRunLoopGetCurrent(), kCFRunLoopCommonModes, ^{ |
+ EXPECT_TRUE(runner_->IsRunning()); |
+ block(); |
+ }); |
+ return runner_->RunMenuAt( |
+ NULL, NULL, gfx::Rect(), MENU_ANCHOR_TOPLEFT, MenuRunner::CONTEXT_MENU); |
+ } |
+ |
+ protected: |
+ scoped_ptr<ui::SimpleMenuModel> menu_; |
+ internal::MenuRunnerImplCocoa* runner_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MenuRunnerCocoaTest); |
+}; |
+ |
+TEST_F(MenuRunnerCocoaTest, RunMenuAndCancel) { |
+ base::TimeDelta min_time = ui::EventTimeForNow(); |
+ |
+ MenuRunner::RunResult result = RunMenu(^{ |
+ runner_->Cancel(); |
+ EXPECT_FALSE(runner_->IsRunning()); |
+ }); |
+ |
+ EXPECT_EQ(MenuRunner::NORMAL_EXIT, result); |
+ EXPECT_FALSE(runner_->IsRunning()); |
+ |
+ EXPECT_GE(runner_->GetClosingEventTime(), min_time); |
+ EXPECT_LE(runner_->GetClosingEventTime(), ui::EventTimeForNow()); |
+ |
+ // Cancel again. |
+ runner_->Cancel(); |
+ EXPECT_FALSE(runner_->IsRunning()); |
+} |
+ |
+TEST_F(MenuRunnerCocoaTest, RunMenuAndDelete) { |
+ MenuRunner::RunResult result = RunMenu(^{ |
+ runner_->Release(); |
+ runner_ = NULL; |
+ }); |
+ |
+ EXPECT_EQ(MenuRunner::MENU_DELETED, result); |
+} |
+ |
+TEST_F(MenuRunnerCocoaTest, RunMenuTwice) { |
+ for (int i = 0; i < 2; ++i) { |
+ MenuRunner::RunResult result = RunMenu(^{ |
+ runner_->Cancel(); |
+ }); |
+ EXPECT_EQ(MenuRunner::NORMAL_EXIT, result); |
+ EXPECT_FALSE(runner_->IsRunning()); |
+ } |
+} |
+ |
+TEST_F(MenuRunnerCocoaTest, CancelWithoutRunning) { |
+ runner_->Cancel(); |
+ EXPECT_FALSE(runner_->IsRunning()); |
+ EXPECT_EQ(base::TimeDelta(), runner_->GetClosingEventTime()); |
+} |
+ |
+TEST_F(MenuRunnerCocoaTest, DeleteWithoutRunning) { |
+ runner_->Release(); |
+ runner_ = NULL; |
+} |
+ |
+} // namespace test |
+} // namespace views |