Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / hyperlink_text_view_unittest.mm
1 // Copyright (c) 2011 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 #include "base/mac/scoped_nsobject.h"
6 #import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
7 #import "chrome/browser/ui/cocoa/hyperlink_text_view.h"
8 #include "testing/gtest_mac.h"
9
10 namespace {
11
12 class HyperlinkTextViewTest : public CocoaTest {
13  public:
14   HyperlinkTextViewTest() {
15     NSRect frame = NSMakeRect(0, 0, 50, 50);
16     base::scoped_nsobject<HyperlinkTextView> view(
17         [[HyperlinkTextView alloc] initWithFrame:frame]);
18     view_ = view.get();
19     [[test_window() contentView] addSubview:view_];
20   }
21
22   NSFont* GetDefaultFont() {
23     return [NSFont labelFontOfSize:
24          [NSFont systemFontSizeForControlSize:NSRegularControlSize]];
25   }
26
27   NSDictionary* GetDefaultTextAttributes() {
28     const float kTextBaselineShift = -1.0;
29     return @{
30       NSForegroundColorAttributeName : [NSColor blackColor],
31       NSCursorAttributeName : [NSCursor arrowCursor],
32       NSFontAttributeName : GetDefaultFont(),
33       NSBaselineOffsetAttributeName : @(kTextBaselineShift)
34     };
35   }
36
37   NSMutableDictionary* GetDefaultLinkAttributes() {
38     if (!linkAttributes_.get()) {
39       linkAttributes_.reset(
40           [[NSMutableDictionary dictionaryWithDictionary:
41               GetDefaultTextAttributes()] retain]);
42       [linkAttributes_ addEntriesFromDictionary:@{
43           NSForegroundColorAttributeName : [NSColor blueColor],
44           NSUnderlineStyleAttributeName : @(YES),
45           NSCursorAttributeName : [NSCursor pointingHandCursor],
46           NSUnderlineStyleAttributeName : @(NSSingleUnderlineStyle),
47           NSLinkAttributeName : @""}];
48     }
49     return [NSMutableDictionary dictionaryWithDictionary:linkAttributes_];
50   }
51
52   HyperlinkTextView* view_;
53
54  private:
55   base::scoped_nsobject<NSMutableDictionary> linkAttributes_;
56 };
57
58 TEST_VIEW(HyperlinkTextViewTest, view_);
59
60 TEST_F(HyperlinkTextViewTest, TestViewConfiguration) {
61   EXPECT_FALSE([view_ isEditable]);
62   EXPECT_FALSE([view_ drawsBackground]);
63   EXPECT_FALSE([view_ isHorizontallyResizable]);
64   EXPECT_FALSE([view_ isVerticallyResizable]);
65 }
66
67 TEST_F(HyperlinkTextViewTest, LinkInsertion) {
68   // Test that setMessage:withLink:... inserts the link text.
69   [view_ setMessageAndLink:@"This is a short text message"
70                   withLink:@"alarmingly "
71                   atOffset:10
72                       font:GetDefaultFont()
73               messageColor:[NSColor blackColor]
74                  linkColor:[NSColor blueColor]];
75   EXPECT_NSEQ(@"This is a alarmingly short text message",
76               [[view_ textStorage] string]);
77
78   // Test insertion at end - most common use case.
79   NSString* message=@"This is another test message ";
80   [view_ setMessageAndLink:message
81                   withLink:@"with link"
82                   atOffset:[message length]
83                       font:GetDefaultFont()
84               messageColor:[NSColor blackColor]
85                  linkColor:[NSColor blueColor]];
86   EXPECT_NSEQ(@"This is another test message with link",
87               [[view_ textStorage] string]);
88 }
89
90 TEST_F(HyperlinkTextViewTest, AttributesForMessageWithLink) {
91   // Verifies text attributes are set as expected for setMessageWithLink:...
92   [view_ setMessageAndLink:@"aaabbbbb"
93                   withLink:@"xxxx"
94                   atOffset:3
95                       font:GetDefaultFont()
96               messageColor:[NSColor blackColor]
97                  linkColor:[NSColor blueColor]];
98
99   NSDictionary* attributes;
100   NSRange rangeLimit = NSMakeRange(0, 12);
101   NSRange range;
102   attributes = [[view_ textStorage] attributesAtIndex:0
103                                 longestEffectiveRange:&range
104                                               inRange:rangeLimit];
105   EXPECT_EQ(0U, range.location);
106   EXPECT_EQ(3U, range.length);
107   EXPECT_NSEQ(GetDefaultTextAttributes(), attributes);
108
109   attributes = [[view_ textStorage] attributesAtIndex:3
110                                 longestEffectiveRange:&range
111                                               inRange:rangeLimit];
112   EXPECT_EQ(3U, range.location);
113   EXPECT_EQ(4U, range.length);
114   EXPECT_NSEQ(GetDefaultLinkAttributes(), attributes);
115
116   attributes = [[view_ textStorage] attributesAtIndex:7
117                                 longestEffectiveRange:&range
118                                               inRange:rangeLimit];
119   EXPECT_EQ(7U, range.location);
120   EXPECT_EQ(5U, range.length);
121   EXPECT_NSEQ(GetDefaultTextAttributes(), attributes);
122
123 }
124
125 TEST_F(HyperlinkTextViewTest, TestSetMessage) {
126   // Verifies setMessage sets text and attributes properly.
127   NSString* message = @"Test message";
128   [view_ setMessage:message
129            withFont:GetDefaultFont()
130        messageColor:[NSColor blackColor]];
131   EXPECT_NSEQ(@"Test message", [[view_ textStorage] string]);
132
133   NSDictionary* attributes;
134   NSRange rangeLimit = NSMakeRange(0, [message length]);
135   NSRange range;
136   attributes = [[view_ textStorage] attributesAtIndex:0
137                                 longestEffectiveRange:&range
138                                               inRange:rangeLimit];
139   EXPECT_EQ(0U, range.location);
140   EXPECT_EQ([message length], range.length);
141   EXPECT_NSEQ(GetDefaultTextAttributes(), attributes);
142 }
143
144 TEST_F(HyperlinkTextViewTest, TestAddLinkRange) {
145   NSString* message = @"One Two Three Four";
146   [view_ setMessage:message
147            withFont:GetDefaultFont()
148        messageColor:[NSColor blackColor]];
149
150   NSColor* blue = [NSColor blueColor];
151   [view_ addLinkRange:NSMakeRange(4,3) withName:@"Name:Two" linkColor:blue];
152   [view_ addLinkRange:NSMakeRange(14,4) withName:@"Name:Four" linkColor:blue];
153
154   NSDictionary* attributes;
155   NSRange rangeLimit = NSMakeRange(0, [message length]);
156   NSRange range;
157   attributes = [[view_ textStorage] attributesAtIndex:0
158                                 longestEffectiveRange:&range
159                                               inRange:rangeLimit];
160   EXPECT_EQ(0U, range.location);
161   EXPECT_EQ(4U, range.length);
162   EXPECT_NSEQ(GetDefaultTextAttributes(), attributes);
163
164   NSMutableDictionary* linkAttributes = GetDefaultLinkAttributes();
165   [linkAttributes setObject:@"Name:Two" forKey:NSLinkAttributeName];
166   attributes = [[view_ textStorage] attributesAtIndex:4
167                                 longestEffectiveRange:&range
168                                               inRange:rangeLimit];
169   EXPECT_EQ(4U, range.location);
170   EXPECT_EQ(3U, range.length);
171   EXPECT_NSEQ(linkAttributes, attributes);
172
173   attributes = [[view_ textStorage] attributesAtIndex:7
174                                 longestEffectiveRange:&range
175                                               inRange:rangeLimit];
176   EXPECT_EQ(7U, range.location);
177   EXPECT_EQ(7U, range.length);
178   EXPECT_NSEQ(GetDefaultTextAttributes(), attributes);
179
180   [linkAttributes setObject:@"Name:Four" forKey:NSLinkAttributeName];
181   attributes = [[view_ textStorage] attributesAtIndex:14
182                                 longestEffectiveRange:&range
183                                               inRange:rangeLimit];
184   EXPECT_EQ(14U, range.location);
185   EXPECT_EQ(4U, range.length);
186   EXPECT_NSEQ(linkAttributes, attributes);
187 }
188
189 TEST_F(HyperlinkTextViewTest, FirstResponderBehavior) {
190   // By default, accept.
191   EXPECT_TRUE([view_ acceptsFirstResponder]);
192
193   [view_ setRefusesFirstResponder:YES];
194   EXPECT_FALSE([view_ acceptsFirstResponder]);
195 }
196
197 }  // namespace