• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <AppKit/AppKit.h>
6
7#include "base/mac/scoped_nsobject.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/strings/utf_string_conversions.h"
10#import "content/common/mac/attributed_string_coder.h"
11#include "testing/gtest/include/gtest/gtest.h"
12#include "testing/gtest_mac.h"
13
14using mac::AttributedStringCoder;
15
16class AttributedStringCoderTest : public testing::Test {
17 public:
18  NSMutableAttributedString* NewAttrString() {
19    NSString* str = @"The quick brown fox jumped over the lazy dog.";
20    return [[NSMutableAttributedString alloc] initWithString:str];
21  }
22
23  NSDictionary* FontAttribute(NSString* name, CGFloat size) {
24    NSFont* font = [NSFont fontWithName:name size:size];
25    return [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
26  }
27
28  NSAttributedString* EncodeAndDecode(NSAttributedString* str) {
29    scoped_ptr<const AttributedStringCoder::EncodedString> encoded_str(
30        AttributedStringCoder::Encode(str));
31    return AttributedStringCoder::Decode(encoded_str.get());
32  }
33};
34
35TEST_F(AttributedStringCoderTest, SimpleString) {
36  base::scoped_nsobject<NSMutableAttributedString> attr_str(NewAttrString());
37  [attr_str addAttributes:FontAttribute(@"Helvetica", 12.5)
38                    range:NSMakeRange(0, [attr_str length])];
39
40  NSAttributedString* decoded = EncodeAndDecode(attr_str.get());
41  EXPECT_NSEQ(attr_str.get(), decoded);
42}
43
44TEST_F(AttributedStringCoderTest, NoAttributes) {
45  base::scoped_nsobject<NSAttributedString> attr_str(NewAttrString());
46  NSAttributedString* decoded = EncodeAndDecode(attr_str.get());
47  EXPECT_NSEQ(attr_str.get(), decoded);
48}
49
50TEST_F(AttributedStringCoderTest, StripColor) {
51  base::scoped_nsobject<NSMutableAttributedString> attr_str(NewAttrString());
52  const NSUInteger kStringLength = [attr_str length];
53  [attr_str addAttribute:NSFontAttributeName
54                   value:[NSFont systemFontOfSize:26]
55                   range:NSMakeRange(0, kStringLength)];
56  [attr_str addAttribute:NSForegroundColorAttributeName
57                   value:[NSColor redColor]
58                   range:NSMakeRange(0, kStringLength)];
59
60  NSAttributedString* decoded = EncodeAndDecode(attr_str.get());
61
62  NSRange range;
63  NSDictionary* attrs = [decoded attributesAtIndex:0 effectiveRange:&range];
64  EXPECT_TRUE(NSEqualRanges(NSMakeRange(0, kStringLength), range));
65  EXPECT_NSEQ([NSFont systemFontOfSize:26],
66              [attrs objectForKey:NSFontAttributeName]);
67  EXPECT_FALSE([attrs objectForKey:NSForegroundColorAttributeName]);
68}
69
70TEST_F(AttributedStringCoderTest, MultipleFonts) {
71  base::scoped_nsobject<NSMutableAttributedString> attr_str(NewAttrString());
72  [attr_str setAttributes:FontAttribute(@"Courier", 12)
73                    range:NSMakeRange(0, 10)];
74  [attr_str addAttributes:FontAttribute(@"Helvetica", 16)
75                    range:NSMakeRange(12, 6)];
76  [attr_str addAttributes:FontAttribute(@"Helvetica", 14)
77                    range:NSMakeRange(15, 5)];
78
79  NSAttributedString* decoded = EncodeAndDecode(attr_str);
80
81  EXPECT_NSEQ(attr_str.get(), decoded);
82}
83
84TEST_F(AttributedStringCoderTest, NoPertinentAttributes) {
85  base::scoped_nsobject<NSMutableAttributedString> attr_str(NewAttrString());
86  [attr_str addAttribute:NSForegroundColorAttributeName
87                   value:[NSColor blueColor]
88                   range:NSMakeRange(0, 10)];
89  [attr_str addAttribute:NSBackgroundColorAttributeName
90                   value:[NSColor blueColor]
91                   range:NSMakeRange(15, 5)];
92  [attr_str addAttribute:NSKernAttributeName
93                   value:[NSNumber numberWithFloat:2.6]
94                   range:NSMakeRange(11, 3)];
95
96  NSAttributedString* decoded = EncodeAndDecode(attr_str.get());
97
98  base::scoped_nsobject<NSAttributedString> expected(NewAttrString());
99  EXPECT_NSEQ(expected.get(), decoded);
100}
101
102TEST_F(AttributedStringCoderTest, NilString) {
103  NSAttributedString* decoded = EncodeAndDecode(nil);
104  EXPECT_TRUE(decoded);
105  EXPECT_EQ(0U, [decoded length]);
106}
107
108TEST_F(AttributedStringCoderTest, OutOfRange) {
109  AttributedStringCoder::EncodedString encoded(
110      base::ASCIIToUTF16("Hello World"));
111  encoded.attributes()->push_back(
112      AttributedStringCoder::FontAttribute(
113          FontDescriptor([NSFont systemFontOfSize:12]),
114          gfx::Range(0, 5)));
115  encoded.attributes()->push_back(
116      AttributedStringCoder::FontAttribute(
117          FontDescriptor([NSFont systemFontOfSize:14]),
118          gfx::Range(5, 100)));
119  encoded.attributes()->push_back(
120      AttributedStringCoder::FontAttribute(
121          FontDescriptor([NSFont systemFontOfSize:16]),
122          gfx::Range(100, 5)));
123
124  NSAttributedString* decoded = AttributedStringCoder::Decode(&encoded);
125  EXPECT_TRUE(decoded);
126
127  NSRange range;
128  NSDictionary* attrs = [decoded attributesAtIndex:0 effectiveRange:&range];
129  EXPECT_NSEQ([NSFont systemFontOfSize:12],
130              [attrs objectForKey:NSFontAttributeName]);
131  EXPECT_TRUE(NSEqualRanges(range, NSMakeRange(0, 5)));
132
133  attrs = [decoded attributesAtIndex:5 effectiveRange:&range];
134  EXPECT_FALSE([attrs objectForKey:NSFontAttributeName]);
135  EXPECT_EQ(0U, [attrs count]);
136}
137