Home | History | Annotate | Download | only in mac
      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 
     14 using mac::AttributedStringCoder;
     15 
     16 class 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 
     35 TEST_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 
     44 TEST_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 
     50 TEST_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 
     70 TEST_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 
     84 TEST_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 
    102 TEST_F(AttributedStringCoderTest, NilString) {
    103   NSAttributedString* decoded = EncodeAndDecode(nil);
    104   EXPECT_TRUE(decoded);
    105   EXPECT_EQ(0U, [decoded length]);
    106 }
    107 
    108 TEST_F(AttributedStringCoderTest, OutOfRange) {
    109   AttributedStringCoder::EncodedString encoded(ASCIIToUTF16("Hello World"));
    110   encoded.attributes()->push_back(
    111       AttributedStringCoder::FontAttribute(
    112           FontDescriptor([NSFont systemFontOfSize:12]),
    113           ui::Range(0, 5)));
    114   encoded.attributes()->push_back(
    115       AttributedStringCoder::FontAttribute(
    116           FontDescriptor([NSFont systemFontOfSize:14]),
    117           ui::Range(5, 100)));
    118   encoded.attributes()->push_back(
    119       AttributedStringCoder::FontAttribute(
    120           FontDescriptor([NSFont systemFontOfSize:16]),
    121           ui::Range(100, 5)));
    122 
    123   NSAttributedString* decoded = AttributedStringCoder::Decode(&encoded);
    124   EXPECT_TRUE(decoded);
    125 
    126   NSRange range;
    127   NSDictionary* attrs = [decoded attributesAtIndex:0 effectiveRange:&range];
    128   EXPECT_NSEQ([NSFont systemFontOfSize:12],
    129               [attrs objectForKey:NSFontAttributeName]);
    130   EXPECT_TRUE(NSEqualRanges(range, NSMakeRange(0, 5)));
    131 
    132   attrs = [decoded attributesAtIndex:5 effectiveRange:&range];
    133   EXPECT_FALSE([attrs objectForKey:NSFontAttributeName]);
    134   EXPECT_EQ(0U, [attrs count]);
    135 }
    136