1 // Copyright 2014 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 #import "ui/ios/NSString+CrStringDrawing.h" 5 6 #include "base/mac/scoped_nsobject.h" 7 #include "base/strings/stringprintf.h" 8 #include "base/strings/sys_string_conversions.h" 9 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/platform_test.h" 11 12 namespace { 13 14 typedef PlatformTest NSStringCrStringDrawing; 15 16 // These test verifies that the category methods return the same values as the 17 // deprecated methods, so ignore warnings about using deprecated methods. 18 #pragma clang diagnostic push 19 #pragma clang diagnostic ignored "-Wdeprecated-declarations" 20 21 TEST_F(NSStringCrStringDrawing, SizeWithFont) { 22 NSArray* fonts = @[ 23 [NSNull null], 24 [UIFont systemFontOfSize:16], 25 [UIFont boldSystemFontOfSize:10], 26 [UIFont fontWithName:@"Helvetica" size:12.0], 27 ]; 28 for (UIFont* font in fonts) { 29 if ([font isEqual:[NSNull null]]) 30 font = nil; 31 std::string font_tag = "with font "; 32 font_tag.append( 33 base::SysNSStringToUTF8(font ? [font description] : @"nil")); 34 EXPECT_EQ([@"" sizeWithFont:font].width, 35 [@"" cr_sizeWithFont:font].width) << font_tag; 36 EXPECT_EQ([@"" sizeWithFont:font].height, 37 [@"" cr_sizeWithFont:font].height) << font_tag; 38 EXPECT_EQ([@"Test" sizeWithFont:font].width, 39 [@"Test" cr_sizeWithFont:font].width) << font_tag; 40 EXPECT_EQ([@"Test" sizeWithFont:font].height, 41 [@"Test" cr_sizeWithFont:font].height) << font_tag; 42 EXPECT_EQ([@"" sizeWithFont:font].width, 43 [@"" cr_sizeWithFont:font].width) << font_tag; 44 EXPECT_EQ([@"" sizeWithFont:font].height, 45 [@"" cr_sizeWithFont:font].height) << font_tag; 46 NSString* long_string = @" This is a test string that is very long."; 47 EXPECT_EQ([long_string sizeWithFont:font].width, 48 [long_string cr_sizeWithFont:font].width) << font_tag; 49 EXPECT_EQ([long_string sizeWithFont:font].height, 50 [long_string cr_sizeWithFont:font].height) << font_tag; 51 } 52 } 53 #pragma clang diagnostic pop // ignored "-Wdeprecated-declarations" 54 55 TEST_F(NSStringCrStringDrawing, PixelAlignedSizeWithFont) { 56 NSArray* fonts = @[ 57 [UIFont systemFontOfSize:16], 58 [UIFont boldSystemFontOfSize:10], 59 [UIFont fontWithName:@"Helvetica" size:12.0], 60 ]; 61 NSArray* strings = @[ 62 @"", 63 @"Test", 64 @"", 65 @" This is a test string that is very long.", 66 ]; 67 for (UIFont* font in fonts) { 68 NSDictionary* attributes = @{ NSFontAttributeName : font }; 69 70 for (NSString* string in strings) { 71 std::string test_tag = base::StringPrintf("for string '%s' with font %s", 72 base::SysNSStringToUTF8(string).c_str(), 73 base::SysNSStringToUTF8([font description]).c_str()); 74 75 CGSize size_with_attributes = [string sizeWithAttributes:attributes]; 76 CGSize size_with_pixel_aligned = 77 [string cr_pixelAlignedSizeWithFont:font]; 78 79 // Verify that the pixel_aligned size is always rounded up (i.e. the size 80 // returned from sizeWithAttributes: is less than or equal to the pixel- 81 // aligned size). 82 EXPECT_LE(size_with_attributes.width, 83 size_with_pixel_aligned.width) << test_tag; 84 EXPECT_LE(size_with_attributes.height, 85 size_with_pixel_aligned.height) << test_tag; 86 87 // Verify that the pixel_aligned size is never more than a pixel different 88 // than the size returned from sizeWithAttributes:. 89 static CGFloat scale = [[UIScreen mainScreen] scale]; 90 EXPECT_NEAR(size_with_attributes.width * scale, 91 size_with_pixel_aligned.width * scale, 92 0.9999) << test_tag; 93 EXPECT_NEAR(size_with_attributes.height * scale, 94 size_with_pixel_aligned.height * scale, 95 0.9999) << test_tag; 96 97 // Verify that the pixel-aligned value is pixel-aligned. 98 EXPECT_FLOAT_EQ(roundf(size_with_pixel_aligned.width * scale), 99 size_with_pixel_aligned.width * scale) << test_tag; 100 EXPECT_FLOAT_EQ(roundf(size_with_pixel_aligned.height * scale), 101 size_with_pixel_aligned.height * scale) << test_tag; 102 } 103 } 104 } 105 106 107 } // namespace 108