172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file.
4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
5513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/message_loop.h"
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/reload_button.h"
7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
9513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass ReloadButtonTest : public testing::Test {
10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public:
11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ReloadButtonTest();
12513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void CheckState(bool enabled,
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                  ReloadButton::Mode intended_mode,
15513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                  ReloadButton::Mode visible_mode,
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                  bool double_click_timer_running,
17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                  bool stop_to_reload_timer_running);
18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // These accessors eliminate the need to declare each testcase as a friend.
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_mouse_hovered(bool hovered) {
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    reload_.testing_mouse_hovered_ = hovered;
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int reload_count() { return reload_.testing_reload_count_; }
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch protected:
26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // We need a message loop for the timers to post events.
27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  MessageLoop loop_;
28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ReloadButton reload_;
30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
32513209b27ff55e2841eac0e4120199c23acce758Ben MurdochReloadButtonTest::ReloadButtonTest() : reload_(NULL, NULL) {
33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Set the timer delays to 0 so that timers will fire as soon as we tell the
34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // message loop to run pending tasks.
35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.double_click_timer_delay_ = base::TimeDelta();
36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.stop_to_reload_timer_delay_ = base::TimeDelta();
37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
39513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid ReloadButtonTest::CheckState(bool enabled,
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  ReloadButton::Mode intended_mode,
41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  ReloadButton::Mode visible_mode,
42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  bool double_click_timer_running,
43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  bool stop_to_reload_timer_running) {
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(enabled, reload_.IsEnabled());
45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(intended_mode, reload_.intended_mode_);
46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(visible_mode, reload_.visible_mode_);
47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(double_click_timer_running,
48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch            reload_.double_click_timer_.IsRunning());
49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(stop_to_reload_timer_running,
50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch            reload_.stop_to_reload_timer_.IsRunning());
51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
53513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(ReloadButtonTest, Basic) {
54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The stop/reload button starts in the "enabled reload" state with no timers
55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // running.
56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, false,
57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch             false);
58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Press the button.  This should start the double-click timer.
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  views::MouseEvent e(ui::ET_MOUSE_PRESSED, 0, 0, 0);
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ButtonPressed(&reload_, e);
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, true,
63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch             false);
64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Now change the mode (as if the browser had started loading the page).  This
66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // should cancel the double-click timer since the button is not hovered.
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ChangeMode(ReloadButton::MODE_STOP, false);
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CheckState(true, ReloadButton::MODE_STOP, ReloadButton::MODE_STOP, false,
69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch             false);
70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Press the button again.  This should change back to reload.
72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ButtonPressed(&reload_, e);
73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, false,
74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch             false);
75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
77513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(ReloadButtonTest, DoubleClickTimer) {
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Start by pressing the button.
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  views::MouseEvent e(ui::ET_MOUSE_PRESSED, 0, 0, 0);
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ButtonPressed(&reload_, e);
81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Try to press the button again.  This should do nothing because the timer is
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // running.
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int original_reload_count = reload_count();
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ButtonPressed(&reload_, e);
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, true,
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch             false);
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(original_reload_count, reload_count());
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Hover the button, and change mode.  The visible mode should not change,
91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // again because the timer is running.
92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  set_mouse_hovered(true);
93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ChangeMode(ReloadButton::MODE_STOP, false);
94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CheckState(true, ReloadButton::MODE_STOP, ReloadButton::MODE_RELOAD, true,
95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch             false);
96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Now fire the timer.  This should complete the mode change.
98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  loop_.RunAllPending();
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CheckState(true, ReloadButton::MODE_STOP, ReloadButton::MODE_STOP, false,
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch             false);
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
103513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(ReloadButtonTest, DisableOnHover) {
104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Change to stop and hover.
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  views::MouseEvent e(ui::ET_MOUSE_PRESSED, 0, 0, 0);
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ButtonPressed(&reload_, e);
107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ChangeMode(ReloadButton::MODE_STOP, false);
108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  set_mouse_hovered(true);
109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Now change back to reload.  This should result in a disabled stop button
111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // due to the hover.
112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ChangeMode(ReloadButton::MODE_RELOAD, false);
113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CheckState(false, ReloadButton::MODE_RELOAD, ReloadButton::MODE_STOP, false,
114513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch             true);
115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Un-hover the button, which should allow it to reset.
117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  set_mouse_hovered(false);
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  views::MouseEvent e2(ui::ET_MOUSE_MOVED, 0, 0, 0);
119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.OnMouseExited(e2);
120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, false,
121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch             false);
122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
124513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(ReloadButtonTest, ResetOnClick) {
125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Change to stop and hover.
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  views::MouseEvent e(ui::ET_MOUSE_PRESSED, 0, 0, 0);
127513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ButtonPressed(&reload_, e);
128513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ChangeMode(ReloadButton::MODE_STOP, false);
129513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  set_mouse_hovered(true);
130513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Press the button.  This should change back to reload despite the hover,
132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // because it's a direct user action.
133513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ButtonPressed(&reload_, e);
134513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, false,
135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch             false);
136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
138513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(ReloadButtonTest, ResetOnTimer) {
139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Change to stop, hover, and change back to reload.
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  views::MouseEvent e(ui::ET_MOUSE_PRESSED, 0, 0, 0);
141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ButtonPressed(&reload_, e);
142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ChangeMode(ReloadButton::MODE_STOP, false);
143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  set_mouse_hovered(true);
144513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  reload_.ChangeMode(ReloadButton::MODE_RELOAD, false);
145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
146513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Now fire the stop-to-reload timer.  This should reset the button.
147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  loop_.RunAllPending();
148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, false,
149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch             false);
150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
151