browser_accessibility_mac_unittest.mm revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#import <Cocoa/Cocoa.h>
6
7#include "base/scoped_ptr.h"
8#include "base/string_util.h"
9#include "base/utf_string_conversions.h"
10#include "chrome/browser/accessibility/browser_accessibility_cocoa.h"
11#include "chrome/browser/accessibility/browser_accessibility_manager.h"
12#include "chrome/browser/ui/cocoa/cocoa_test_helper.h"
13#include "testing/gtest/include/gtest/gtest.h"
14#import "testing/gtest_mac.h"
15
16@interface MockAccessibilityDelegate :
17    NSView<BrowserAccessibilityDelegateCocoa>
18
19- (NSPoint)accessibilityPointInScreen:(BrowserAccessibilityCocoa*)accessibility;
20- (void)doDefaultAction:(int32)accessibilityObjectId;
21- (void)setAccessibilityFocus:(BOOL)focus
22              accessibilityId:(int32)accessibilityObjectId;
23- (NSWindow*)window;
24
25@end
26
27@implementation MockAccessibilityDelegate
28
29- (NSPoint)accessibilityPointInScreen:
30    (BrowserAccessibilityCocoa*)accessibility {
31  return NSZeroPoint;
32}
33- (void)doDefaultAction:(int32)accessibilityObjectId {
34}
35- (void)setAccessibilityFocus:(BOOL)focus
36              accessibilityId:(int32)accessibilityObjectId {
37}
38- (NSWindow*)window {
39  return nil;
40}
41
42@end
43
44
45class BrowserAccessibilityTest : public CocoaTest {
46 public:
47  virtual void SetUp() {
48    CocoaTest::SetUp();
49    WebAccessibility root;
50    root.location.x = 0;
51    root.location.y = 0;
52    root.location.width = 500;
53    root.location.height = 100;
54    root.role = WebAccessibility::ROLE_WEB_AREA;
55    root.attributes[WebAccessibility::ATTR_HELP] = ASCIIToUTF16("HelpText");
56
57    WebAccessibility child1;
58    child1.name = ASCIIToUTF16("Child1");
59    child1.location.x = 0;
60    child1.location.y = 0;
61    child1.location.width = 250;
62    child1.location.height = 100;
63    child1.role = WebAccessibility::ROLE_BUTTON;
64
65    WebAccessibility child2;
66    child2.location.x = 250;
67    child2.location.y = 0;
68    child2.location.width = 250;
69    child2.location.height = 100;
70    child2.role = WebAccessibility::ROLE_HEADING;
71
72    root.children.push_back(child1);
73    root.children.push_back(child2);
74
75    delegate_.reset([[MockAccessibilityDelegate alloc] init]);
76    manager_.reset(
77        BrowserAccessibilityManager::Create(delegate_, root, NULL));
78    accessibility_.reset([manager_->GetRoot()->toBrowserAccessibilityCocoa()
79        retain]);
80  }
81
82 protected:
83  scoped_nsobject<MockAccessibilityDelegate> delegate_;
84  scoped_nsobject<BrowserAccessibilityCocoa> accessibility_;
85  scoped_ptr<BrowserAccessibilityManager> manager_;
86};
87
88// Standard hit test.
89TEST_F(BrowserAccessibilityTest, HitTestTest) {
90  BrowserAccessibilityCocoa* firstChild =
91      [accessibility_ accessibilityHitTest:NSMakePoint(50, 50)];
92  EXPECT_NSEQ(@"Child1",
93      [firstChild accessibilityAttributeValue:NSAccessibilityTitleAttribute]);
94}
95
96// Test doing a hit test on the edge of a child.
97TEST_F(BrowserAccessibilityTest, EdgeHitTest) {
98  BrowserAccessibilityCocoa* firstChild =
99      [accessibility_ accessibilityHitTest:NSMakePoint(0, 0)];
100  EXPECT_NSEQ(@"Child1",
101      [firstChild accessibilityAttributeValue:NSAccessibilityTitleAttribute]);
102}
103
104// This will test a hit test with invalid coordinates.  It is assumed that
105// the hit test has been narrowed down to this object or one of its children
106// so it should return itself since it has no better hit result.
107TEST_F(BrowserAccessibilityTest, InvalidHitTestCoordsTest) {
108  BrowserAccessibilityCocoa* hitTestResult =
109      [accessibility_ accessibilityHitTest:NSMakePoint(-50, 50)];
110  EXPECT_NSEQ(accessibility_, hitTestResult);
111}
112
113// Test to ensure querying standard attributes works.
114TEST_F(BrowserAccessibilityTest, BasicAttributeTest) {
115  NSString* helpText = [accessibility_
116      accessibilityAttributeValue:NSAccessibilityHelpAttribute];
117  EXPECT_NSEQ(@"HelpText", helpText);
118}
119
120// Test querying for an invalid attribute to ensure it doesn't crash.
121TEST_F(BrowserAccessibilityTest, InvalidAttributeTest) {
122  NSString* shouldBeNil = [accessibility_
123      accessibilityAttributeValue:@"NSAnInvalidAttribute"];
124  EXPECT_TRUE(shouldBeNil == nil);
125}
126