translate_bubble_view_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/views/translate/translate_bubble_view.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "chrome/browser/ui/translate/translate_bubble_model.h"
9#include "chrome/browser/ui/translate/translate_bubble_view_state_transition.h"
10#include "testing/gtest/include/gtest/gtest.h"
11#include "ui/views/controls/button/checkbox.h"
12#include "ui/views/controls/combobox/combobox.h"
13#include "ui/views/test/views_test_base.h"
14#include "ui/views/widget/widget.h"
15
16namespace {
17
18class MockTranslateBubbleModel : public TranslateBubbleModel {
19 public:
20  explicit MockTranslateBubbleModel(TranslateBubbleModel::ViewState view_state)
21      : view_state_transition_(view_state),
22        original_language_index_(0),
23        target_language_index_(1),
24        never_translate_language_(false),
25        never_translate_site_(false),
26        should_always_translate_(false),
27        set_always_translate_called_count_(0),
28        translate_called_(false),
29        revert_translation_called_(false),
30        translation_declined_called_(false) {
31  }
32
33  virtual TranslateBubbleModel::ViewState GetViewState() const OVERRIDE {
34    return view_state_transition_.view_state();
35  }
36
37  virtual void SetViewState(TranslateBubbleModel::ViewState view_state)
38      OVERRIDE {
39    view_state_transition_.SetViewState(view_state);
40  }
41
42  virtual void GoBackFromAdvanced() OVERRIDE {
43    view_state_transition_.GoBackFromAdvanced();
44  }
45
46  virtual int GetNumberOfLanguages() const OVERRIDE {
47    return 1000;
48  }
49
50  virtual string16 GetLanguageNameAt(int index) const OVERRIDE {
51    return string16();
52  }
53
54  virtual int GetOriginalLanguageIndex() const OVERRIDE {
55    return original_language_index_;
56  }
57
58  virtual void UpdateOriginalLanguageIndex(int index) OVERRIDE {
59    original_language_index_ = index;
60  }
61
62  virtual int GetTargetLanguageIndex() const OVERRIDE {
63    return target_language_index_;
64  }
65
66  virtual void UpdateTargetLanguageIndex(int index) OVERRIDE {
67    target_language_index_ = index;
68  }
69
70  virtual void SetNeverTranslateLanguage(bool value) OVERRIDE {
71    never_translate_language_ = value;
72  }
73
74  virtual void SetNeverTranslateSite(bool value) OVERRIDE {
75    never_translate_site_ = value;
76  }
77
78  virtual bool ShouldAlwaysTranslate() const OVERRIDE {
79    return should_always_translate_;
80  }
81
82  virtual void SetAlwaysTranslate(bool value) OVERRIDE {
83    should_always_translate_ = value;
84    set_always_translate_called_count_++;
85  }
86
87  virtual void Translate() OVERRIDE {
88    translate_called_ = true;
89  }
90
91  virtual void RevertTranslation() OVERRIDE {
92    revert_translation_called_ = true;
93  }
94
95  virtual void TranslationDeclined() OVERRIDE {
96    translation_declined_called_ = true;
97  }
98
99  TranslateBubbleViewStateTransition view_state_transition_;
100  int original_language_index_;
101  int target_language_index_;
102  bool never_translate_language_;
103  bool never_translate_site_;
104  bool should_always_translate_;
105  int set_always_translate_called_count_;
106  bool translate_called_;
107  bool revert_translation_called_;
108  bool translation_declined_called_;
109};
110
111}  // namespace
112
113class TranslateBubbleViewTest : public views::ViewsTestBase {
114 public:
115  TranslateBubbleViewTest() {
116  }
117
118 protected:
119  virtual void SetUp() OVERRIDE {
120    views::ViewsTestBase::SetUp();
121
122    // The bubble needs the parent as an anchor.
123    views::Widget::InitParams params =
124        CreateParams(views::Widget::InitParams::TYPE_WINDOW);
125    params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
126
127    anchor_widget_.reset(new views::Widget());
128    anchor_widget_->Init(params);
129    anchor_widget_->Show();
130
131    mock_model_ = new MockTranslateBubbleModel(
132        TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE);
133    scoped_ptr<TranslateBubbleModel> model(mock_model_);
134    bubble_ = new TranslateBubbleView(anchor_widget_->GetContentsView(),
135                                      model.Pass(),
136                                      NULL,
137                                      NULL);
138    views::BubbleDelegateView::CreateBubble(bubble_)->Show();
139  }
140
141  virtual void TearDown() OVERRIDE {
142    bubble_->GetWidget()->CloseNow();
143    anchor_widget_.reset();
144
145    views::ViewsTestBase::TearDown();
146  }
147
148  scoped_ptr<views::Widget> anchor_widget_;
149  MockTranslateBubbleModel* mock_model_;
150  TranslateBubbleView* bubble_;
151};
152
153TEST_F(TranslateBubbleViewTest, TranslateButton) {
154  EXPECT_FALSE(mock_model_->translate_called_);
155
156  // Press the "Translate" button.
157  bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_TRANSLATE);
158  EXPECT_TRUE(mock_model_->translate_called_);
159}
160
161TEST_F(TranslateBubbleViewTest, AdvancedLink) {
162  EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE,
163            bubble_->GetViewState());
164
165  // Click the "Advanced" link.
166  bubble_->HandleLinkClicked(TranslateBubbleView::LINK_ID_ADVANCED);
167  EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ADVANCED, bubble_->GetViewState());
168}
169
170TEST_F(TranslateBubbleViewTest, ShowOriginalButton) {
171  bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE);
172
173  // Click the "Show original" button to revert translation.
174  EXPECT_FALSE(mock_model_->revert_translation_called_);
175  bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_SHOW_ORIGINAL);
176  EXPECT_TRUE(mock_model_->revert_translation_called_);
177}
178
179TEST_F(TranslateBubbleViewTest, TryAgainButton) {
180  bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ERROR);
181
182  // Click the "Try again" button to translate.
183  EXPECT_FALSE(mock_model_->translate_called_);
184  bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_TRY_AGAIN);
185  EXPECT_TRUE(mock_model_->translate_called_);
186}
187
188TEST_F(TranslateBubbleViewTest, AlwaysTranslateCheckboxAndCancelButton) {
189  bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED);
190
191  // Click the "Always Translate" checkbox. Changing the state of this checkbox
192  // should NOT affect the model after pressing the cancel button.
193
194  // Check the initial state.
195  EXPECT_FALSE(mock_model_->should_always_translate_);
196  EXPECT_EQ(0, mock_model_->set_always_translate_called_count_);
197  EXPECT_FALSE(bubble_->always_translate_checkbox_->checked());
198
199  // Click the checkbox. The state is not saved yet.
200  bubble_->always_translate_checkbox_->SetChecked(true);
201  bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_ALWAYS_TRANSLATE);
202  EXPECT_FALSE(mock_model_->should_always_translate_);
203  EXPECT_EQ(0, mock_model_->set_always_translate_called_count_);
204
205  // Click the cancel button. The state is not saved.
206  bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_CANCEL);
207  EXPECT_FALSE(mock_model_->should_always_translate_);
208  EXPECT_EQ(0, mock_model_->set_always_translate_called_count_);
209}
210
211TEST_F(TranslateBubbleViewTest, AlwaysTranslateCheckboxAndDoneButton) {
212  bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED);
213
214  // Click the "Always Translate" checkbox. Changing the state of this checkbox
215  // should affect the model after pressing the done button.
216
217  // Check the initial state.
218  EXPECT_FALSE(mock_model_->should_always_translate_);
219  EXPECT_EQ(0, mock_model_->set_always_translate_called_count_);
220  EXPECT_FALSE(bubble_->always_translate_checkbox_->checked());
221
222  // Click the checkbox. The state is not saved yet.
223  bubble_->always_translate_checkbox_->SetChecked(true);
224  bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_ALWAYS_TRANSLATE);
225  EXPECT_FALSE(mock_model_->should_always_translate_);
226  EXPECT_EQ(0, mock_model_->set_always_translate_called_count_);
227
228  // Click the done button. The state is saved.
229  bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_DONE);
230  EXPECT_TRUE(mock_model_->should_always_translate_);
231  EXPECT_EQ(1, mock_model_->set_always_translate_called_count_);
232}
233
234
235TEST_F(TranslateBubbleViewTest, DoneButton) {
236  bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED);
237
238  // Click the "Done" button to translate. The selected languages by the user
239  // are applied.
240  EXPECT_FALSE(mock_model_->translate_called_);
241  bubble_->source_language_combobox_->SetSelectedIndex(10);
242  bubble_->HandleComboboxSelectedIndexChanged(
243      TranslateBubbleView::COMBOBOX_ID_SOURCE_LANGUAGE);
244  bubble_->target_language_combobox_->SetSelectedIndex(20);
245  bubble_->HandleComboboxSelectedIndexChanged(
246      TranslateBubbleView::COMBOBOX_ID_TARGET_LANGUAGE);
247  bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_DONE);
248  EXPECT_TRUE(mock_model_->translate_called_);
249  EXPECT_EQ(10, mock_model_->original_language_index_);
250  EXPECT_EQ(20, mock_model_->target_language_index_);
251}
252
253TEST_F(TranslateBubbleViewTest, CancelButtonReturningBeforeTranslate) {
254  bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE);
255  bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED);
256
257  // Click the "Cancel" button to go back.
258  EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ADVANCED, bubble_->GetViewState());
259  bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_CANCEL);
260  EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE,
261            bubble_->GetViewState());
262}
263
264TEST_F(TranslateBubbleViewTest, CancelButtonReturningAfterTranslate) {
265  bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE);
266  bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED);
267
268  // Click the "Cancel" button to go back.
269  EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ADVANCED, bubble_->GetViewState());
270  bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_CANCEL);
271  EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE,
272            bubble_->GetViewState());
273}
274
275TEST_F(TranslateBubbleViewTest, CancelButtonReturningError) {
276  bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ERROR);
277  bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED);
278
279  // Click the "Cancel" button to go back.
280  EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ADVANCED, bubble_->GetViewState());
281  bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_CANCEL);
282  EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ERROR, bubble_->GetViewState());
283}
284