translate_bubble_view_unittest.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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 error_type_(TranslateErrors::NONE), 23 original_language_index_(0), 24 target_language_index_(1), 25 never_translate_language_(false), 26 never_translate_site_(false), 27 should_always_translate_(false), 28 set_always_translate_called_count_(0), 29 translate_called_(false), 30 revert_translation_called_(false), 31 translation_declined_called_(false), 32 original_language_index_on_translation_(-1), 33 target_language_index_on_translation_(-1) { 34 } 35 36 virtual TranslateBubbleModel::ViewState GetViewState() const OVERRIDE { 37 return view_state_transition_.view_state(); 38 } 39 40 virtual void SetViewState(TranslateBubbleModel::ViewState view_state) 41 OVERRIDE { 42 view_state_transition_.SetViewState(view_state); 43 } 44 45 virtual TranslateErrors::Type GetErrorType() const OVERRIDE { 46 return error_type_; 47 } 48 49 virtual void SetErrorType(TranslateErrors::Type error_type) OVERRIDE { 50 error_type_ = error_type; 51 } 52 53 virtual void GoBackFromAdvanced() OVERRIDE { 54 view_state_transition_.GoBackFromAdvanced(); 55 } 56 57 virtual int GetNumberOfLanguages() const OVERRIDE { 58 return 1000; 59 } 60 61 virtual base::string16 GetLanguageNameAt(int index) const OVERRIDE { 62 return base::string16(); 63 } 64 65 virtual int GetOriginalLanguageIndex() const OVERRIDE { 66 return original_language_index_; 67 } 68 69 virtual void UpdateOriginalLanguageIndex(int index) OVERRIDE { 70 original_language_index_ = index; 71 } 72 73 virtual int GetTargetLanguageIndex() const OVERRIDE { 74 return target_language_index_; 75 } 76 77 virtual void UpdateTargetLanguageIndex(int index) OVERRIDE { 78 target_language_index_ = index; 79 } 80 81 virtual void SetNeverTranslateLanguage(bool value) OVERRIDE { 82 never_translate_language_ = value; 83 } 84 85 virtual void SetNeverTranslateSite(bool value) OVERRIDE { 86 never_translate_site_ = value; 87 } 88 89 virtual bool ShouldAlwaysTranslate() const OVERRIDE { 90 return should_always_translate_; 91 } 92 93 virtual void SetAlwaysTranslate(bool value) OVERRIDE { 94 should_always_translate_ = value; 95 set_always_translate_called_count_++; 96 } 97 98 virtual void Translate() OVERRIDE { 99 translate_called_ = true; 100 original_language_index_on_translation_ = original_language_index_; 101 target_language_index_on_translation_ = target_language_index_; 102 } 103 104 virtual void RevertTranslation() OVERRIDE { 105 revert_translation_called_ = true; 106 } 107 108 virtual void TranslationDeclined() OVERRIDE { 109 translation_declined_called_ = true; 110 } 111 112 virtual bool IsPageTranslatedInCurrentLanguages() const OVERRIDE { 113 return original_language_index_on_translation_ == 114 original_language_index_ && 115 target_language_index_on_translation_ == target_language_index_; 116 } 117 118 TranslateBubbleViewStateTransition view_state_transition_; 119 TranslateErrors::Type error_type_; 120 int original_language_index_; 121 int target_language_index_; 122 bool never_translate_language_; 123 bool never_translate_site_; 124 bool should_always_translate_; 125 int set_always_translate_called_count_; 126 bool translate_called_; 127 bool revert_translation_called_; 128 bool translation_declined_called_; 129 int original_language_index_on_translation_; 130 int target_language_index_on_translation_; 131}; 132 133} // namespace 134 135class TranslateBubbleViewTest : public views::ViewsTestBase { 136 public: 137 TranslateBubbleViewTest() { 138 } 139 140 protected: 141 virtual void SetUp() OVERRIDE { 142 views::ViewsTestBase::SetUp(); 143 144 // The bubble needs the parent as an anchor. 145 views::Widget::InitParams params = 146 CreateParams(views::Widget::InitParams::TYPE_WINDOW); 147 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 148 149 anchor_widget_.reset(new views::Widget()); 150 anchor_widget_->Init(params); 151 anchor_widget_->Show(); 152 153 mock_model_ = new MockTranslateBubbleModel( 154 TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE); 155 scoped_ptr<TranslateBubbleModel> model(mock_model_); 156 bubble_ = new TranslateBubbleView(anchor_widget_->GetContentsView(), 157 model.Pass(), 158 NULL, 159 NULL); 160 views::BubbleDelegateView::CreateBubble(bubble_)->Show(); 161 } 162 163 virtual void TearDown() OVERRIDE { 164 bubble_->GetWidget()->CloseNow(); 165 anchor_widget_.reset(); 166 167 views::ViewsTestBase::TearDown(); 168 } 169 170 scoped_ptr<views::Widget> anchor_widget_; 171 MockTranslateBubbleModel* mock_model_; 172 TranslateBubbleView* bubble_; 173}; 174 175TEST_F(TranslateBubbleViewTest, TranslateButton) { 176 EXPECT_FALSE(mock_model_->translate_called_); 177 178 // Press the "Translate" button. 179 bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_TRANSLATE); 180 EXPECT_TRUE(mock_model_->translate_called_); 181} 182 183TEST_F(TranslateBubbleViewTest, AdvancedLink) { 184 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE, 185 bubble_->GetViewState()); 186 187 // Click the "Advanced" link. 188 bubble_->HandleLinkClicked(TranslateBubbleView::LINK_ID_ADVANCED); 189 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ADVANCED, bubble_->GetViewState()); 190} 191 192TEST_F(TranslateBubbleViewTest, ShowOriginalButton) { 193 bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE); 194 195 // Click the "Show original" button to revert translation. 196 EXPECT_FALSE(mock_model_->revert_translation_called_); 197 bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_SHOW_ORIGINAL); 198 EXPECT_TRUE(mock_model_->revert_translation_called_); 199} 200 201TEST_F(TranslateBubbleViewTest, TryAgainButton) { 202 bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ERROR); 203 bubble_->model()->SetErrorType(TranslateErrors::NETWORK); 204 205 EXPECT_EQ(TranslateErrors::NETWORK, bubble_->model()->GetErrorType()); 206 207 // Click the "Try again" button to translate. 208 EXPECT_FALSE(mock_model_->translate_called_); 209 bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_TRY_AGAIN); 210 EXPECT_TRUE(mock_model_->translate_called_); 211} 212 213TEST_F(TranslateBubbleViewTest, AlwaysTranslateCheckboxAndCancelButton) { 214 bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); 215 216 // Click the "Always Translate" checkbox. Changing the state of this checkbox 217 // should NOT affect the model after pressing the cancel button. 218 219 // Check the initial state. 220 EXPECT_FALSE(mock_model_->should_always_translate_); 221 EXPECT_EQ(0, mock_model_->set_always_translate_called_count_); 222 EXPECT_FALSE(bubble_->always_translate_checkbox_->checked()); 223 224 // Click the checkbox. The state is not saved yet. 225 bubble_->always_translate_checkbox_->SetChecked(true); 226 bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_ALWAYS_TRANSLATE); 227 EXPECT_FALSE(mock_model_->should_always_translate_); 228 EXPECT_EQ(0, mock_model_->set_always_translate_called_count_); 229 230 // Click the cancel button. The state is not saved. 231 bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_CANCEL); 232 EXPECT_FALSE(mock_model_->should_always_translate_); 233 EXPECT_EQ(0, mock_model_->set_always_translate_called_count_); 234} 235 236TEST_F(TranslateBubbleViewTest, AlwaysTranslateCheckboxAndDoneButton) { 237 bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); 238 239 // Click the "Always Translate" checkbox. Changing the state of this checkbox 240 // should affect the model after pressing the done button. 241 242 // Check the initial state. 243 EXPECT_FALSE(mock_model_->should_always_translate_); 244 EXPECT_EQ(0, mock_model_->set_always_translate_called_count_); 245 EXPECT_FALSE(bubble_->always_translate_checkbox_->checked()); 246 247 // Click the checkbox. The state is not saved yet. 248 bubble_->always_translate_checkbox_->SetChecked(true); 249 bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_ALWAYS_TRANSLATE); 250 EXPECT_FALSE(mock_model_->should_always_translate_); 251 EXPECT_EQ(0, mock_model_->set_always_translate_called_count_); 252 253 // Click the done button. The state is saved. 254 bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_DONE); 255 EXPECT_TRUE(mock_model_->should_always_translate_); 256 EXPECT_EQ(1, mock_model_->set_always_translate_called_count_); 257} 258 259TEST_F(TranslateBubbleViewTest, DoneButton) { 260 bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); 261 262 // Click the "Done" button to translate. The selected languages by the user 263 // are applied. 264 EXPECT_FALSE(mock_model_->translate_called_); 265 bubble_->source_language_combobox_->SetSelectedIndex(10); 266 bubble_->HandleComboboxSelectedIndexChanged( 267 TranslateBubbleView::COMBOBOX_ID_SOURCE_LANGUAGE); 268 bubble_->target_language_combobox_->SetSelectedIndex(20); 269 bubble_->HandleComboboxSelectedIndexChanged( 270 TranslateBubbleView::COMBOBOX_ID_TARGET_LANGUAGE); 271 bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_DONE); 272 EXPECT_TRUE(mock_model_->translate_called_); 273 EXPECT_EQ(10, mock_model_->original_language_index_); 274 EXPECT_EQ(20, mock_model_->target_language_index_); 275} 276 277TEST_F(TranslateBubbleViewTest, DoneButtonWithoutTranslating) { 278 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE, 279 bubble_->GetViewState()); 280 281 // Translate the page once. 282 mock_model_->Translate(); 283 EXPECT_TRUE(mock_model_->translate_called_); 284 285 // Go back to the initial view. 286 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE, 287 bubble_->GetViewState()); 288 mock_model_->translate_called_ = false; 289 290 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE, 291 bubble_->GetViewState()); 292 bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); 293 294 // Click the "Done" button with the current language pair. This time, 295 // translation is not performed and the view state will be back to the 296 // previous view. 297 bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_DONE); 298 EXPECT_FALSE(mock_model_->translate_called_); 299 300 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE, 301 bubble_->GetViewState()); 302} 303 304TEST_F(TranslateBubbleViewTest, CancelButtonReturningBeforeTranslate) { 305 bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE); 306 bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); 307 308 // Click the "Cancel" button to go back. 309 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ADVANCED, bubble_->GetViewState()); 310 bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_CANCEL); 311 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE, 312 bubble_->GetViewState()); 313} 314 315TEST_F(TranslateBubbleViewTest, CancelButtonReturningAfterTranslate) { 316 bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE); 317 bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); 318 319 // Click the "Cancel" button to go back. 320 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ADVANCED, bubble_->GetViewState()); 321 bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_CANCEL); 322 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE, 323 bubble_->GetViewState()); 324} 325 326TEST_F(TranslateBubbleViewTest, CancelButtonReturningError) { 327 bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ERROR); 328 bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); 329 330 // Click the "Cancel" button to go back. 331 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ADVANCED, bubble_->GetViewState()); 332 bubble_->HandleButtonPressed(TranslateBubbleView::BUTTON_ID_CANCEL); 333 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ERROR, bubble_->GetViewState()); 334} 335