// Copyright 2013 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. #include "chrome/browser/ui/search/search_model.h" #include "base/command_line.h" #include "chrome/browser/ui/search/search_model_observer.h" #include "chrome/browser/ui/search/search_tab_helper.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/search_types.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" namespace { class MockSearchModelObserver : public SearchModelObserver { public: MockSearchModelObserver(); virtual ~MockSearchModelObserver(); virtual void ModelChanged(const SearchModel::State& old_state, const SearchModel::State& new_state) OVERRIDE; void VerifySearchModelStates(const SearchModel::State& expected_old_state, const SearchModel::State& expected_new_state); void VerifyNotificationCount(int expected_count); private: // How many times we've seen search model changed notifications. int modelchanged_notification_count_; SearchModel::State actual_old_state_; SearchModel::State actual_new_state_; DISALLOW_COPY_AND_ASSIGN(MockSearchModelObserver); }; MockSearchModelObserver::MockSearchModelObserver() : modelchanged_notification_count_(0) { } MockSearchModelObserver::~MockSearchModelObserver() { } void MockSearchModelObserver::ModelChanged( const SearchModel::State& old_state, const SearchModel::State& new_state) { actual_old_state_ = old_state; actual_new_state_ = new_state; modelchanged_notification_count_++; } void MockSearchModelObserver::VerifySearchModelStates( const SearchModel::State& expected_old_state, const SearchModel::State& expected_new_state) { EXPECT_TRUE(actual_old_state_ == expected_old_state); EXPECT_TRUE(actual_new_state_ == expected_new_state); } void MockSearchModelObserver::VerifyNotificationCount(int expected_count) { EXPECT_EQ(modelchanged_notification_count_, expected_count); } } // namespace class SearchModelTest : public ChromeRenderViewHostTestHarness { public: virtual void SetUp() OVERRIDE; virtual void TearDown() OVERRIDE; MockSearchModelObserver mock_observer; SearchModel* model; }; void SearchModelTest::SetUp() { ChromeRenderViewHostTestHarness::SetUp(); SearchTabHelper::CreateForWebContents(web_contents()); SearchTabHelper* search_tab_helper = SearchTabHelper::FromWebContents(web_contents()); ASSERT_TRUE(search_tab_helper != NULL); model = search_tab_helper->model(); model->AddObserver(&mock_observer); } void SearchModelTest::TearDown() { model->RemoveObserver(&mock_observer); ChromeRenderViewHostTestHarness::TearDown(); } TEST_F(SearchModelTest, UpdateSearchModelInstantSupport) { mock_observer.VerifyNotificationCount(0); EXPECT_TRUE(model->instant_support() == INSTANT_SUPPORT_UNKNOWN); SearchModel::State expected_old_state = model->state(); SearchModel::State expected_new_state(model->state()); expected_new_state.instant_support = INSTANT_SUPPORT_YES; model->SetInstantSupportState(INSTANT_SUPPORT_YES); mock_observer.VerifySearchModelStates(expected_old_state, expected_new_state); mock_observer.VerifyNotificationCount(1); EXPECT_TRUE(model->instant_support() == INSTANT_SUPPORT_YES); expected_old_state = expected_new_state; expected_new_state.instant_support = INSTANT_SUPPORT_NO; model->SetInstantSupportState(INSTANT_SUPPORT_NO); mock_observer.VerifySearchModelStates(expected_old_state, expected_new_state); mock_observer.VerifyNotificationCount(2); // Notify the observer only if the search model state is changed. model->SetInstantSupportState(INSTANT_SUPPORT_NO); EXPECT_TRUE(model->state() == expected_new_state); EXPECT_TRUE(model->instant_support() == INSTANT_SUPPORT_NO); mock_observer.VerifyNotificationCount(2); } TEST_F(SearchModelTest, UpdateSearchModelMode) { mock_observer.VerifyNotificationCount(0); SearchMode search_mode(SearchMode::MODE_NTP, SearchMode::ORIGIN_NTP); SearchModel::State expected_old_state = model->state(); SearchModel::State expected_new_state(model->state()); expected_new_state.mode = search_mode; model->SetMode(search_mode); mock_observer.VerifySearchModelStates(expected_old_state, expected_new_state); mock_observer.VerifyNotificationCount(1); search_mode.mode = SearchMode::MODE_SEARCH_RESULTS; expected_old_state = expected_new_state; expected_new_state.mode = search_mode; model->SetMode(search_mode); mock_observer.VerifySearchModelStates(expected_old_state, expected_new_state); mock_observer.VerifyNotificationCount(2); EXPECT_TRUE(model->state() == expected_new_state); } TEST_F(SearchModelTest, UpdateSearchModelState) { SearchModel::State expected_new_state(model->state()); expected_new_state.instant_support = INSTANT_SUPPORT_NO; EXPECT_FALSE(model->state() == expected_new_state); model->SetState(expected_new_state); mock_observer.VerifyNotificationCount(1); EXPECT_TRUE(model->state() == expected_new_state); } TEST_F(SearchModelTest, UpdateVoiceSearchSupported) { mock_observer.VerifyNotificationCount(0); EXPECT_FALSE(model->voice_search_supported()); SearchModel::State expected_old_state = model->state(); SearchModel::State expected_new_state(model->state()); expected_new_state.voice_search_supported = true; model->SetVoiceSearchSupported(true); mock_observer.VerifySearchModelStates(expected_old_state, expected_new_state); mock_observer.VerifyNotificationCount(1); EXPECT_TRUE(model->voice_search_supported()); }