#ifndef CHROME_TEST_INTERACTION_INTERACTIVE_BROWSER_TEST_INTERNAL_H_
#define CHROME_TEST_INTERACTION_INTERACTIVE_BROWSER_TEST_INTERNAL_H_
#include <compare>
#include <memory>
#include <utility>
#include <vector>
#include "base/values.h"
#include "chrome/test/interaction/interaction_test_util_browser.h"
#include "chrome/test/interaction/tracked_element_webcontents.h"
#include "chrome/test/interaction/webcontents_interaction_test_util.h"
#include "testing/gtest/include/gtest/gtest.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/interactive_test_definitions.h"
#include "ui/base/interaction/interactive_test_internal.h"
#include "ui/gfx/native_ui_types.h"
class DevToolsAgentCoverageObserver;
class InteractiveBrowserTestApi;
namespace internal {
class InteractiveBrowserTestPrivate
: public ui::test::internal::InteractiveTestPrivateFrameworkBase {
public:
DECLARE_FRAMEWORK_SPECIFIC_METADATA()
explicit InteractiveBrowserTestPrivate(
ui::test::internal::InteractiveTestPrivate& test_impl);
~InteractiveBrowserTestPrivate() override;
void MaybeStartWebUICodeCoverage();
void AddInstrumentedWebContents(
std::unique_ptr<WebContentsInteractionTestUtil>
instrumented_web_contents);
bool IsInstrumentedWebContents(ui::ElementIdentifier element_id) const;
bool UninstrumentWebContents(ui::ElementIdentifier to_remove);
static std::string DeepQueryToString(
const WebContentsInteractionTestUtil::DeepQuery& deep_query);
protected:
void DoTestTearDown() override;
gfx::NativeWindow GetNativeWindowFromElement(
const ui::TrackedElement* el) const override;
gfx::NativeWindow GetNativeWindowFromContext(
ui::ElementContext context) const override;
std::string DebugDescribeContext(ui::ElementContext context) const override;
std::vector<DebugTreeNode> DebugDumpElements(
std::set<const ui::TrackedElement*>& elements) const override;
private:
friend InteractiveBrowserTestApi;
std::unique_ptr<DevToolsAgentCoverageObserver> coverage_observer_;
std::vector<std::unique_ptr<WebContentsInteractionTestUtil>>
instrumented_web_contents_;
};
class MatchableValue {
public:
MatchableValue() noexcept;
MatchableValue(const base::Value& value) noexcept;
MatchableValue(base::Value&& value) noexcept;
MatchableValue(const MatchableValue& value) noexcept;
MatchableValue(MatchableValue&&) noexcept;
MatchableValue& operator=(const base::Value& value) noexcept;
MatchableValue& operator=(base::Value&& value) noexcept;
MatchableValue& operator=(const MatchableValue& value) noexcept;
MatchableValue& operator=(MatchableValue&&) noexcept;
~MatchableValue();
template <typename T>
MatchableValue(T value) noexcept
: MatchableValue(base::Value(value)) {}
bool operator==(const MatchableValue& other) const;
bool operator<(const MatchableValue& other) const;
bool operator>(const MatchableValue& other) const;
bool operator<=(const MatchableValue& other) const;
bool operator>=(const MatchableValue& other) const;
operator std::string() const;
const base::Value& value() const { return value_; }
private:
base::Value value_;
};
class IsTruthyMatcher
: public testing::MatcherInterface<const internal::MatchableValue&> {
public:
IsTruthyMatcher() = default;
IsTruthyMatcher(const IsTruthyMatcher&) = default;
IsTruthyMatcher& operator=(const IsTruthyMatcher&) = default;
~IsTruthyMatcher() override = default;
using is_gtest_matcher = void;
bool MatchAndExplain(const internal::MatchableValue& x,
testing::MatchResultListener* listener) const override;
void DescribeTo(std::ostream* os) const override;
void DescribeNegationTo(std::ostream* os) const override;
};
extern std::ostream& operator<<(std::ostream& out, const MatchableValue& value);
template <typename M>
struct MakeValueMatcherHelper {
static auto MakeValueMatcher(M m) {
return testing::Matcher<base::Value>(testing::Eq(m));
}
};
template <typename M>
requires requires(M&& m) {
testing::Matcher<MatchableValue>(std::forward<M>(m));
}
struct MakeValueMatcherHelper<M> {
static auto MakeValueMatcher(M&& m) {
return testing::Matcher<MatchableValue>(std::forward<M>(m));
}
};
template <typename M>
auto MakeValueMatcher(M&& m) {
return MakeValueMatcherHelper<M>::MakeValueMatcher(
ui::test::internal::UnwrapArgument(std::forward<M>(m)));
}
template <typename M>
auto MakeConstValueMatcher(const M& m) {
return MakeValueMatcherHelper<M>::MakeValueMatcher(
ui::test::internal::UnwrapArgument(m));
}
}
#endif