#ifndef UI_VIEWS_INTERACTION_INTERACTIVE_VIEWS_TEST_INTERNAL_H_
#define UI_VIEWS_INTERACTION_INTERACTIVE_VIEWS_TEST_INTERNAL_H_
#include <compare>
#include <concepts>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <type_traits>
#include <utility>
#include <variant>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/types/to_address.h"
#include "ui/base/interaction/element_identifier.h"
#include "ui/base/interaction/element_tracker.h"
#include "ui/base/interaction/interaction_sequence.h"
#include "ui/base/interaction/interaction_test_util.h"
#include "ui/base/interaction/interactive_test_internal.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/native_ui_types.h"
#include "ui/views/interaction/interaction_test_util_mouse.h"
#include "ui/views/interaction/widget_focus_observer.h"
namespace ui {
class NativeWindowTracker;
}
namespace views {
class View;
}
namespace views::test {
class InteractiveViewsTestApi;
namespace internal {
class InteractiveViewsTestPrivate
: public ui::test::internal::InteractiveTestPrivateFrameworkBase {
public:
DECLARE_FRAMEWORK_SPECIFIC_METADATA()
explicit InteractiveViewsTestPrivate(
ui::test::internal::InteractiveTestPrivate& test_impl);
~InteractiveViewsTestPrivate() override;
void OnSequenceComplete() override;
void OnSequenceAborted(
const ui::InteractionSequence::AbortedData& data) override;
void DoTestSetUp() override;
void DoTestTearDown() override;
InteractionTestUtilMouse& mouse_util() { return *mouse_util_; }
InteractionTestUtilMouse::GestureParams GetGestureParamsForStep(
ui::TrackedElement* el,
const ui::InteractionSequence* seq);
struct DebugTreeNodeViews {
using Element = std::variant<const View*, const Widget*>;
using List = std::set<DebugTreeNodeViews>;
DebugTreeNodeViews();
DebugTreeNodeViews(const View* view, const ui::TrackedElement* view_el);
explicit DebugTreeNodeViews(const Widget* widget);
DebugTreeNodeViews(DebugTreeNodeViews&&) noexcept;
DebugTreeNodeViews& operator=(DebugTreeNodeViews&&) noexcept;
~DebugTreeNodeViews();
Element impl;
raw_ptr<const ui::TrackedElement> element = nullptr;
gfx::Rect bounds;
List children;
std::strong_ordering operator<=>(const DebugTreeNodeViews& other) const;
DebugTreeNode ToNode(const InteractiveViewsTestPrivate& owner) const;
};
protected:
gfx::NativeWindow GetNativeWindowFromElement(
const ui::TrackedElement* el) const override;
gfx::NativeWindow GetNativeWindowFromContext(
ui::ElementContext context) const override;
WidgetFocusSupplierFrame::SupplierList& widget_focus_suppliers() {
return widget_focus_supplier_frame_->supplier_list();
}
std::string DebugDumpWidget(const Widget& widget) const;
std::vector<DebugTreeNode> DebugDumpElements(
std::set<const ui::TrackedElement*>& elements) const override;
private:
friend class views::test::InteractiveViewsTestApi;
class WindowHintCacheEntry;
std::optional<DebugTreeNode> DebugDumpElement(
const ui::TrackedElement* el) const;
std::unique_ptr<InteractionTestUtilMouse> mouse_util_;
std::string mouse_error_message_;
std::map<ui::ElementContext, WindowHintCacheEntry> window_hint_cache_;
std::unique_ptr<WidgetFocusSupplierFrame> widget_focus_supplier_frame_;
};
template <typename T>
concept IsView = std::convertible_to<std::remove_cvref_t<T>*, View*>;
template <size_t N,
typename F,
typename V = ui::test::internal::NthArgumentOf<N, F>>
requires requires(V v) {
{ *base::to_address(v) } -> IsView;
}
using ViewArgType =
std::remove_cv_t<typename std::pointer_traits<V>::element_type>;
}
}
#endif