#ifndef UI_VIEWS_TEST_VIEWS_TEST_BASE_H_
#define UI_VIEWS_TEST_VIEWS_TEST_BASE_H_
#include <memory>
#include <optional>
#include <utility>
#include "base/compiler_specific.h"
#include "base/test/task_environment.h"
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
#include "ui/accessibility/platform/ax_platform_for_test.h"
#include "ui/base/ui_base_features.h"
#include "ui/views/test/scoped_views_test_helper.h"
#include "ui/views/test/test_views_delegate.h"
#include "ui/views/widget/widget.h"
#if BUILDFLAG(IS_WIN)
#include "ui/base/win/scoped_ole_initializer.h"
#endif
#if defined(USE_AURA)
#include "ui/aura/test/aura_test_helper.h"
#include "ui/aura/window_tree_host.h"
#endif
namespace views {
class ViewsTestBase : public PlatformTest {
public:
enum class NativeWidgetType {
kDefault,
kDesktop,
};
struct WidgetCloser {
void operator()(Widget* widget) const;
};
using WidgetAutoclosePtr = std::unique_ptr<Widget, WidgetCloser>;
template <typename... TaskEnvironmentTraits>
NOINLINE explicit ViewsTestBase(TaskEnvironmentTraits&&... traits)
: ViewsTestBase(std::make_unique<base::test::TaskEnvironment>(
base::test::TaskEnvironment::MainThreadType::UI,
std::forward<TaskEnvironmentTraits>(traits)...)) {}
explicit ViewsTestBase(
std::unique_ptr<base::test::TaskEnvironment> task_environment);
ViewsTestBase(const ViewsTestBase&) = delete;
ViewsTestBase& operator=(const ViewsTestBase&) = delete;
~ViewsTestBase() override;
void SetUp() override;
void TearDown() override;
void SetUpForInteractiveTests();
void RunPendingMessages();
virtual Widget::InitParams CreateParams(
Widget::InitParams::Ownership ownership,
Widget::InitParams::Type type);
Widget::InitParams CreateParams(Widget::InitParams::Type type);
virtual std::unique_ptr<Widget> CreateTestWidget(
Widget::InitParams::Ownership ownership,
Widget::InitParams::Type type =
Widget::InitParams::TYPE_WINDOW_FRAMELESS);
virtual std::unique_ptr<Widget> CreateTestWidget(Widget::InitParams params);
void SimulateNativeDestroy(Widget* widget);
#if BUILDFLAG(ENABLE_DESKTOP_AURA)
void SimulateDesktopNativeDestroy(Widget* widget);
#endif
protected:
base::test::TaskEnvironment* task_environment() {
return task_environment_.get();
}
TestViewsDelegate* test_views_delegate() const {
return test_helper_->test_views_delegate();
}
void set_native_widget_type(NativeWidgetType native_widget_type) {
DCHECK(!setup_called_);
native_widget_type_ = native_widget_type;
}
template <typename T>
T* set_views_delegate(std::unique_ptr<T> views_delegate) {
DCHECK(!setup_called_);
T* const ret = views_delegate.get();
views_delegate_for_setup_ = std::move(views_delegate);
return ret;
}
#if defined(USE_AURA)
aura::Window* root_window() {
return aura::test::AuraTestHelper::GetInstance()->GetContext();
}
ui::EventSink* GetEventSink() { return host()->GetEventSink(); }
aura::WindowTreeHost* host() {
return aura::test::AuraTestHelper::GetInstance()->GetHost();
}
#endif
gfx::NativeWindow GetContext();
NativeWidget* CreateNativeWidgetForTest(
const Widget::InitParams& init_params,
internal::NativeWidgetDelegate* delegate);
virtual std::unique_ptr<Widget> AllocateTestWidget();
Widget::InitParams CreateParamsForTestWidget(
views::Widget::InitParams::Ownership ownership,
views::Widget::InitParams::Type type =
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
Widget::InitParams CreateParamsForTestWidget(
views::Widget::InitParams::Type type =
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
private:
#if BUILDFLAG(IS_WIN)
ui::ScopedOleInitializer ole_initializer_;
#endif
std::unique_ptr<base::test::TaskEnvironment> task_environment_;
std::optional<ui::AXPlatformForTest> ax_platform_;
NativeWidgetType native_widget_type_ = NativeWidgetType::kDefault;
std::unique_ptr<TestViewsDelegate> views_delegate_for_setup_;
std::unique_ptr<ScopedViewsTestHelper> test_helper_;
bool interactive_setup_called_ = false;
bool setup_called_ = false;
bool teardown_called_ = false;
};
class ViewsTestWithDesktopNativeWidget : public ViewsTestBase {
public:
using ViewsTestBase::ViewsTestBase;
ViewsTestWithDesktopNativeWidget(const ViewsTestWithDesktopNativeWidget&) =
delete;
ViewsTestWithDesktopNativeWidget& operator=(
const ViewsTestWithDesktopNativeWidget&) = delete;
~ViewsTestWithDesktopNativeWidget() override = default;
void SetUp() override;
};
}
#endif