blob: 1743e424111c869ce4ca51ed51dfc46c1d4b0b08 [file] [log] [blame]
// Copyright (c) 2020 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 "content/browser/accessibility/accessibility_tree_formatter_base.h"
#include "content/browser/accessibility/browser_accessibility.h"
#include "content/browser/accessibility/browser_accessibility_manager.h"
#include "content/browser/accessibility/test_browser_accessibility_delegate.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/ax_enums.mojom.h"
namespace content {
class AccessibilityTreeFormatterBaseTest : public testing::Test {
public:
AccessibilityTreeFormatterBaseTest() = default;
~AccessibilityTreeFormatterBaseTest() override = default;
protected:
std::unique_ptr<TestBrowserAccessibilityDelegate>
test_browser_accessibility_delegate_;
private:
void SetUp() override {
test_browser_accessibility_delegate_ =
std::make_unique<TestBrowserAccessibilityDelegate>();
}
DISALLOW_COPY_AND_ASSIGN(AccessibilityTreeFormatterBaseTest);
};
PropertyNode Parse(const char* input) {
AccessibilityTreeFormatter::PropertyFilter filter(
base::UTF8ToUTF16(input),
AccessibilityTreeFormatter::PropertyFilter::ALLOW);
return PropertyNode::FromPropertyFilter(filter);
}
PropertyNode GetArgumentNode(const char* input) {
auto got = Parse(input);
if (got.parameters.size() == 0) {
return PropertyNode();
}
return std::move(got.parameters[0]);
}
void ParseAndCheck(const char* input, const char* expected) {
auto got = Parse(input).ToString();
EXPECT_EQ(got, expected);
}
TEST_F(AccessibilityTreeFormatterBaseTest, ParseProperty) {
// Properties and methods.
ParseAndCheck("Role", "Role");
ParseAndCheck("ChildAt(3)", "ChildAt(3)");
ParseAndCheck("Cell(3, 4)", "Cell(3, 4)");
ParseAndCheck("Volume(3, 4, 5)", "Volume(3, 4, 5)");
ParseAndCheck("TableFor(CellBy(id))", "TableFor(CellBy(id))");
ParseAndCheck("A(B(1), 2)", "A(B(1), 2)");
ParseAndCheck("A(B(1), 2, C(3, 4))", "A(B(1), 2, C(3, 4))");
ParseAndCheck("[3, 4]", "[](3, 4)");
ParseAndCheck("Cell([3, 4])", "Cell([](3, 4))");
// Arguments
ParseAndCheck("Text({val: 1})", "Text({}(val: 1))");
ParseAndCheck("Text({lat: 1, len: 1})", "Text({}(lat: 1, len: 1))");
ParseAndCheck("Text({dict: {val: 1}})", "Text({}(dict: {}(val: 1)))");
ParseAndCheck("Text({dict: {val: 1}, 3})", "Text({}(dict: {}(val: 1), 3))");
ParseAndCheck("Text({dict: [1, 2]})", "Text({}(dict: [](1, 2)))");
ParseAndCheck("Text({dict: ValueFor(1)})", "Text({}(dict: ValueFor(1)))");
// Line indexes filter.
ParseAndCheck(":3,:5;AXDOMClassList", ":3,:5;AXDOMClassList");
// Wrong format.
ParseAndCheck("Role(3", "Role(3)");
ParseAndCheck("TableFor(CellBy(id", "TableFor(CellBy(id))");
ParseAndCheck("[3, 4", "[](3, 4)");
// Arguments conversion
EXPECT_EQ(GetArgumentNode("ChildAt([3])").IsArray(), true);
EXPECT_EQ(GetArgumentNode("Text({loc: 3, len: 2})").IsDict(), true);
EXPECT_EQ(GetArgumentNode("ChildAt(3)").IsDict(), false);
EXPECT_EQ(GetArgumentNode("ChildAt(3)").IsArray(), false);
EXPECT_EQ(GetArgumentNode("ChildAt(3)").AsInt(), 3);
// Dict: FindStringKey
EXPECT_EQ(
GetArgumentNode("Text({start: :1, dir: forward})").FindStringKey("start"),
base::ASCIIToUTF16(":1"));
EXPECT_EQ(
GetArgumentNode("Text({start: :1, dir: forward})").FindStringKey("dir"),
base::ASCIIToUTF16("forward"));
EXPECT_EQ(GetArgumentNode("Text({start: :1, dir: forward})")
.FindStringKey("notexists"),
base::nullopt);
// Dict: FindIntKey
EXPECT_EQ(GetArgumentNode("Text({loc: 3, len: 2})").FindIntKey("loc"), 3);
EXPECT_EQ(GetArgumentNode("Text({loc: 3, len: 2})").FindIntKey("len"), 2);
EXPECT_EQ(GetArgumentNode("Text({loc: 3, len: 2})").FindIntKey("notexists"),
base::nullopt);
// Dict: FindKey
EXPECT_EQ(GetArgumentNode("Text({anchor: {:1, 0, up}})")
.FindKey("anchor")
->ToString(),
"anchor: {}(:1, 0, up)");
EXPECT_EQ(GetArgumentNode("Text({anchor: {:1, 0, up}})").FindKey("focus"),
nullptr);
EXPECT_EQ(GetArgumentNode("AXStringForTextMarkerRange({anchor: {:2, 1, "
"down}, focus: {:2, 2, down}})")
.FindKey("anchor")
->ToString(),
"anchor: {}(:2, 1, down)");
}
} // namespace content