// Copyright (c) 2012 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/browser.h"
#include "chrome/browser/ui/search/search_model.h"
#include "chrome/browser/ui/search/search_tab_helper.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/browser_with_test_window_test.h"

typedef BrowserWithTestWindowTest SearchDelegateTest;

// Test the propagation of search "mode" changes from the tab's search model to
// the browser's search model.
TEST_F(SearchDelegateTest, SearchModel) {
  // Initial state.
  EXPECT_TRUE(browser()->search_model()->mode().is_default());

  // Propagate change from tab's search model to browser's search model.
  AddTab(browser(), GURL("http://foo/0"));
  content::WebContents* web_contents =
      browser()->tab_strip_model()->GetWebContentsAt(0);
  SearchTabHelper::FromWebContents(web_contents)->model()->
      SetMode(SearchMode(SearchMode::MODE_NTP, SearchMode::ORIGIN_NTP));
  EXPECT_TRUE(browser()->search_model()->mode().is_ntp());

  // Add second tab, make it active, and make sure its mode changes
  // propagate to the browser's search model.
  AddTab(browser(), GURL("http://foo/1"));
  browser()->tab_strip_model()->ActivateTabAt(1, true);
  web_contents = browser()->tab_strip_model()->GetWebContentsAt(1);
  SearchTabHelper::FromWebContents(web_contents)->model()->
      SetMode(SearchMode(SearchMode::MODE_SEARCH_RESULTS,
                         SearchMode::ORIGIN_DEFAULT));
  EXPECT_TRUE(browser()->search_model()->mode().is_search());

  // The first tab is not active so changes should not propagate.
  web_contents = browser()->tab_strip_model()->GetWebContentsAt(0);
  SearchTabHelper::FromWebContents(web_contents)->model()->
      SetMode(SearchMode(SearchMode::MODE_NTP, SearchMode::ORIGIN_NTP));
  EXPECT_TRUE(browser()->search_model()->mode().is_search());
}
