// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ui/views/interaction/browser_elements_views.h"

#include "base/test/bind.h"
#include "chrome/browser/ui/browser_element_identifiers.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/test/browser_test.h"
#include "ui/base/identifier/typed_identifier.h"
#include "ui/base/interaction/element_identifier.h"

using BrowserElementsViewsBrowsertest = InProcessBrowserTest;

IN_PROC_BROWSER_TEST_F(BrowserElementsViewsBrowsertest, GetView) {
  DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kNotAppearingInThisBrowserElementId);

  auto* const browser_view = BrowserView::GetBrowserViewForBrowser(browser());
  auto* const elements = BrowserElementsViews::From(browser());
  EXPECT_EQ(browser_view, elements->GetView(kBrowserViewElementId));
  EXPECT_EQ(browser_view->toolbar(),
            elements->GetViewAs<ToolbarView>(ToolbarView::kToolbarElementId));
  EXPECT_EQ(nullptr, elements->GetView(kNotAppearingInThisBrowserElementId));
}

IN_PROC_BROWSER_TEST_F(BrowserElementsViewsBrowsertest, GetContext) {
  auto* const browser_view = BrowserView::GetBrowserViewForBrowser(browser());
  auto* const elements = BrowserElementsViews::From(browser());
  EXPECT_EQ(browser_view->GetElementContext(), elements->GetContext());
}

IN_PROC_BROWSER_TEST_F(BrowserElementsViewsBrowsertest,
                       GetPrimaryWindowWidget) {
  auto* const browser_view = BrowserView::GetBrowserViewForBrowser(browser());
  auto* const elements = BrowserElementsViews::From(browser());
  EXPECT_EQ(browser_view->GetWidget(), elements->GetPrimaryWindowWidget());
}

IN_PROC_BROWSER_TEST_F(BrowserElementsViewsBrowsertest, RetrieveView) {
  DEFINE_LOCAL_TYPED_IDENTIFIER_VALUE(ui::ElementIdentifier, ToolbarView,
                                      kToolbarViewRetrievalId);
  auto* const browser_view = BrowserView::GetBrowserViewForBrowser(browser());
  auto* const elements = BrowserElementsViews::From(browser());
  elements->AddRetrievalCallback(kToolbarViewRetrievalId,
                                 base::BindLambdaForTesting([browser_view]() {
                                   return browser_view->toolbar();
                                 }));
  EXPECT_EQ(browser_view->toolbar(),
            elements->RetrieveView(kToolbarViewRetrievalId));
}
