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