OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ios/chrome/browser/ui/util/manual_text_framer.h" | 5 #include "ios/chrome/browser/ui/util/manual_text_framer.h" |
6 | 6 |
7 #include "base/mac/foundation_util.h" | 7 #include "base/mac/foundation_util.h" |
8 #include "base/time/time.h" | 8 #include "base/time/time.h" |
9 #import "ios/chrome/browser/ui/util/core_text_util.h" | 9 #import "ios/chrome/browser/ui/util/core_text_util.h" |
10 #import "ios/chrome/browser/ui/util/text_frame.h" | 10 #import "ios/chrome/browser/ui/util/text_frame.h" |
11 #import "ios/third_party/material_roboto_font_loader_ios/src/src/MaterialRobotoF
ontLoader.h" | 11 #import "ios/third_party/material_components_ios/src/components/Typography/src/M
aterialTypography.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
13 #include "testing/gtest_mac.h" | 13 #include "testing/gtest_mac.h" |
14 #include "testing/platform_test.h" | 14 #include "testing/platform_test.h" |
15 #include "url/gurl.h" | 15 #include "url/gurl.h" |
16 | 16 |
17 #if !defined(__has_feature) || !__has_feature(objc_arc) | 17 #if !defined(__has_feature) || !__has_feature(objc_arc) |
18 #error "This file requires ARC support." | 18 #error "This file requires ARC support." |
19 #endif | 19 #endif |
20 | 20 |
21 namespace { | 21 namespace { |
22 // Copy of ManualTextFramer's alignment function. | 22 void ExpectNearPoint(CGFloat value1, CGFloat value2) { |
23 enum class AlignmentFunction : short { CEIL = 0, FLOOR }; | 23 EXPECT_NEAR(value1, value2, 1); |
24 CGFloat AlignValueToPixel(CGFloat value, AlignmentFunction function) { | |
25 static CGFloat scale = [[UIScreen mainScreen] scale]; | |
26 return function == AlignmentFunction::CEIL ? ceil(value * scale) / scale | |
27 : floor(value * scale) / scale; | |
28 } | 24 } |
29 | 25 |
30 class ManualTextFramerTest : public PlatformTest { | 26 class ManualTextFramerTest : public PlatformTest { |
31 protected: | 27 protected: |
32 ManualTextFramerTest() { | 28 ManualTextFramerTest() { |
33 attributes_ = [[NSMutableDictionary alloc] init]; | 29 attributes_ = [[NSMutableDictionary alloc] init]; |
34 string_ = [[NSMutableAttributedString alloc] init]; | 30 string_ = [[NSMutableAttributedString alloc] init]; |
35 } | 31 } |
36 | 32 |
37 NSString* text() { return [string_ string]; } | 33 NSString* text() { return [string_ string]; } |
38 NSRange text_range() { return NSMakeRange(0, [string_ length]); } | 34 NSRange text_range() { return NSMakeRange(0, [string_ length]); } |
39 id<TextFrame> text_frame() { return static_cast<id<TextFrame>>(text_frame_); } | 35 id<TextFrame> text_frame() { return static_cast<id<TextFrame>>(text_frame_); } |
40 | 36 |
41 void SetText(NSString* text) { | 37 void SetText(NSString* text) { |
42 DCHECK(text.length); | 38 DCHECK(text.length); |
43 [[string_ mutableString] setString:text]; | 39 [[string_ mutableString] setString:text]; |
44 } | 40 } |
45 | 41 |
46 void FrameTextInBounds(CGRect bounds) { | 42 void FrameTextInBounds(CGRect bounds) { |
47 ManualTextFramer* manual_framer = | 43 ManualTextFramer* manual_framer = |
48 [[ManualTextFramer alloc] initWithString:string_ inBounds:bounds]; | 44 [[ManualTextFramer alloc] initWithString:string_ inBounds:bounds]; |
49 [manual_framer frameText]; | 45 [manual_framer frameText]; |
50 id frame = [manual_framer textFrame]; | 46 id frame = [manual_framer textFrame]; |
51 text_frame_ = frame; | 47 text_frame_ = frame; |
52 } | 48 } |
53 | 49 |
54 UIFont* RobotoFontWithSize(CGFloat size) { | 50 UIFont* TypographyFontWithSize(CGFloat size) { |
55 return [[MDFRobotoFontLoader sharedInstance] regularFontOfSize:size]; | 51 return [[MDCTypography fontLoader] regularFontOfSize:size]; |
56 } | 52 } |
57 | 53 |
58 NSParagraphStyle* CreateParagraphStyle(CGFloat line_height, | 54 NSParagraphStyle* CreateParagraphStyle(CGFloat line_height, |
59 NSTextAlignment alignment, | 55 NSTextAlignment alignment, |
60 NSLineBreakMode line_break_mode) { | 56 NSLineBreakMode line_break_mode) { |
61 NSMutableParagraphStyle* style = [[NSMutableParagraphStyle alloc] init]; | 57 NSMutableParagraphStyle* style = [[NSMutableParagraphStyle alloc] init]; |
62 style.alignment = alignment; | 58 style.alignment = alignment; |
63 style.lineBreakMode = line_break_mode; | 59 style.lineBreakMode = line_break_mode; |
64 style.minimumLineHeight = line_height; | 60 style.minimumLineHeight = line_height; |
65 style.maximumLineHeight = line_height; | 61 style.maximumLineHeight = line_height; |
(...skipping 15 matching lines...) Expand all Loading... |
81 | 77 |
82 NSMutableDictionary* attributes_; | 78 NSMutableDictionary* attributes_; |
83 NSMutableAttributedString* string_; | 79 NSMutableAttributedString* string_; |
84 id<TextFrame> text_frame_; | 80 id<TextFrame> text_frame_; |
85 }; | 81 }; |
86 | 82 |
87 // Tests that newline characters cause an attributed string to be laid out on | 83 // Tests that newline characters cause an attributed string to be laid out on |
88 // multiple lines. | 84 // multiple lines. |
89 TEST_F(ManualTextFramerTest, NewlineTest) { | 85 TEST_F(ManualTextFramerTest, NewlineTest) { |
90 SetText(@"line one\nline two\nline three"); | 86 SetText(@"line one\nline two\nline three"); |
91 attributes()[NSFontAttributeName] = RobotoFontWithSize(14.0); | 87 attributes()[NSFontAttributeName] = TypographyFontWithSize(14.0); |
92 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 88 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
93 20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping); | 89 20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping); |
94 ApplyAttributesForRange(text_range()); | 90 ApplyAttributesForRange(text_range()); |
95 CGRect bounds = CGRectMake(0, 0, 500, 500); | 91 CGRect bounds = CGRectMake(0, 0, 500, 500); |
96 FrameTextInBounds(bounds); | 92 FrameTextInBounds(bounds); |
97 CheckForLineCountAndFramedRange(3, text_range()); | 93 CheckForLineCountAndFramedRange(3, text_range()); |
98 } | 94 } |
99 | 95 |
100 // Tests that strings with no spaces fail correctly. | 96 // Tests that strings with no spaces fail correctly. |
101 TEST_F(ManualTextFramerTest, NoSpacesText) { | 97 TEST_F(ManualTextFramerTest, NoSpacesText) { |
102 // "St. Mary's church in the hollow of the white hazel near the the rapid | 98 // "St. Mary's church in the hollow of the white hazel near the the rapid |
103 // whirlpool of Llantysilio of the red cave." | 99 // whirlpool of Llantysilio of the red cave." |
104 SetText( | 100 SetText( |
105 @"Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch"); | 101 @"Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch"); |
106 attributes()[NSFontAttributeName] = RobotoFontWithSize(16.0); | 102 attributes()[NSFontAttributeName] = TypographyFontWithSize(16.0); |
107 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 103 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
108 20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping); | 104 20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping); |
109 ApplyAttributesForRange(text_range()); | 105 ApplyAttributesForRange(text_range()); |
110 CGRect bounds = CGRectMake(0, 0, 200, 60); | 106 CGRect bounds = CGRectMake(0, 0, 200, 60); |
111 FrameTextInBounds(bounds); | 107 FrameTextInBounds(bounds); |
112 CheckForLineCountAndFramedRange(0, NSMakeRange(0, 0)); | 108 CheckForLineCountAndFramedRange(0, NSMakeRange(0, 0)); |
113 } | 109 } |
114 | 110 |
115 // Tests that multiple newlines are accounted for. Only the first three | 111 // Tests that multiple newlines are accounted for. Only the first three |
116 // newlines should be added to |lines_|. | 112 // newlines should be added to |lines_|. |
117 TEST_F(ManualTextFramerTest, MultipleNewlineTest) { | 113 TEST_F(ManualTextFramerTest, MultipleNewlineTest) { |
118 SetText(@"\n\n\ntext"); | 114 SetText(@"\n\n\ntext"); |
119 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 115 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
120 20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping); | 116 20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping); |
121 ApplyAttributesForRange(text_range()); | 117 ApplyAttributesForRange(text_range()); |
122 CGRect bounds = CGRectMake(0, 0, 500, 60); | 118 CGRect bounds = CGRectMake(0, 0, 500, 60); |
123 FrameTextInBounds(bounds); | 119 FrameTextInBounds(bounds); |
124 CheckForLineCountAndFramedRange(3, NSMakeRange(0, 3)); | 120 CheckForLineCountAndFramedRange(3, NSMakeRange(0, 3)); |
125 } | 121 } |
126 | 122 |
127 // Tests that the framed range for text that will be rendered with ligatures is | 123 // Tests that the framed range for text that will be rendered with ligatures is |
128 // corresponds with the actual range of the text. | 124 // corresponds with the actual range of the text. |
129 TEST_F(ManualTextFramerTest, LigatureTest) { | 125 TEST_F(ManualTextFramerTest, LigatureTest) { |
130 SetText(@"fffi"); | 126 SetText(@"fffi"); |
131 attributes()[NSFontAttributeName] = RobotoFontWithSize(14.0); | 127 attributes()[NSFontAttributeName] = TypographyFontWithSize(14.0); |
132 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 128 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
133 20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping); | 129 20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping); |
134 ApplyAttributesForRange(text_range()); | 130 ApplyAttributesForRange(text_range()); |
135 CGRect bounds = CGRectMake(0, 0, 500, 20); | 131 CGRect bounds = CGRectMake(0, 0, 500, 20); |
136 FrameTextInBounds(bounds); | 132 FrameTextInBounds(bounds); |
137 CheckForLineCountAndFramedRange(1, text_range()); | 133 CheckForLineCountAndFramedRange(1, text_range()); |
138 } | 134 } |
139 | 135 |
140 // Tests that ManualTextFramer correctly frames Å | 136 // Tests that ManualTextFramer correctly frames Å |
141 TEST_F(ManualTextFramerTest, DiacriticTest) { | 137 TEST_F(ManualTextFramerTest, DiacriticTest) { |
142 SetText(@"A\u030A"); | 138 SetText(@"A\u030A"); |
143 attributes()[NSFontAttributeName] = RobotoFontWithSize(14.0); | 139 attributes()[NSFontAttributeName] = TypographyFontWithSize(14.0); |
144 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 140 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
145 20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping); | 141 20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping); |
146 ApplyAttributesForRange(text_range()); | 142 ApplyAttributesForRange(text_range()); |
147 CGRect bounds = CGRectMake(0, 0, 500, 20); | 143 CGRect bounds = CGRectMake(0, 0, 500, 20); |
148 FrameTextInBounds(bounds); | 144 FrameTextInBounds(bounds); |
149 CheckForLineCountAndFramedRange(1, text_range()); | 145 CheckForLineCountAndFramedRange(1, text_range()); |
150 } | 146 } |
151 | 147 |
152 // String text, attributes, and bounds are chosen to match the "Terms of | 148 // String text, attributes, and bounds are chosen to match the "Terms of |
153 // Service" text in WelcomeToChromeView, as the text is not properly framed by | 149 // Service" text in WelcomeToChromeView, as the text is not properly framed by |
154 // CTFrameSetter. http://crbug.com/537212 | 150 // CTFrameSetter. http://crbug.com/537212 |
155 TEST_F(ManualTextFramerTest, TOSTextTest) { | 151 TEST_F(ManualTextFramerTest, TOSTextTest) { |
156 CGRect bounds = CGRectMake(0, 0, 300.0, 40.0); | 152 CGRect bounds = CGRectMake(0, 0, 300.0, 40.0); |
157 NSString* const kTOSLinkText = @"Terms of Service"; | 153 NSString* const kTOSLinkText = @"Terms of Service"; |
158 NSString* const kTOSText = | 154 NSString* const kTOSText = |
159 @"By using this application, you agree to Chrome’s Terms of Service."; | 155 @"By using this application, you agree to Chrome’s Terms of Service."; |
160 SetText(kTOSText); | 156 SetText(kTOSText); |
161 attributes()[NSFontAttributeName] = RobotoFontWithSize(14.0); | 157 attributes()[NSFontAttributeName] = TypographyFontWithSize(14.0); |
162 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 158 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
163 20.0, NSTextAlignmentCenter, NSLineBreakByTruncatingTail); | 159 20.0, NSTextAlignmentCenter, NSLineBreakByTruncatingTail); |
164 attributes()[NSForegroundColorAttributeName] = [UIColor blackColor]; | 160 attributes()[NSForegroundColorAttributeName] = [UIColor blackColor]; |
165 ApplyAttributesForRange(text_range()); | 161 ApplyAttributesForRange(text_range()); |
166 attributes()[NSForegroundColorAttributeName] = [UIColor blueColor]; | 162 attributes()[NSForegroundColorAttributeName] = [UIColor blueColor]; |
167 ApplyAttributesForRange([kTOSText rangeOfString:kTOSLinkText]); | 163 ApplyAttributesForRange([kTOSText rangeOfString:kTOSLinkText]); |
168 FrameTextInBounds(bounds); | 164 FrameTextInBounds(bounds); |
169 CheckForLineCountAndFramedRange(2, text_range()); | 165 CheckForLineCountAndFramedRange(2, text_range()); |
170 } | 166 } |
171 | 167 |
172 // Tests that the origin of a left-aligned single line is correct. | 168 // Tests that the origin of a left-aligned single line is correct. |
173 TEST_F(ManualTextFramerTest, SimpleOriginTest) { | 169 TEST_F(ManualTextFramerTest, SimpleOriginTest) { |
174 SetText(@"test"); | 170 SetText(@"test"); |
175 UIFont* font = RobotoFontWithSize(14.0); | 171 UIFont* font = TypographyFontWithSize(14.0); |
176 attributes()[NSFontAttributeName] = font; | 172 attributes()[NSFontAttributeName] = font; |
177 CGFloat line_height = 20.0; | 173 CGFloat line_height = 20.0; |
178 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 174 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
179 line_height, NSTextAlignmentLeft, NSLineBreakByWordWrapping); | 175 line_height, NSTextAlignmentLeft, NSLineBreakByWordWrapping); |
180 ApplyAttributesForRange(text_range()); | 176 ApplyAttributesForRange(text_range()); |
181 CGRect bounds = CGRectMake(0, 0, 500, 21); | 177 CGRect bounds = CGRectMake(0, 0, 500, 21); |
182 FrameTextInBounds(bounds); | 178 FrameTextInBounds(bounds); |
183 CheckForLineCountAndFramedRange(1, text_range()); | 179 CheckForLineCountAndFramedRange(1, text_range()); |
184 FramedLine* line = [text_frame().lines firstObject]; | 180 FramedLine* line = [text_frame().lines firstObject]; |
185 EXPECT_EQ(0, line.origin.x); | 181 EXPECT_EQ(0, line.origin.x); |
186 EXPECT_EQ( | 182 ExpectNearPoint(CGRectGetHeight(bounds) - line_height - font.descender, |
187 AlignValueToPixel(CGRectGetHeight(bounds) - line_height - font.descender, | 183 line.origin.y); |
188 AlignmentFunction::FLOOR), | |
189 line.origin.y); | |
190 } | 184 } |
191 | 185 |
192 // Tests that lines that are laid out in RTL are right aligned. | 186 // Tests that lines that are laid out in RTL are right aligned. |
193 TEST_F(ManualTextFramerTest, OriginRTLTest) { | 187 TEST_F(ManualTextFramerTest, OriginRTLTest) { |
194 SetText(@"\u0641\u064e\u0628\u064e\u0642\u064e\u064a\u0652\u062a\u064f\u0020" | 188 SetText(@"\u0641\u064e\u0628\u064e\u0642\u064e\u064a\u0652\u062a\u064f\u0020" |
195 @"\u0645\u064f\u062a\u064e\u0627\u0628\u0650\u0639\u064e\u0627\u064b" | 189 @"\u0645\u064f\u062a\u064e\u0627\u0628\u0650\u0639\u064e\u0627\u064b" |
196 @"\u0020\u0028\u0634\u064f\u063a\u0652\u0644\u0650\u064a\u0029\u0020" | 190 @"\u0020\u0028\u0634\u064f\u063a\u0652\u0644\u0650\u064a\u0029\u0020" |
197 @"\u0644\u064e\u0639\u064e\u0644\u064e\u0643\u0650\u0020\u062a\u064e" | 191 @"\u0644\u064e\u0639\u064e\u0644\u064e\u0643\u0650\u0020\u062a\u064e" |
198 @"\u062a\u064e\u0639\u064e\u0644\u0651\u064e\u0645\u064e\u0020\u0627" | 192 @"\u062a\u064e\u0639\u064e\u0644\u0651\u064e\u0645\u064e\u0020\u0627" |
199 @"\u0644\u062d\u0650\u0631\u0652\u0635\u064e\u0020\u0639\u064e\u0644" | 193 @"\u0644\u062d\u0650\u0631\u0652\u0635\u064e\u0020\u0639\u064e\u0644" |
200 @"\u064e\u0649\u0020\u0627\u0644\u0648\u064e\u0642\u0652\u062a\u0650" | 194 @"\u064e\u0649\u0020\u0627\u0644\u0648\u064e\u0642\u0652\u062a\u0650" |
201 @"\u0020\u002e\u0020\u0641\u064e\u0627\u0644\u062d\u064e\u064a\u064e" | 195 @"\u0020\u002e\u0020\u0641\u064e\u0627\u0644\u062d\u064e\u064a\u064e" |
202 @"\u0627\u0629\u064f"); | 196 @"\u0627\u0629\u064f"); |
203 attributes()[NSFontAttributeName] = RobotoFontWithSize(14.0); | 197 attributes()[NSFontAttributeName] = TypographyFontWithSize(14.0); |
204 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 198 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
205 20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping); | 199 20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping); |
206 ApplyAttributesForRange(text_range()); | 200 ApplyAttributesForRange(text_range()); |
207 CGRect bounds = CGRectMake(0, 0, 100.0, 60.0); | 201 CGRect bounds = CGRectMake(0, 0, 100.0, 60.0); |
208 FrameTextInBounds(bounds); | 202 FrameTextInBounds(bounds); |
209 CheckForLineCountAndFramedRange(3, text_range()); | 203 CheckForLineCountAndFramedRange(3, text_range()); |
210 for (FramedLine* line in text_frame().lines) { | 204 for (FramedLine* line in text_frame().lines) { |
211 CGFloat line_width = | 205 ExpectNearPoint( |
212 AlignValueToPixel(core_text_util::GetTrimmedLineWidth(line.line), | 206 CGRectGetMaxX(bounds), |
213 AlignmentFunction::CEIL); | 207 line.origin.x + core_text_util::GetTrimmedLineWidth(line.line)); |
214 EXPECT_EQ(CGRectGetMaxX(bounds), line.origin.x + line_width); | |
215 } | 208 } |
216 } | 209 } |
217 | 210 |
218 TEST_F(ManualTextFramerTest, CJKLineBreakTest) { | 211 TEST_F(ManualTextFramerTest, CJKLineBreakTest) { |
219 // Example from our strings. Framer will put “触摸搜索” on one line, and then | 212 // Example from our strings. Framer will put “触摸搜索” on one line, and then |
220 // fail to frame the second. | 213 // fail to frame the second. |
221 // clang-format off | 214 // clang-format off |
222 SetText(@"“触摸搜索”会将所选字词和当前页面(作为上下文)一起发送给 Google 搜索。" | 215 SetText(@"“触摸搜索”会将所选字词和当前页面(作为上下文)一起发送给 Google 搜索。" |
223 @"您可以在设置中停用此功能。"); | 216 @"您可以在设置中停用此功能。"); |
224 // clang-format on | 217 // clang-format on |
225 attributes()[NSFontAttributeName] = RobotoFontWithSize(16.0); | 218 attributes()[NSFontAttributeName] = TypographyFontWithSize(16.0); |
226 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 219 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
227 16 * 1.15, NSTextAlignmentNatural, NSLineBreakByWordWrapping); | 220 16 * 1.15, NSTextAlignmentNatural, NSLineBreakByWordWrapping); |
228 ApplyAttributesForRange(text_range()); | 221 ApplyAttributesForRange(text_range()); |
229 CGRect bounds = CGRectMake(0, 0, 300.0, 65.0); | 222 CGRect bounds = CGRectMake(0, 0, 300.0, 65.0); |
230 FrameTextInBounds(bounds); | 223 FrameTextInBounds(bounds); |
231 CheckForLineCountAndFramedRange(3, NSMakeRange(0, 53)); | 224 CheckForLineCountAndFramedRange(3, NSMakeRange(0, 53)); |
232 | 225 |
233 // Example without any space-ish characters: | 226 // Example without any space-ish characters: |
234 // clang-format off | |
235 SetText(@"会将所选字词和当前页面(作为上下文)一起发送给Google搜索。" | 227 SetText(@"会将所选字词和当前页面(作为上下文)一起发送给Google搜索。" |
236 @"您可以在设置中停用此功能。"); | 228 @"您可以在设置中停用此功能。"); |
237 // clang-format on | 229 attributes()[NSFontAttributeName] = TypographyFontWithSize(16.0); |
238 attributes()[NSFontAttributeName] = RobotoFontWithSize(16.0); | |
239 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 230 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
240 16 * 1.15, NSTextAlignmentNatural, NSLineBreakByWordWrapping); | 231 16 * 1.15, NSTextAlignmentNatural, NSLineBreakByWordWrapping); |
241 ApplyAttributesForRange(text_range()); | 232 ApplyAttributesForRange(text_range()); |
242 FrameTextInBounds(bounds); | 233 FrameTextInBounds(bounds); |
243 CheckForLineCountAndFramedRange(2, NSMakeRange(0, 45)); | 234 CheckForLineCountAndFramedRange(2, NSMakeRange(0, 45)); |
244 } | 235 } |
245 | 236 |
246 // Tests that paragraphs with NSTextAlignmentCenter are actually centered. | 237 // Tests that paragraphs with NSTextAlignmentCenter are actually centered. |
247 TEST_F(ManualTextFramerTest, CenterAlignedTest) { | 238 TEST_F(ManualTextFramerTest, CenterAlignedTest) { |
248 SetText(@"xxxx\nyyy\nwww"); | 239 SetText(@"xxxx\nyyy\nwww"); |
249 attributes()[NSFontAttributeName] = RobotoFontWithSize(14.0); | 240 attributes()[NSFontAttributeName] = TypographyFontWithSize(14.0); |
250 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 241 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
251 20.0, NSTextAlignmentCenter, NSLineBreakByWordWrapping); | 242 20.0, NSTextAlignmentCenter, NSLineBreakByWordWrapping); |
252 ApplyAttributesForRange(text_range()); | 243 ApplyAttributesForRange(text_range()); |
253 CGRect bounds = CGRectMake(0, 0, 200.0, 60.0); | 244 CGRect bounds = CGRectMake(0, 0, 200.0, 60.0); |
254 FrameTextInBounds(bounds); | 245 FrameTextInBounds(bounds); |
255 CheckForLineCountAndFramedRange(3, text_range()); | 246 CheckForLineCountAndFramedRange(3, text_range()); |
256 for (FramedLine* line in text_frame().lines) { | 247 for (FramedLine* line in text_frame().lines) { |
257 CGFloat line_width = | 248 ExpectNearPoint(CGRectGetMidX(bounds) - |
258 AlignValueToPixel(core_text_util::GetTrimmedLineWidth(line.line), | 249 0.5 * core_text_util::GetTrimmedLineWidth(line.line), |
259 AlignmentFunction::CEIL); | 250 line.origin.x); |
260 EXPECT_EQ(AlignValueToPixel(CGRectGetMidX(bounds) - 0.5 * line_width, | |
261 AlignmentFunction::FLOOR), | |
262 line.origin.x); | |
263 } | 251 } |
264 } | 252 } |
265 | 253 |
266 // Tests that words with a large line height will not be framed if they don't | 254 // Tests that words with a large line height will not be framed if they don't |
267 // fit in the bounding height. | 255 // fit in the bounding height. |
268 TEST_F(ManualTextFramerTest, LargeLineHeightTest) { | 256 TEST_F(ManualTextFramerTest, LargeLineHeightTest) { |
269 SetText(@"the last word is very LARGE"); | 257 SetText(@"the last word is very LARGE"); |
270 attributes()[NSFontAttributeName] = RobotoFontWithSize(14.0); | 258 attributes()[NSFontAttributeName] = TypographyFontWithSize(14.0); |
271 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 259 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
272 20.0, NSTextAlignmentCenter, NSLineBreakByWordWrapping); | 260 20.0, NSTextAlignmentCenter, NSLineBreakByWordWrapping); |
273 ApplyAttributesForRange(text_range()); | 261 ApplyAttributesForRange(text_range()); |
274 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( | 262 attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle( |
275 500.0, NSTextAlignmentCenter, NSLineBreakByWordWrapping); | 263 500.0, NSTextAlignmentCenter, NSLineBreakByWordWrapping); |
276 ApplyAttributesForRange(NSMakeRange(22, 5)); // "LARGE" | 264 ApplyAttributesForRange(NSMakeRange(22, 5)); // "LARGE" |
277 CGRect bounds = CGRectMake(0, 0, 500, 20.0); | 265 CGRect bounds = CGRectMake(0, 0, 500, 20.0); |
278 FrameTextInBounds(bounds); | 266 FrameTextInBounds(bounds); |
279 CheckForLineCountAndFramedRange(1, NSMakeRange(0, 22)); | 267 CheckForLineCountAndFramedRange(1, NSMakeRange(0, 22)); |
280 } | 268 } |
(...skipping 11 matching lines...) Expand all Loading... |
292 "\u062A\u0639\u0637\u064A\u0644\u0020\u0647\u0630\u0647\u0020\u0627" | 280 "\u062A\u0639\u0637\u064A\u0644\u0020\u0647\u0630\u0647\u0020\u0627" |
293 "\u0644\u062E\u062F\u0645\u0627\u062A\u002E"); | 281 "\u0644\u062E\u062F\u0645\u0627\u062A\u002E"); |
294 attributes()[NSFontAttributeName] = [UIFont systemFontOfSize:20.0]; | 282 attributes()[NSFontAttributeName] = [UIFont systemFontOfSize:20.0]; |
295 ApplyAttributesForRange(text_range()); | 283 ApplyAttributesForRange(text_range()); |
296 CGRect bounds = CGRectMake(0, 0, 500, 100); | 284 CGRect bounds = CGRectMake(0, 0, 500, 100); |
297 FrameTextInBounds(bounds); | 285 FrameTextInBounds(bounds); |
298 CheckForLineCountAndFramedRange(2, text_range()); | 286 CheckForLineCountAndFramedRange(2, text_range()); |
299 } | 287 } |
300 | 288 |
301 } // namespace | 289 } // namespace |
OLD | NEW |