xref: /aosp_15_r20/frameworks/minikin/tests/unittest/MeasuredTextTest.cpp (revision 834a2baab5fdfc28e9a428ee87c7ea8f6a06a53d)
1*834a2baaSAndroid Build Coastguard Worker /*
2*834a2baaSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*834a2baaSAndroid Build Coastguard Worker  *
4*834a2baaSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*834a2baaSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*834a2baaSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*834a2baaSAndroid Build Coastguard Worker  *
8*834a2baaSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*834a2baaSAndroid Build Coastguard Worker  *
10*834a2baaSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*834a2baaSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*834a2baaSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*834a2baaSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*834a2baaSAndroid Build Coastguard Worker  * limitations under the License.
15*834a2baaSAndroid Build Coastguard Worker  */
16*834a2baaSAndroid Build Coastguard Worker 
17*834a2baaSAndroid Build Coastguard Worker #include "minikin/MeasuredText.h"
18*834a2baaSAndroid Build Coastguard Worker 
19*834a2baaSAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*834a2baaSAndroid Build Coastguard Worker 
21*834a2baaSAndroid Build Coastguard Worker #include "minikin/LineBreaker.h"
22*834a2baaSAndroid Build Coastguard Worker #include "minikin/Measurement.h"
23*834a2baaSAndroid Build Coastguard Worker 
24*834a2baaSAndroid Build Coastguard Worker #include "FontTestUtils.h"
25*834a2baaSAndroid Build Coastguard Worker #include "UnicodeUtils.h"
26*834a2baaSAndroid Build Coastguard Worker 
27*834a2baaSAndroid Build Coastguard Worker namespace minikin {
28*834a2baaSAndroid Build Coastguard Worker 
29*834a2baaSAndroid Build Coastguard Worker constexpr float CHAR_WIDTH = 10.0;  // Mock implementation always returns 10.0 for advance.
30*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,RunTests)31*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, RunTests) {
32*834a2baaSAndroid Build Coastguard Worker     constexpr uint32_t CHAR_COUNT = 6;
33*834a2baaSAndroid Build Coastguard Worker     constexpr float REPLACEMENT_WIDTH = 20.0f;
34*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Ascii.ttf");
35*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
36*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
37*834a2baaSAndroid Build Coastguard Worker 
38*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
39*834a2baaSAndroid Build Coastguard Worker 
40*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint1(font);
41*834a2baaSAndroid Build Coastguard Worker     paint1.size = 10.0f;  // make 1em = 10px
42*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, 2, std::move(paint1), lbStyle, lbWordStyle, true /* can hyphenate */,
43*834a2baaSAndroid Build Coastguard Worker                         false /* is RTL */);
44*834a2baaSAndroid Build Coastguard Worker     builder.addReplacementRun(2, 4, REPLACEMENT_WIDTH, 0 /* locale list id */);
45*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint2(font);
46*834a2baaSAndroid Build Coastguard Worker     paint2.size = 10.0f;  // make 1em = 10px
47*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(4, 6, std::move(paint2), lbStyle, lbWordStyle, true /* can hyphenate */,
48*834a2baaSAndroid Build Coastguard Worker                         false /* is RTL */);
49*834a2baaSAndroid Build Coastguard Worker 
50*834a2baaSAndroid Build Coastguard Worker     std::vector<uint16_t> text(CHAR_COUNT, 'a');
51*834a2baaSAndroid Build Coastguard Worker 
52*834a2baaSAndroid Build Coastguard Worker     std::unique_ptr<MeasuredText> measuredText = builder.build(
53*834a2baaSAndroid Build Coastguard Worker             text, true /* compute hyphenation */, false /* compute full layout */,
54*834a2baaSAndroid Build Coastguard Worker             false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
55*834a2baaSAndroid Build Coastguard Worker 
56*834a2baaSAndroid Build Coastguard Worker     ASSERT_TRUE(measuredText);
57*834a2baaSAndroid Build Coastguard Worker 
58*834a2baaSAndroid Build Coastguard Worker     // ReplacementRun assigns all width to the first character and leave zeros others.
59*834a2baaSAndroid Build Coastguard Worker     std::vector<float> expectedWidths = {CHAR_WIDTH, CHAR_WIDTH, REPLACEMENT_WIDTH,
60*834a2baaSAndroid Build Coastguard Worker                                          0,          CHAR_WIDTH, CHAR_WIDTH};
61*834a2baaSAndroid Build Coastguard Worker 
62*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(expectedWidths, measuredText->widths);
63*834a2baaSAndroid Build Coastguard Worker }
64*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,getBoundsTest)65*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, getBoundsTest) {
66*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("Hello, World!");
67*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Ascii.ttf");
68*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
69*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
70*834a2baaSAndroid Build Coastguard Worker 
71*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
72*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
73*834a2baaSAndroid Build Coastguard Worker     paint.size = 10.0f;
74*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
75*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, false /* is RTL */);
76*834a2baaSAndroid Build Coastguard Worker     auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
77*834a2baaSAndroid Build Coastguard Worker                             false /* computeBounds */, false /* ignore kerning */,
78*834a2baaSAndroid Build Coastguard Worker                             nullptr /* no hint */);
79*834a2baaSAndroid Build Coastguard Worker 
80*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, 0.0f, 0.0f, 0.0f), mt->getBounds(text, Range(0, 0)));
81*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), mt->getBounds(text, Range(0, 1)));
82*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 20.0f, 0.0f), mt->getBounds(text, Range(0, 2)));
83*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), mt->getBounds(text, Range(1, 2)));
84*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 130.0f, 0.0f), mt->getBounds(text, Range(0, text.size())));
85*834a2baaSAndroid Build Coastguard Worker }
86*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,getBoundsTest_LTR)87*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, getBoundsTest_LTR) {
88*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("\u0028");  // U+0028 has 1em in LTR, 3em in RTL.
89*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Bbox.ttf");
90*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
91*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
92*834a2baaSAndroid Build Coastguard Worker 
93*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
94*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
95*834a2baaSAndroid Build Coastguard Worker     paint.size = 10.0f;
96*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
97*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, false /* is RTL */);
98*834a2baaSAndroid Build Coastguard Worker     auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
99*834a2baaSAndroid Build Coastguard Worker                             false /* computeBounds */, false /* ignore kerning */,
100*834a2baaSAndroid Build Coastguard Worker                             nullptr /* no hint */);
101*834a2baaSAndroid Build Coastguard Worker 
102*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), mt->getBounds(text, Range(0, 1)));
103*834a2baaSAndroid Build Coastguard Worker }
104*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,getBoundsTest_RTL)105*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, getBoundsTest_RTL) {
106*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("\u0028");  // U+0028 has 1em in LTR, 3em in RTL.
107*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Bbox.ttf");
108*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
109*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
110*834a2baaSAndroid Build Coastguard Worker 
111*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
112*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
113*834a2baaSAndroid Build Coastguard Worker     paint.size = 10.0f;
114*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
115*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, true /* is RTL */);
116*834a2baaSAndroid Build Coastguard Worker     auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
117*834a2baaSAndroid Build Coastguard Worker                             false /* computeBounds */, false /* ignore kerning */,
118*834a2baaSAndroid Build Coastguard Worker                             nullptr /* no hint */);
119*834a2baaSAndroid Build Coastguard Worker 
120*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -30.0f, 30.0f, 0.0f), mt->getBounds(text, Range(0, 2)));
121*834a2baaSAndroid Build Coastguard Worker }
122*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,getBoundsTest_multiStyle)123*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, getBoundsTest_multiStyle) {
124*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("Hello, World!");
125*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Ascii.ttf");
126*834a2baaSAndroid Build Coastguard Worker     uint32_t helloLength = 7;  // length of "Hello, "
127*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
128*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
129*834a2baaSAndroid Build Coastguard Worker 
130*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
131*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
132*834a2baaSAndroid Build Coastguard Worker     paint.size = 10.0f;
133*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, helloLength, std::move(paint), lbStyle, lbWordStyle,
134*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, false /* is RTL */);
135*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint2(font);
136*834a2baaSAndroid Build Coastguard Worker     paint2.size = 20.0f;
137*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(helloLength, text.size(), std::move(paint2), lbStyle, lbWordStyle,
138*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, false /* is RTL */);
139*834a2baaSAndroid Build Coastguard Worker     auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
140*834a2baaSAndroid Build Coastguard Worker                             false /* computeBounds */, false /* ignore kerning */,
141*834a2baaSAndroid Build Coastguard Worker                             nullptr /* no hint */);
142*834a2baaSAndroid Build Coastguard Worker 
143*834a2baaSAndroid Build Coastguard Worker     // In this example, the glyph shape is as wollows.
144*834a2baaSAndroid Build Coastguard Worker     // (y axis, em unit)
145*834a2baaSAndroid Build Coastguard Worker     // -2               ┌───┬───┬───┬───┬───┬───┐
146*834a2baaSAndroid Build Coastguard Worker     //                  │   │   │   │   │   │   │
147*834a2baaSAndroid Build Coastguard Worker     // -1 ┌─┬─┬─┬─┬─┬─┬─┤ W │ o │ r │ l │ d │ ! │
148*834a2baaSAndroid Build Coastguard Worker     //    │H│e│l│l│o│,│ │   │   │   │   │   │   │
149*834a2baaSAndroid Build Coastguard Worker     //  0 └─┴─┴─┴─┴─┴─┴─┴───┴───┴───┴───┴───┴───┘
150*834a2baaSAndroid Build Coastguard Worker     //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9  (x axis, em unit)
151*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, 0.0f, 0.0f, 0.0f), mt->getBounds(text, Range(0, 0)));
152*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), mt->getBounds(text, Range(0, 1)));
153*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 20.0f, 0.0f), mt->getBounds(text, Range(0, 2)));
154*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), mt->getBounds(text, Range(1, 2)));
155*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, 0.0f, 0.0f, 0.0f), mt->getBounds(text, Range(7, 7)));
156*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -20.0f, 20.0f, 0.0f), mt->getBounds(text, Range(7, 8)));
157*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -20.0f, 30.0f, 0.0f), mt->getBounds(text, Range(6, 8)));
158*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -20.0f, 190.0f, 0.0f), mt->getBounds(text, Range(0, text.size())));
159*834a2baaSAndroid Build Coastguard Worker }
160*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,getExtentTest)161*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, getExtentTest) {
162*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("Hello, World!");
163*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Ascii.ttf");
164*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
165*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
166*834a2baaSAndroid Build Coastguard Worker 
167*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
168*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
169*834a2baaSAndroid Build Coastguard Worker     paint.size = 10.0f;
170*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
171*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, false /* is RTL */);
172*834a2baaSAndroid Build Coastguard Worker     auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
173*834a2baaSAndroid Build Coastguard Worker                             false /* computeBounds */, false /* ignore kernign */,
174*834a2baaSAndroid Build Coastguard Worker                             nullptr /* no hint */);
175*834a2baaSAndroid Build Coastguard Worker 
176*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(0.0f, 0.0f), mt->getExtent(text, Range(0, 0)));
177*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(0, 1)));
178*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(0, 2)));
179*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(1, 2)));
180*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(0, text.size())));
181*834a2baaSAndroid Build Coastguard Worker }
182*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,getExtentTest_multiStyle)183*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, getExtentTest_multiStyle) {
184*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("Hello, World!");
185*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Ascii.ttf");
186*834a2baaSAndroid Build Coastguard Worker     uint32_t helloLength = 7;  // length of "Hello, "
187*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
188*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
189*834a2baaSAndroid Build Coastguard Worker 
190*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
191*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
192*834a2baaSAndroid Build Coastguard Worker     paint.size = 10.0f;
193*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, helloLength, std::move(paint), lbStyle, lbWordStyle,
194*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, false /* is RTL */);
195*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint2(font);
196*834a2baaSAndroid Build Coastguard Worker     paint2.size = 20.0f;
197*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(helloLength, text.size(), std::move(paint2), 0 /* no line break */,
198*834a2baaSAndroid Build Coastguard Worker                         0 /* no line break word style */, true /* can hyphenate */,
199*834a2baaSAndroid Build Coastguard Worker                         false /* is RTL */);
200*834a2baaSAndroid Build Coastguard Worker     auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
201*834a2baaSAndroid Build Coastguard Worker                             false /* computeBounds */, false /* ignore kerning */,
202*834a2baaSAndroid Build Coastguard Worker                             nullptr /* no hint */);
203*834a2baaSAndroid Build Coastguard Worker 
204*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(0.0f, 0.0f), mt->getExtent(text, Range(0, 0)));
205*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(0, 1)));
206*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(0, 2)));
207*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(1, 2)));
208*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(0.0f, 0.0f), mt->getExtent(text, Range(7, 7)));
209*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(-160.0f, 40.0f), mt->getExtent(text, Range(7, 8)));
210*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(-160.0f, 40.0f), mt->getExtent(text, Range(6, 8)));
211*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinExtent(-160.0f, 40.0f), mt->getExtent(text, Range(0, text.size())));
212*834a2baaSAndroid Build Coastguard Worker }
213*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,buildLayoutTest)214*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, buildLayoutTest) {
215*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("Hello, World!");
216*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Ascii.ttf");
217*834a2baaSAndroid Build Coastguard Worker     Range fullContext(0, text.size());
218*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
219*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
220*834a2baaSAndroid Build Coastguard Worker 
221*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
222*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
223*834a2baaSAndroid Build Coastguard Worker     paint.size = 10.0f;
224*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
225*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, false /* is RTL */);
226*834a2baaSAndroid Build Coastguard Worker     auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
227*834a2baaSAndroid Build Coastguard Worker                             false /* computeBounds */, false /* ignore kerning */,
228*834a2baaSAndroid Build Coastguard Worker                             nullptr /* no hint */);
229*834a2baaSAndroid Build Coastguard Worker 
230*834a2baaSAndroid Build Coastguard Worker     MinikinRect rect;
231*834a2baaSAndroid Build Coastguard Worker     MinikinPaint samePaint(font);
232*834a2baaSAndroid Build Coastguard Worker     samePaint.size = 10.0f;
233*834a2baaSAndroid Build Coastguard Worker 
234*834a2baaSAndroid Build Coastguard Worker     Layout layout = mt->buildLayout(text, Range(0, 0), fullContext, samePaint,
235*834a2baaSAndroid Build Coastguard Worker                                     StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
236*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0u, layout.nGlyphs());
237*834a2baaSAndroid Build Coastguard Worker 
238*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(0, 1), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
239*834a2baaSAndroid Build Coastguard Worker                              EndHyphenEdit::NO_EDIT);
240*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1u, layout.nGlyphs());
241*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
242*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
243*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
244*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getAdvance());
245*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getCharAdvance(0));
246*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, layout.getAdvances().size());
247*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(0, 1), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
248*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
249*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), rect);
250*834a2baaSAndroid Build Coastguard Worker 
251*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(0, 2), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
252*834a2baaSAndroid Build Coastguard Worker                              EndHyphenEdit::NO_EDIT);
253*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2u, layout.nGlyphs());
254*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0) && layout.getFont(0) == layout.getFont(1));
255*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
256*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
257*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getX(1));
258*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(1));
259*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(20.0f, layout.getAdvance());
260*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getCharAdvance(0));
261*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getCharAdvance(1));
262*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2u, layout.getAdvances().size());
263*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(0, 2), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
264*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
265*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 20.0f, 0.0f), rect);
266*834a2baaSAndroid Build Coastguard Worker 
267*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(1, 2), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
268*834a2baaSAndroid Build Coastguard Worker                              EndHyphenEdit::NO_EDIT);
269*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1u, layout.nGlyphs());
270*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
271*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
272*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
273*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getAdvance());
274*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getCharAdvance(0));
275*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, layout.getAdvances().size());
276*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(1, 2), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
277*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
278*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), rect);
279*834a2baaSAndroid Build Coastguard Worker 
280*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(0, text.size()), fullContext, samePaint,
281*834a2baaSAndroid Build Coastguard Worker                              StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
282*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(text.size(), layout.nGlyphs());
283*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
284*834a2baaSAndroid Build Coastguard Worker     for (uint32_t i = 0; i < text.size(); ++i) {
285*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(layout.getFont(0), layout.getFont(i)) << i;
286*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(10.0f * i, layout.getX(i)) << i;
287*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(0.0f, layout.getY(i)) << i;
288*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(10.0f, layout.getCharAdvance(i)) << i;
289*834a2baaSAndroid Build Coastguard Worker     }
290*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(130.0f, layout.getAdvance());
291*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(text.size(), layout.getAdvances().size());
292*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(0, text.size()), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
293*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
294*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 130.0f, 0.0f), rect);
295*834a2baaSAndroid Build Coastguard Worker }
296*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,buildLayoutTest_multiStyle)297*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, buildLayoutTest_multiStyle) {
298*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("Hello, World!");
299*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Ascii.ttf");
300*834a2baaSAndroid Build Coastguard Worker     uint32_t helloLength = 7;  // length of "Hello, "
301*834a2baaSAndroid Build Coastguard Worker     Range fullContext(0, text.size());
302*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
303*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
304*834a2baaSAndroid Build Coastguard Worker 
305*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
306*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
307*834a2baaSAndroid Build Coastguard Worker     paint.size = 10.0f;
308*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, helloLength, std::move(paint), lbStyle, lbWordStyle,
309*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, false /* is RTL */);
310*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint2(font);
311*834a2baaSAndroid Build Coastguard Worker     paint2.size = 20.0f;
312*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(helloLength, text.size(), std::move(paint2), lbStyle, lbWordStyle,
313*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, false /* is RTL */);
314*834a2baaSAndroid Build Coastguard Worker     auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
315*834a2baaSAndroid Build Coastguard Worker                             false /* computeBounds */, false /* ignore kerning */,
316*834a2baaSAndroid Build Coastguard Worker                             nullptr /* no hint */);
317*834a2baaSAndroid Build Coastguard Worker 
318*834a2baaSAndroid Build Coastguard Worker     MinikinRect rect;
319*834a2baaSAndroid Build Coastguard Worker     MinikinPaint samePaint(font);
320*834a2baaSAndroid Build Coastguard Worker     samePaint.size = 10.0f;
321*834a2baaSAndroid Build Coastguard Worker 
322*834a2baaSAndroid Build Coastguard Worker     Layout layout = mt->buildLayout(text, Range(0, 0), fullContext, samePaint,
323*834a2baaSAndroid Build Coastguard Worker                                     StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
324*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0u, layout.nGlyphs());
325*834a2baaSAndroid Build Coastguard Worker 
326*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(0, 1), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
327*834a2baaSAndroid Build Coastguard Worker                              EndHyphenEdit::NO_EDIT);
328*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1u, layout.nGlyphs());
329*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
330*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
331*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
332*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getAdvance());
333*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getCharAdvance(0));
334*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, layout.getAdvances().size());
335*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(0, 1), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
336*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
337*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), rect);
338*834a2baaSAndroid Build Coastguard Worker 
339*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(0, 2), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
340*834a2baaSAndroid Build Coastguard Worker                              EndHyphenEdit::NO_EDIT);
341*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2u, layout.nGlyphs());
342*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0) && layout.getFont(0) == layout.getFont(1));
343*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
344*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
345*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getX(1));
346*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(1));
347*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(20.0f, layout.getAdvance());
348*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getCharAdvance(0));
349*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getCharAdvance(1));
350*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2u, layout.getAdvances().size());
351*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(0, 2), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
352*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
353*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 20.0f, 0.0f), rect);
354*834a2baaSAndroid Build Coastguard Worker 
355*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(1, 2), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
356*834a2baaSAndroid Build Coastguard Worker                              EndHyphenEdit::NO_EDIT);
357*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1u, layout.nGlyphs());
358*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
359*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
360*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
361*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getAdvance());
362*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(10.0f, layout.getCharAdvance(0));
363*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, layout.getAdvances().size());
364*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(1, 2), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
365*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
366*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), rect);
367*834a2baaSAndroid Build Coastguard Worker 
368*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(7, 7), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
369*834a2baaSAndroid Build Coastguard Worker                              EndHyphenEdit::NO_EDIT);
370*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0u, layout.nGlyphs());
371*834a2baaSAndroid Build Coastguard Worker 
372*834a2baaSAndroid Build Coastguard Worker     MinikinPaint samePaint2(font);
373*834a2baaSAndroid Build Coastguard Worker     samePaint2.size = 20.0f;
374*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(7, 8), fullContext, samePaint2, StartHyphenEdit::NO_EDIT,
375*834a2baaSAndroid Build Coastguard Worker                              EndHyphenEdit::NO_EDIT);
376*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1u, layout.nGlyphs());
377*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
378*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
379*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
380*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(20.0f, layout.getAdvance());
381*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(20.0f, layout.getCharAdvance(0));
382*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, layout.getAdvances().size());
383*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(7, 8), Bidi::LTR, samePaint2, StartHyphenEdit::NO_EDIT,
384*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
385*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -20.0f, 20.0f, 0.0f), rect);
386*834a2baaSAndroid Build Coastguard Worker }
387*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,buildLayoutTest_differentPaint)388*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, buildLayoutTest_differentPaint) {
389*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("Hello, World!");
390*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Ascii.ttf");
391*834a2baaSAndroid Build Coastguard Worker     Range fullContext(0, text.size());
392*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
393*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
394*834a2baaSAndroid Build Coastguard Worker 
395*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
396*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
397*834a2baaSAndroid Build Coastguard Worker     paint.size = 10.0f;
398*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
399*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, false /* is RTL */);
400*834a2baaSAndroid Build Coastguard Worker     auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
401*834a2baaSAndroid Build Coastguard Worker                             false /* computeBounds */, false /* ignore kerning */,
402*834a2baaSAndroid Build Coastguard Worker                             nullptr /* no hint */);
403*834a2baaSAndroid Build Coastguard Worker 
404*834a2baaSAndroid Build Coastguard Worker     MinikinRect rect;
405*834a2baaSAndroid Build Coastguard Worker     MinikinPaint differentPaint(font);
406*834a2baaSAndroid Build Coastguard Worker     differentPaint.size = 20.0f;
407*834a2baaSAndroid Build Coastguard Worker 
408*834a2baaSAndroid Build Coastguard Worker     Layout layout = mt->buildLayout(text, Range(0, 0), fullContext, differentPaint,
409*834a2baaSAndroid Build Coastguard Worker                                     StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
410*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0u, layout.nGlyphs());
411*834a2baaSAndroid Build Coastguard Worker 
412*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(0, 1), fullContext, differentPaint,
413*834a2baaSAndroid Build Coastguard Worker                              StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
414*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1u, layout.nGlyphs());
415*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
416*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
417*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
418*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(20.0f, layout.getAdvance());
419*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(20.0f, layout.getCharAdvance(0));
420*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, layout.getAdvances().size());
421*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(0, 1), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
422*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
423*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -20.0f, 20.0f, 0.0f), rect);
424*834a2baaSAndroid Build Coastguard Worker 
425*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(0, 2), fullContext, differentPaint,
426*834a2baaSAndroid Build Coastguard Worker                              StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
427*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2u, layout.nGlyphs());
428*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0) && layout.getFont(0) == layout.getFont(1));
429*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
430*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
431*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(20.0f, layout.getX(1));
432*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(1));
433*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(40.0f, layout.getAdvance());
434*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(20.0f, layout.getCharAdvance(0));
435*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(20.0f, layout.getCharAdvance(1));
436*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2u, layout.getAdvances().size());
437*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(0, 2), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
438*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
439*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -20.0f, 40.0f, 0.0f), rect);
440*834a2baaSAndroid Build Coastguard Worker 
441*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(1, 2), fullContext, differentPaint,
442*834a2baaSAndroid Build Coastguard Worker                              StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
443*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1u, layout.nGlyphs());
444*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
445*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
446*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
447*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(20.0f, layout.getAdvance());
448*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(20.0f, layout.getCharAdvance(0));
449*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, layout.getAdvances().size());
450*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(1, 2), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
451*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
452*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -20.0f, 20.0f, 0.0f), rect);
453*834a2baaSAndroid Build Coastguard Worker 
454*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(0, text.size()), fullContext, differentPaint,
455*834a2baaSAndroid Build Coastguard Worker                              StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
456*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(text.size(), layout.nGlyphs());
457*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
458*834a2baaSAndroid Build Coastguard Worker     for (uint32_t i = 0; i < text.size(); ++i) {
459*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(layout.getFont(0), layout.getFont(i)) << i;
460*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(20.0f * i, layout.getX(i)) << i;
461*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(0.0f, layout.getY(i)) << i;
462*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(20.0f, layout.getCharAdvance(i)) << i;
463*834a2baaSAndroid Build Coastguard Worker     }
464*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(260.0f, layout.getAdvance());
465*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(text.size(), layout.getAdvances().size());
466*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(0, text.size()), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
467*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
468*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -20.0f, 260.0f, 0.0f), rect);
469*834a2baaSAndroid Build Coastguard Worker }
470*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,buildLayoutTest_multiStyle_differentPaint)471*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, buildLayoutTest_multiStyle_differentPaint) {
472*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("Hello, World!");
473*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Ascii.ttf");
474*834a2baaSAndroid Build Coastguard Worker     uint32_t helloLength = 7;  // length of "Hello, "
475*834a2baaSAndroid Build Coastguard Worker     Range fullContext(0, text.size());
476*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
477*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
478*834a2baaSAndroid Build Coastguard Worker 
479*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
480*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
481*834a2baaSAndroid Build Coastguard Worker     paint.size = 10.0f;
482*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, helloLength, std::move(paint), lbStyle, lbWordStyle,
483*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, false /* is RTL */);
484*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint2(font);
485*834a2baaSAndroid Build Coastguard Worker     paint2.size = 20.0f;
486*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(helloLength, text.size(), std::move(paint2), lbStyle, lbWordStyle,
487*834a2baaSAndroid Build Coastguard Worker                         true /* can hyphenate */, false /* is RTL */);
488*834a2baaSAndroid Build Coastguard Worker     auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
489*834a2baaSAndroid Build Coastguard Worker                             false /* computeBounds */, false /* ignore kerning */,
490*834a2baaSAndroid Build Coastguard Worker                             nullptr /* no hint */);
491*834a2baaSAndroid Build Coastguard Worker 
492*834a2baaSAndroid Build Coastguard Worker     MinikinRect rect;
493*834a2baaSAndroid Build Coastguard Worker     MinikinPaint differentPaint(font);
494*834a2baaSAndroid Build Coastguard Worker     differentPaint.size = 30.0f;
495*834a2baaSAndroid Build Coastguard Worker 
496*834a2baaSAndroid Build Coastguard Worker     Layout layout = mt->buildLayout(text, Range(0, 0), fullContext, differentPaint,
497*834a2baaSAndroid Build Coastguard Worker                                     StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
498*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0u, layout.nGlyphs());
499*834a2baaSAndroid Build Coastguard Worker 
500*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(0, 1), fullContext, differentPaint,
501*834a2baaSAndroid Build Coastguard Worker                              StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
502*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1u, layout.nGlyphs());
503*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
504*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
505*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
506*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(30.0f, layout.getAdvance());
507*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(30.0f, layout.getCharAdvance(0));
508*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, layout.getAdvances().size());
509*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(0, 1), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
510*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
511*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -30.0f, 30.0f, 0.0f), rect);
512*834a2baaSAndroid Build Coastguard Worker 
513*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(0, 2), fullContext, differentPaint,
514*834a2baaSAndroid Build Coastguard Worker                              StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
515*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2u, layout.nGlyphs());
516*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0) && layout.getFont(0) == layout.getFont(1));
517*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
518*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
519*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(30.0f, layout.getX(1));
520*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(1));
521*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(60.0f, layout.getAdvance());
522*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(30.0f, layout.getCharAdvance(0));
523*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(30.0f, layout.getCharAdvance(1));
524*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2u, layout.getAdvances().size());
525*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(0, 2), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
526*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
527*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -30.0f, 60.0f, 0.0f), rect);
528*834a2baaSAndroid Build Coastguard Worker 
529*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(1, 2), fullContext, differentPaint,
530*834a2baaSAndroid Build Coastguard Worker                              StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
531*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1u, layout.nGlyphs());
532*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
533*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
534*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
535*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(30.0f, layout.getAdvance());
536*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(30.0f, layout.getCharAdvance(0));
537*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, layout.getAdvances().size());
538*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(1, 2), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
539*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
540*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -30.0f, 30.0f, 0.0f), rect);
541*834a2baaSAndroid Build Coastguard Worker 
542*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(7, 7), fullContext, differentPaint,
543*834a2baaSAndroid Build Coastguard Worker                              StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
544*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0u, layout.nGlyphs());
545*834a2baaSAndroid Build Coastguard Worker 
546*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(7, 8), fullContext, differentPaint,
547*834a2baaSAndroid Build Coastguard Worker                              StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
548*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(1u, layout.nGlyphs());
549*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
550*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
551*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
552*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(30.0f, layout.getAdvance());
553*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(30.0f, layout.getCharAdvance(0));
554*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, layout.getAdvances().size());
555*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(7, 8), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
556*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
557*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -30.0f, 30.0f, 0.0f), rect);
558*834a2baaSAndroid Build Coastguard Worker 
559*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(6, 8), fullContext, differentPaint,
560*834a2baaSAndroid Build Coastguard Worker                              StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
561*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(2u, layout.nGlyphs());
562*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0) && layout.getFont(0) == layout.getFont(1));
563*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getX(0));
564*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(0));
565*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(30.0f, layout.getX(1));
566*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0.0f, layout.getY(1));
567*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(60.0f, layout.getAdvance());
568*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(30.0f, layout.getCharAdvance(0));
569*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(30.0f, layout.getCharAdvance(1));
570*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(2u, layout.getAdvances().size());
571*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(6, 8), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
572*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
573*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -30.0f, 60.0f, 0.0f), rect);
574*834a2baaSAndroid Build Coastguard Worker 
575*834a2baaSAndroid Build Coastguard Worker     layout = mt->buildLayout(text, Range(0, text.size()), fullContext, differentPaint,
576*834a2baaSAndroid Build Coastguard Worker                              StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
577*834a2baaSAndroid Build Coastguard Worker     ASSERT_EQ(text.size(), layout.nGlyphs());
578*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(layout.getFont(0));
579*834a2baaSAndroid Build Coastguard Worker     for (uint32_t i = 0; i < text.size(); ++i) {
580*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(layout.getFont(0), layout.getFont(i)) << i;
581*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(30.0f * i, layout.getX(i)) << i;
582*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(0.0f, layout.getY(i)) << i;
583*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(30.0f, layout.getCharAdvance(i)) << i;
584*834a2baaSAndroid Build Coastguard Worker     }
585*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(390.0f, layout.getAdvance());
586*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(text.size(), layout.getAdvances().size());
587*834a2baaSAndroid Build Coastguard Worker     getBounds(text, Range(0, text.size()), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
588*834a2baaSAndroid Build Coastguard Worker               EndHyphenEdit::NO_EDIT, &rect);
589*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MinikinRect(0.0f, -30.0f, 390.0f, 0.0f), rect);
590*834a2baaSAndroid Build Coastguard Worker }
591*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,testLineBreakStyle_from_builder)592*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, testLineBreakStyle_from_builder) {
593*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("Hello, World!");
594*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Ascii.ttf");
595*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::Loose;           // loose
596*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::Phrase;  // phrase
597*834a2baaSAndroid Build Coastguard Worker 
598*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder looseStyleBuilder;
599*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
600*834a2baaSAndroid Build Coastguard Worker     looseStyleBuilder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
601*834a2baaSAndroid Build Coastguard Worker                                   true /* can hyphenate */, false);
602*834a2baaSAndroid Build Coastguard Worker     auto mt = looseStyleBuilder.build(text, true /* hyphenation */, true /* full layout */,
603*834a2baaSAndroid Build Coastguard Worker                                       false /* computeBounds */, false /* ignore kerning */,
604*834a2baaSAndroid Build Coastguard Worker                                       nullptr /* no hint */);
605*834a2baaSAndroid Build Coastguard Worker 
606*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ((size_t)1, mt->runs.size());
607*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(LineBreakStyle::Loose, mt->runs[0]->lineBreakStyle());
608*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(LineBreakWordStyle::Phrase, mt->runs[0]->lineBreakWordStyle());
609*834a2baaSAndroid Build Coastguard Worker 
610*834a2baaSAndroid Build Coastguard Worker     lbStyle = (int)LineBreakStyle::Normal;  // normal
611*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder normalStyleBuilder;
612*834a2baaSAndroid Build Coastguard Worker     MinikinPaint normalStylePaint(font);
613*834a2baaSAndroid Build Coastguard Worker     normalStyleBuilder.addStyleRun(0, text.size(), std::move(normalStylePaint), lbStyle,
614*834a2baaSAndroid Build Coastguard Worker                                    lbWordStyle, true /* can hyphenate */, false);
615*834a2baaSAndroid Build Coastguard Worker     mt = normalStyleBuilder.build(text, true /* hyphenation */, true /* full layout */,
616*834a2baaSAndroid Build Coastguard Worker                                   false /* computeBounds */, false /* ignore kerning */,
617*834a2baaSAndroid Build Coastguard Worker                                   nullptr /* no hint */);
618*834a2baaSAndroid Build Coastguard Worker 
619*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ((size_t)1, mt->runs.size());
620*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(LineBreakStyle::Normal, mt->runs[0]->lineBreakStyle());
621*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(LineBreakWordStyle::Phrase, mt->runs[0]->lineBreakWordStyle());
622*834a2baaSAndroid Build Coastguard Worker 
623*834a2baaSAndroid Build Coastguard Worker     lbStyle = (int)LineBreakStyle::Strict;        // strict
624*834a2baaSAndroid Build Coastguard Worker     lbWordStyle = (int)LineBreakWordStyle::None;  // no word style
625*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder strictStyleBuilder;
626*834a2baaSAndroid Build Coastguard Worker     MinikinPaint strictStylePaint(font);
627*834a2baaSAndroid Build Coastguard Worker     strictStyleBuilder.addStyleRun(0, text.size(), std::move(strictStylePaint), lbStyle,
628*834a2baaSAndroid Build Coastguard Worker                                    lbWordStyle, true /* can hyphenate */, false);
629*834a2baaSAndroid Build Coastguard Worker     mt = strictStyleBuilder.build(text, true /* hyphenation */, true /* full layout */,
630*834a2baaSAndroid Build Coastguard Worker                                   false /* computeBounds */, false /* ignore kerning */,
631*834a2baaSAndroid Build Coastguard Worker                                   nullptr /* no hint */);
632*834a2baaSAndroid Build Coastguard Worker 
633*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ((size_t)1, mt->runs.size());
634*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(LineBreakStyle::Strict, mt->runs[0]->lineBreakStyle());
635*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(LineBreakWordStyle::None, mt->runs[0]->lineBreakWordStyle());
636*834a2baaSAndroid Build Coastguard Worker }
637*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,testLineBreakStyle_from_run)638*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, testLineBreakStyle_from_run) {
639*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("Hello, World!");
640*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Ascii.ttf");
641*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::Strict;
642*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::Phrase;
643*834a2baaSAndroid Build Coastguard Worker     Range range(0, text.size());
644*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
645*834a2baaSAndroid Build Coastguard Worker 
646*834a2baaSAndroid Build Coastguard Worker     StyleRun styleRun(range, std::move(paint), lbStyle, lbWordStyle, true /* can hyphenate */,
647*834a2baaSAndroid Build Coastguard Worker                       false /* isRtl */);
648*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(LineBreakStyle::Strict, styleRun.lineBreakStyle());
649*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(LineBreakWordStyle::Phrase, styleRun.lineBreakWordStyle());
650*834a2baaSAndroid Build Coastguard Worker 
651*834a2baaSAndroid Build Coastguard Worker     ReplacementRun replacementRun(range, 10.0f /* width */, 0 /* locale list id */);
652*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(LineBreakStyle::None, replacementRun.lineBreakStyle());
653*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(LineBreakWordStyle::None, replacementRun.lineBreakWordStyle());
654*834a2baaSAndroid Build Coastguard Worker }
655*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,hasOverhang_false)656*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, hasOverhang_false) {
657*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("Hello, World!");
658*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("Ascii.ttf");
659*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
660*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
661*834a2baaSAndroid Build Coastguard Worker 
662*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
663*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
664*834a2baaSAndroid Build Coastguard Worker     paint.size = 10.0f;
665*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
666*834a2baaSAndroid Build Coastguard Worker                         true /* hyphenation */, false /* is RTL */);
667*834a2baaSAndroid Build Coastguard Worker     auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
668*834a2baaSAndroid Build Coastguard Worker                             true /* computeBounds */, false /* ignore kerning */,
669*834a2baaSAndroid Build Coastguard Worker                             nullptr /* no hint */);
670*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(mt->hasOverhang(Range(0, text.size())));
671*834a2baaSAndroid Build Coastguard Worker }
672*834a2baaSAndroid Build Coastguard Worker 
TEST(MeasuredTextTest,hasOverhang_true)673*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, hasOverhang_true) {
674*834a2baaSAndroid Build Coastguard Worker     auto text = utf8ToUtf16("b");
675*834a2baaSAndroid Build Coastguard Worker     auto font = buildFontCollection("OvershootTest.ttf");
676*834a2baaSAndroid Build Coastguard Worker     int lbStyle = (int)LineBreakStyle::None;
677*834a2baaSAndroid Build Coastguard Worker     int lbWordStyle = (int)LineBreakWordStyle::None;
678*834a2baaSAndroid Build Coastguard Worker 
679*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
680*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(font);
681*834a2baaSAndroid Build Coastguard Worker     paint.size = 10.0f;
682*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
683*834a2baaSAndroid Build Coastguard Worker                         true /* hyphenation */, false /* is RTL */);
684*834a2baaSAndroid Build Coastguard Worker     auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
685*834a2baaSAndroid Build Coastguard Worker                             true /* computeBounds */, false /* ignore kerning */,
686*834a2baaSAndroid Build Coastguard Worker                             nullptr /* no hint */);
687*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(mt->hasOverhang(Range(0, text.size())));
688*834a2baaSAndroid Build Coastguard Worker }
689*834a2baaSAndroid Build Coastguard Worker 
690*834a2baaSAndroid Build Coastguard Worker }  // namespace minikin
691