root/chrome/browser/ui/search/search_model_unittest.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ModelChanged
  2. VerifySearchModelStates
  3. VerifyNotificationCount
  4. SetUp
  5. TearDown
  6. TEST_F
  7. TEST_F
  8. TEST_F
  9. TEST_F

// 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());
}

/* [<][>][^][v][top][bottom][index][help] */