xref: /aosp_15_r20/frameworks/minikin/tests/unittest/GreedyLineBreakerTest.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 <com_android_text_flags.h>
18*834a2baaSAndroid Build Coastguard Worker #include <flag_macros.h>
19*834a2baaSAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*834a2baaSAndroid Build Coastguard Worker 
21*834a2baaSAndroid Build Coastguard Worker #include <memory>
22*834a2baaSAndroid Build Coastguard Worker 
23*834a2baaSAndroid Build Coastguard Worker #include "FileUtils.h"
24*834a2baaSAndroid Build Coastguard Worker #include "FontTestUtils.h"
25*834a2baaSAndroid Build Coastguard Worker #include "GreedyLineBreaker.h"
26*834a2baaSAndroid Build Coastguard Worker #include "HyphenatorMap.h"
27*834a2baaSAndroid Build Coastguard Worker #include "LineBreakerTestHelper.h"
28*834a2baaSAndroid Build Coastguard Worker #include "LocaleListCache.h"
29*834a2baaSAndroid Build Coastguard Worker #include "MinikinInternal.h"
30*834a2baaSAndroid Build Coastguard Worker #include "UnicodeUtils.h"
31*834a2baaSAndroid Build Coastguard Worker #include "WordBreaker.h"
32*834a2baaSAndroid Build Coastguard Worker #include "minikin/Hyphenator.h"
33*834a2baaSAndroid Build Coastguard Worker 
34*834a2baaSAndroid Build Coastguard Worker namespace minikin {
35*834a2baaSAndroid Build Coastguard Worker namespace {
36*834a2baaSAndroid Build Coastguard Worker 
37*834a2baaSAndroid Build Coastguard Worker using line_breaker_test_helper::ConstantRun;
38*834a2baaSAndroid Build Coastguard Worker using line_breaker_test_helper::LineBreakExpectation;
39*834a2baaSAndroid Build Coastguard Worker using line_breaker_test_helper::RectangleLineWidth;
40*834a2baaSAndroid Build Coastguard Worker using line_breaker_test_helper::sameLineBreak;
41*834a2baaSAndroid Build Coastguard Worker using line_breaker_test_helper::toString;
42*834a2baaSAndroid Build Coastguard Worker 
43*834a2baaSAndroid Build Coastguard Worker // The ascent/descent of Ascii.ttf with text size = 10.
44*834a2baaSAndroid Build Coastguard Worker constexpr float ASCENT = -80.0f;
45*834a2baaSAndroid Build Coastguard Worker constexpr float DESCENT = 20.0f;
46*834a2baaSAndroid Build Coastguard Worker 
47*834a2baaSAndroid Build Coastguard Worker // The ascent/descent of CustomExtent.ttf with text size = 10.
48*834a2baaSAndroid Build Coastguard Worker constexpr float CUSTOM_ASCENT = -160.0f;
49*834a2baaSAndroid Build Coastguard Worker constexpr float CUSTOM_DESCENT = 40.0f;
50*834a2baaSAndroid Build Coastguard Worker 
51*834a2baaSAndroid Build Coastguard Worker // A test string for Japanese. The meaning is that "Today is a sunny day."
52*834a2baaSAndroid Build Coastguard Worker // The expected line break of phrase and non-phrase cases are:
53*834a2baaSAndroid Build Coastguard Worker //     Phrase: | \u672C\u65E5\u306F | \u6674\u5929\u306A\u308A\u3002 |
54*834a2baaSAndroid Build Coastguard Worker // Non-Phrase: | \u672C | \u65E5 | \u306F | \u6674 | \u5929 | \u306A | \u308A\u3002 |
55*834a2baaSAndroid Build Coastguard Worker const char* JP_TEXT = "\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002";
56*834a2baaSAndroid Build Coastguard Worker 
57*834a2baaSAndroid Build Coastguard Worker // A test string for Korean. The meaning is that "I want to eat breakfast."
58*834a2baaSAndroid Build Coastguard Worker // The phrase based line break breaks at spaces, non-phrase based line break breaks at grapheme.
59*834a2baaSAndroid Build Coastguard Worker const char* KO_TEXT =
60*834a2baaSAndroid Build Coastguard Worker         "\uC544\uCE68\uBC25\uC744\u0020\uBA39\uACE0\u0020\uC2F6\uC2B5\uB2C8\uB2E4\u002E";
61*834a2baaSAndroid Build Coastguard Worker 
62*834a2baaSAndroid Build Coastguard Worker class GreedyLineBreakerTest : public testing::Test {
63*834a2baaSAndroid Build Coastguard Worker public:
GreedyLineBreakerTest()64*834a2baaSAndroid Build Coastguard Worker     GreedyLineBreakerTest() {}
65*834a2baaSAndroid Build Coastguard Worker 
~GreedyLineBreakerTest()66*834a2baaSAndroid Build Coastguard Worker     virtual ~GreedyLineBreakerTest() {}
67*834a2baaSAndroid Build Coastguard Worker 
SetUp()68*834a2baaSAndroid Build Coastguard Worker     virtual void SetUp() override {
69*834a2baaSAndroid Build Coastguard Worker         mHyphenationPattern = readWholeFile("/system/usr/hyphen-data/hyph-en-us.hyb");
70*834a2baaSAndroid Build Coastguard Worker         Hyphenator* hyphenator =
71*834a2baaSAndroid Build Coastguard Worker                 Hyphenator::loadBinary(mHyphenationPattern.data(), mHyphenationPattern.size(),
72*834a2baaSAndroid Build Coastguard Worker                                        2 /* min prefix */, 2 /* min suffix */, "en-US");
73*834a2baaSAndroid Build Coastguard Worker         HyphenatorMap::add("en-US", hyphenator);
74*834a2baaSAndroid Build Coastguard Worker         HyphenatorMap::add("pl", Hyphenator::loadBinary(nullptr, 0, 0, 0, "pl"));
75*834a2baaSAndroid Build Coastguard Worker     }
76*834a2baaSAndroid Build Coastguard Worker 
TearDown()77*834a2baaSAndroid Build Coastguard Worker     virtual void TearDown() override { HyphenatorMap::clear(); }
78*834a2baaSAndroid Build Coastguard Worker 
79*834a2baaSAndroid Build Coastguard Worker protected:
doLineBreak(const U16StringPiece & textBuffer,bool doHyphenation,float lineWidth)80*834a2baaSAndroid Build Coastguard Worker     LineBreakResult doLineBreak(const U16StringPiece& textBuffer, bool doHyphenation,
81*834a2baaSAndroid Build Coastguard Worker                                 float lineWidth) {
82*834a2baaSAndroid Build Coastguard Worker         return doLineBreak(textBuffer, doHyphenation, "en-US", lineWidth);
83*834a2baaSAndroid Build Coastguard Worker     }
84*834a2baaSAndroid Build Coastguard Worker 
doLineBreakForJapanese(const U16StringPiece & textBuffer,LineBreakWordStyle lbwStyle,const std::string & lang,float lineWidth)85*834a2baaSAndroid Build Coastguard Worker     LineBreakResult doLineBreakForJapanese(const U16StringPiece& textBuffer,
86*834a2baaSAndroid Build Coastguard Worker                                            LineBreakWordStyle lbwStyle, const std::string& lang,
87*834a2baaSAndroid Build Coastguard Worker                                            float lineWidth) {
88*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
89*834a2baaSAndroid Build Coastguard Worker         auto family = buildFontFamily("Japanese.ttf");
90*834a2baaSAndroid Build Coastguard Worker         std::vector<std::shared_ptr<FontFamily>> families = {family};
91*834a2baaSAndroid Build Coastguard Worker         auto fc = FontCollection::create(families);
92*834a2baaSAndroid Build Coastguard Worker         MinikinPaint paint(fc);
93*834a2baaSAndroid Build Coastguard Worker         paint.size = 10.0f;  // Make 1em=10px
94*834a2baaSAndroid Build Coastguard Worker         paint.localeListId = LocaleListCache::getId(lang);
95*834a2baaSAndroid Build Coastguard Worker         builder.addStyleRun(0, textBuffer.size(), std::move(paint), (int)LineBreakStyle::None,
96*834a2baaSAndroid Build Coastguard Worker                             (int)lbwStyle, true, false);
97*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
98*834a2baaSAndroid Build Coastguard Worker                 textBuffer, false /* compute hyphenation */, false /* compute full layout */,
99*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
100*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(lineWidth);
101*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 10);
102*834a2baaSAndroid Build Coastguard Worker         return breakLineGreedy(textBuffer, *measuredText, rectangleLineWidth, tabStops, false,
103*834a2baaSAndroid Build Coastguard Worker                                false);
104*834a2baaSAndroid Build Coastguard Worker     }
105*834a2baaSAndroid Build Coastguard Worker 
doLineBreakForKorean(const U16StringPiece & textBuffer,LineBreakWordStyle lbwStyle,const std::string & lang,float lineWidth)106*834a2baaSAndroid Build Coastguard Worker     LineBreakResult doLineBreakForKorean(const U16StringPiece& textBuffer,
107*834a2baaSAndroid Build Coastguard Worker                                          LineBreakWordStyle lbwStyle, const std::string& lang,
108*834a2baaSAndroid Build Coastguard Worker                                          float lineWidth) {
109*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
110*834a2baaSAndroid Build Coastguard Worker         auto family = buildFontFamily("Hangul.ttf");
111*834a2baaSAndroid Build Coastguard Worker         std::vector<std::shared_ptr<FontFamily>> families = {family};
112*834a2baaSAndroid Build Coastguard Worker         auto fc = FontCollection::create(families);
113*834a2baaSAndroid Build Coastguard Worker         MinikinPaint paint(fc);
114*834a2baaSAndroid Build Coastguard Worker         paint.size = 10.0f;  // Make 1em=10px
115*834a2baaSAndroid Build Coastguard Worker         paint.localeListId = LocaleListCache::getId(lang);
116*834a2baaSAndroid Build Coastguard Worker         builder.addStyleRun(0, textBuffer.size(), std::move(paint), (int)LineBreakStyle::None,
117*834a2baaSAndroid Build Coastguard Worker                             (int)lbwStyle, true, false);
118*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
119*834a2baaSAndroid Build Coastguard Worker                 textBuffer, false /* compute hyphenation */, false /* compute full layout */,
120*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
121*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(lineWidth);
122*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 10);
123*834a2baaSAndroid Build Coastguard Worker         return breakLineGreedy(textBuffer, *measuredText, rectangleLineWidth, tabStops, false,
124*834a2baaSAndroid Build Coastguard Worker                                false);
125*834a2baaSAndroid Build Coastguard Worker     }
126*834a2baaSAndroid Build Coastguard Worker 
doLineBreak(const U16StringPiece & textBuffer,bool doHyphenation,const std::string & lang,float lineWidth)127*834a2baaSAndroid Build Coastguard Worker     LineBreakResult doLineBreak(const U16StringPiece& textBuffer, bool doHyphenation,
128*834a2baaSAndroid Build Coastguard Worker                                 const std::string& lang, float lineWidth) {
129*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
130*834a2baaSAndroid Build Coastguard Worker         auto family1 = buildFontFamily("Ascii.ttf");
131*834a2baaSAndroid Build Coastguard Worker         auto family2 = buildFontFamily("CustomExtent.ttf");
132*834a2baaSAndroid Build Coastguard Worker         std::vector<std::shared_ptr<FontFamily>> families = {family1, family2};
133*834a2baaSAndroid Build Coastguard Worker         auto fc = FontCollection::create(families);
134*834a2baaSAndroid Build Coastguard Worker         MinikinPaint paint(fc);
135*834a2baaSAndroid Build Coastguard Worker         paint.size = 10.0f;  // Make 1em=10px
136*834a2baaSAndroid Build Coastguard Worker         paint.localeListId = LocaleListCache::getId(lang);
137*834a2baaSAndroid Build Coastguard Worker         builder.addStyleRun(0, textBuffer.size(), std::move(paint), (int)LineBreakStyle::None,
138*834a2baaSAndroid Build Coastguard Worker                             (int)LineBreakWordStyle::None, true, false);
139*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
140*834a2baaSAndroid Build Coastguard Worker                 textBuffer, false /* compute hyphenation */, false /* compute full layout */,
141*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
142*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(lineWidth);
143*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 10);
144*834a2baaSAndroid Build Coastguard Worker         return breakLineGreedy(textBuffer, *measuredText, rectangleLineWidth, tabStops,
145*834a2baaSAndroid Build Coastguard Worker                                doHyphenation, false);
146*834a2baaSAndroid Build Coastguard Worker     }
147*834a2baaSAndroid Build Coastguard Worker 
doLineBreakWithNoHyphenSpan(const U16StringPiece & textBuffer,const Range & noHyphenRange,float lineWidth)148*834a2baaSAndroid Build Coastguard Worker     LineBreakResult doLineBreakWithNoHyphenSpan(const U16StringPiece& textBuffer,
149*834a2baaSAndroid Build Coastguard Worker                                                 const Range& noHyphenRange, float lineWidth) {
150*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
151*834a2baaSAndroid Build Coastguard Worker         auto family1 = buildFontFamily("Ascii.ttf");
152*834a2baaSAndroid Build Coastguard Worker         auto family2 = buildFontFamily("CustomExtent.ttf");
153*834a2baaSAndroid Build Coastguard Worker         std::vector<std::shared_ptr<FontFamily>> families = {family1, family2};
154*834a2baaSAndroid Build Coastguard Worker         auto fc = FontCollection::create(families);
155*834a2baaSAndroid Build Coastguard Worker         if (noHyphenRange.getStart() != 0) {
156*834a2baaSAndroid Build Coastguard Worker             MinikinPaint paint(fc);
157*834a2baaSAndroid Build Coastguard Worker             paint.size = 10.0f;  // Make 1em=10px
158*834a2baaSAndroid Build Coastguard Worker             paint.localeListId = LocaleListCache::getId("en-US");
159*834a2baaSAndroid Build Coastguard Worker             builder.addStyleRun(0, noHyphenRange.getStart(), std::move(paint),
160*834a2baaSAndroid Build Coastguard Worker                                 (int)LineBreakStyle::None, (int)LineBreakWordStyle::None,
161*834a2baaSAndroid Build Coastguard Worker                                 true /* hyphenation */, false);
162*834a2baaSAndroid Build Coastguard Worker         }
163*834a2baaSAndroid Build Coastguard Worker         MinikinPaint paint(fc);
164*834a2baaSAndroid Build Coastguard Worker         paint.size = 10.0f;  // Make 1em=10px
165*834a2baaSAndroid Build Coastguard Worker         paint.localeListId = LocaleListCache::getId("en-US");
166*834a2baaSAndroid Build Coastguard Worker         builder.addStyleRun(noHyphenRange.getStart(), noHyphenRange.getEnd(), std::move(paint),
167*834a2baaSAndroid Build Coastguard Worker                             (int)LineBreakStyle::None, (int)LineBreakWordStyle::None,
168*834a2baaSAndroid Build Coastguard Worker                             false /* hyphenation */, false);
169*834a2baaSAndroid Build Coastguard Worker         if (noHyphenRange.getEnd() != textBuffer.size()) {
170*834a2baaSAndroid Build Coastguard Worker             MinikinPaint paint(fc);
171*834a2baaSAndroid Build Coastguard Worker             paint.size = 10.0f;  // Make 1em=10px
172*834a2baaSAndroid Build Coastguard Worker             paint.localeListId = LocaleListCache::getId("en-US");
173*834a2baaSAndroid Build Coastguard Worker             builder.addStyleRun(noHyphenRange.getEnd(), textBuffer.size(), std::move(paint),
174*834a2baaSAndroid Build Coastguard Worker                                 (int)LineBreakStyle::None, (int)LineBreakWordStyle::None,
175*834a2baaSAndroid Build Coastguard Worker                                 true /* hyphenation */, false);
176*834a2baaSAndroid Build Coastguard Worker         }
177*834a2baaSAndroid Build Coastguard Worker 
178*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
179*834a2baaSAndroid Build Coastguard Worker                 textBuffer, false /* compute hyphenation */, false /* compute full layout */,
180*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
181*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(lineWidth);
182*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 10);
183*834a2baaSAndroid Build Coastguard Worker         return breakLineGreedy(textBuffer, *measuredText, rectangleLineWidth, tabStops,
184*834a2baaSAndroid Build Coastguard Worker                                true /* doHyphenation */, false);
185*834a2baaSAndroid Build Coastguard Worker     }
186*834a2baaSAndroid Build Coastguard Worker 
doLineBreakForBounds(const U16StringPiece & textBuffer,bool doHyphenation,float lineWidth)187*834a2baaSAndroid Build Coastguard Worker     LineBreakResult doLineBreakForBounds(const U16StringPiece& textBuffer, bool doHyphenation,
188*834a2baaSAndroid Build Coastguard Worker                                          float lineWidth) {
189*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
190*834a2baaSAndroid Build Coastguard Worker         auto family1 = buildFontFamily("OvershootTest.ttf");
191*834a2baaSAndroid Build Coastguard Worker         auto family2 = buildFontFamily("Ascii.ttf");
192*834a2baaSAndroid Build Coastguard Worker         std::vector<std::shared_ptr<FontFamily>> families = {family1, family2};
193*834a2baaSAndroid Build Coastguard Worker         auto fc = FontCollection::create(families);
194*834a2baaSAndroid Build Coastguard Worker         MinikinPaint paint(fc);
195*834a2baaSAndroid Build Coastguard Worker         paint.size = 10.0f;  // Make 1em=10px
196*834a2baaSAndroid Build Coastguard Worker         paint.localeListId = LocaleListCache::getId("en-US");
197*834a2baaSAndroid Build Coastguard Worker         builder.addStyleRun(0, textBuffer.size(), std::move(paint), (int)LineBreakStyle::None,
198*834a2baaSAndroid Build Coastguard Worker                             (int)LineBreakWordStyle::None, true, false);
199*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
200*834a2baaSAndroid Build Coastguard Worker                 textBuffer, false /* compute hyphenation */, false /* compute full layout */,
201*834a2baaSAndroid Build Coastguard Worker                 true /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
202*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(lineWidth);
203*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 10);
204*834a2baaSAndroid Build Coastguard Worker         return breakLineGreedy(textBuffer, *measuredText, rectangleLineWidth, tabStops,
205*834a2baaSAndroid Build Coastguard Worker                                doHyphenation, true);
206*834a2baaSAndroid Build Coastguard Worker     }
207*834a2baaSAndroid Build Coastguard Worker 
doLineBreakForLetterSpacing(const U16StringPiece & textBuffer,float letterSpacing,float lineWidth)208*834a2baaSAndroid Build Coastguard Worker     LineBreakResult doLineBreakForLetterSpacing(const U16StringPiece& textBuffer,
209*834a2baaSAndroid Build Coastguard Worker                                                 float letterSpacing, float lineWidth) {
210*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
211*834a2baaSAndroid Build Coastguard Worker         auto family1 = buildFontFamily("Ascii.ttf");
212*834a2baaSAndroid Build Coastguard Worker         auto family2 = buildFontFamily("CustomExtent.ttf");
213*834a2baaSAndroid Build Coastguard Worker         std::vector<std::shared_ptr<FontFamily>> families = {family1, family2};
214*834a2baaSAndroid Build Coastguard Worker         auto fc = FontCollection::create(families);
215*834a2baaSAndroid Build Coastguard Worker         MinikinPaint paint(fc);
216*834a2baaSAndroid Build Coastguard Worker         paint.size = 10.0f;  // Make 1em=10px
217*834a2baaSAndroid Build Coastguard Worker         paint.letterSpacing = letterSpacing;
218*834a2baaSAndroid Build Coastguard Worker         paint.scaleX = 1.0f;
219*834a2baaSAndroid Build Coastguard Worker         paint.localeListId = LocaleListCache::getId("en-US");
220*834a2baaSAndroid Build Coastguard Worker         builder.addStyleRun(0, textBuffer.size(), std::move(paint), (int)LineBreakStyle::None,
221*834a2baaSAndroid Build Coastguard Worker                             (int)LineBreakWordStyle::None, true, false);
222*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
223*834a2baaSAndroid Build Coastguard Worker                 textBuffer, false /* compute hyphenation */, false /* compute full layout */,
224*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
225*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(lineWidth);
226*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 10);
227*834a2baaSAndroid Build Coastguard Worker         return breakLineGreedy(textBuffer, *measuredText, rectangleLineWidth, tabStops,
228*834a2baaSAndroid Build Coastguard Worker                                false /* hyphenation */, false);
229*834a2baaSAndroid Build Coastguard Worker     }
230*834a2baaSAndroid Build Coastguard Worker 
231*834a2baaSAndroid Build Coastguard Worker private:
232*834a2baaSAndroid Build Coastguard Worker     std::vector<uint8_t> mHyphenationPattern;
233*834a2baaSAndroid Build Coastguard Worker };
234*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,roundingError)235*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, roundingError) {
236*834a2baaSAndroid Build Coastguard Worker     MeasuredTextBuilder builder;
237*834a2baaSAndroid Build Coastguard Worker     auto family1 = buildFontFamily("Ascii.ttf");
238*834a2baaSAndroid Build Coastguard Worker     std::vector<std::shared_ptr<FontFamily>> families = {family1};
239*834a2baaSAndroid Build Coastguard Worker     auto fc = FontCollection::create(families);
240*834a2baaSAndroid Build Coastguard Worker     MinikinPaint paint(fc);
241*834a2baaSAndroid Build Coastguard Worker     paint.size = 56.0f;  // Make 1em=56px
242*834a2baaSAndroid Build Coastguard Worker     paint.scaleX = 1;
243*834a2baaSAndroid Build Coastguard Worker     paint.letterSpacing = -0.093f;
244*834a2baaSAndroid Build Coastguard Worker     paint.localeListId = LocaleListCache::getId("en-US");
245*834a2baaSAndroid Build Coastguard Worker     const std::vector<uint16_t> textBuffer = utf8ToUtf16("8888888888888888888");
246*834a2baaSAndroid Build Coastguard Worker 
247*834a2baaSAndroid Build Coastguard Worker     float measured = Layout::measureText(textBuffer, Range(0, textBuffer.size()), Bidi::LTR, paint,
248*834a2baaSAndroid Build Coastguard Worker                                          StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, nullptr,
249*834a2baaSAndroid Build Coastguard Worker                                          nullptr, nullptr, RunFlag::WHOLE_LINE);
250*834a2baaSAndroid Build Coastguard Worker 
251*834a2baaSAndroid Build Coastguard Worker     builder.addStyleRun(0, textBuffer.size(), std::move(paint), (int)LineBreakStyle::None,
252*834a2baaSAndroid Build Coastguard Worker                         (int)LineBreakWordStyle::None, true, false);
253*834a2baaSAndroid Build Coastguard Worker     std::unique_ptr<MeasuredText> measuredText = builder.build(
254*834a2baaSAndroid Build Coastguard Worker             textBuffer, false /* compute hyphenation */, false /* compute full layout */,
255*834a2baaSAndroid Build Coastguard Worker             false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
256*834a2baaSAndroid Build Coastguard Worker     RectangleLineWidth rectangleLineWidth(measured);
257*834a2baaSAndroid Build Coastguard Worker     TabStops tabStops(nullptr, 0, 10);
258*834a2baaSAndroid Build Coastguard Worker     LineBreakResult r = breakLineGreedy(textBuffer, *measuredText, rectangleLineWidth, tabStops,
259*834a2baaSAndroid Build Coastguard Worker                                         false /* do hyphenation */, false /* useBoundsForWidth */);
260*834a2baaSAndroid Build Coastguard Worker 
261*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, r.breakPoints.size());
262*834a2baaSAndroid Build Coastguard Worker }
263*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testBreakWithoutHyphenation)264*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testBreakWithoutHyphenation) {
265*834a2baaSAndroid Build Coastguard Worker     constexpr bool NO_HYPHEN = false;  // No hyphenation in this test case.
266*834a2baaSAndroid Build Coastguard Worker     const std::vector<uint16_t> textBuf = utf8ToUtf16("This is an example text.");
267*834a2baaSAndroid Build Coastguard Worker 
268*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
269*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
270*834a2baaSAndroid Build Coastguard Worker     // Note that disable clang-format everywhere since aligned expectation is more readable.
271*834a2baaSAndroid Build Coastguard Worker     {
272*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 1000;
273*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
274*834a2baaSAndroid Build Coastguard Worker                 {"This is an example text.", 240, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
275*834a2baaSAndroid Build Coastguard Worker         };
276*834a2baaSAndroid Build Coastguard Worker 
277*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
278*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
279*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
280*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
281*834a2baaSAndroid Build Coastguard Worker     }
282*834a2baaSAndroid Build Coastguard Worker     {
283*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 240;
284*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
285*834a2baaSAndroid Build Coastguard Worker                 {"This is an example text.", 240, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
286*834a2baaSAndroid Build Coastguard Worker         };
287*834a2baaSAndroid Build Coastguard Worker 
288*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
289*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
290*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
291*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
292*834a2baaSAndroid Build Coastguard Worker     }
293*834a2baaSAndroid Build Coastguard Worker     {
294*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 230;
295*834a2baaSAndroid Build Coastguard Worker         // clang-format off
296*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
297*834a2baaSAndroid Build Coastguard Worker                 { "This is an example ", 180, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
298*834a2baaSAndroid Build Coastguard Worker                 { "text."              ,  50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
299*834a2baaSAndroid Build Coastguard Worker         };
300*834a2baaSAndroid Build Coastguard Worker         // clang-format on
301*834a2baaSAndroid Build Coastguard Worker 
302*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
303*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
304*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
305*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
306*834a2baaSAndroid Build Coastguard Worker     }
307*834a2baaSAndroid Build Coastguard Worker     {
308*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 80;
309*834a2baaSAndroid Build Coastguard Worker         // clang-format off
310*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
311*834a2baaSAndroid Build Coastguard Worker                 { "This is ", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
312*834a2baaSAndroid Build Coastguard Worker                 { "an "     , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
313*834a2baaSAndroid Build Coastguard Worker                 { "example ", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
314*834a2baaSAndroid Build Coastguard Worker                 { "text."   , 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
315*834a2baaSAndroid Build Coastguard Worker         };
316*834a2baaSAndroid Build Coastguard Worker         // clang-format on
317*834a2baaSAndroid Build Coastguard Worker 
318*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
319*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
320*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
321*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
322*834a2baaSAndroid Build Coastguard Worker     }
323*834a2baaSAndroid Build Coastguard Worker     {
324*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 70;
325*834a2baaSAndroid Build Coastguard Worker         // clang-format off
326*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
327*834a2baaSAndroid Build Coastguard Worker                 { "This is ", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
328*834a2baaSAndroid Build Coastguard Worker                 { "an "     , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
329*834a2baaSAndroid Build Coastguard Worker                 { "example ", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
330*834a2baaSAndroid Build Coastguard Worker                 { "text."   , 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
331*834a2baaSAndroid Build Coastguard Worker         };
332*834a2baaSAndroid Build Coastguard Worker         // clang-format on
333*834a2baaSAndroid Build Coastguard Worker 
334*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
335*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
336*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
337*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
338*834a2baaSAndroid Build Coastguard Worker     }
339*834a2baaSAndroid Build Coastguard Worker     {
340*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 60;
341*834a2baaSAndroid Build Coastguard Worker         // clang-format off
342*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
343*834a2baaSAndroid Build Coastguard Worker                 { "This " , 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
344*834a2baaSAndroid Build Coastguard Worker                 { "is an ", 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
345*834a2baaSAndroid Build Coastguard Worker                 { "exampl", 60, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
346*834a2baaSAndroid Build Coastguard Worker                 { "e "    , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
347*834a2baaSAndroid Build Coastguard Worker                 { "text." , 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
348*834a2baaSAndroid Build Coastguard Worker         };
349*834a2baaSAndroid Build Coastguard Worker         // clang-format on
350*834a2baaSAndroid Build Coastguard Worker 
351*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
352*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
353*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
354*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
355*834a2baaSAndroid Build Coastguard Worker     }
356*834a2baaSAndroid Build Coastguard Worker     {
357*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 50;
358*834a2baaSAndroid Build Coastguard Worker         // clang-format off
359*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
360*834a2baaSAndroid Build Coastguard Worker                 { "This " , 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
361*834a2baaSAndroid Build Coastguard Worker                 { "is an ", 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
362*834a2baaSAndroid Build Coastguard Worker                 { "examp" , 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
363*834a2baaSAndroid Build Coastguard Worker                 { "le "   , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
364*834a2baaSAndroid Build Coastguard Worker                 { "text." , 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
365*834a2baaSAndroid Build Coastguard Worker         };
366*834a2baaSAndroid Build Coastguard Worker         // clang-format on
367*834a2baaSAndroid Build Coastguard Worker 
368*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
369*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
370*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
371*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
372*834a2baaSAndroid Build Coastguard Worker     }
373*834a2baaSAndroid Build Coastguard Worker     {
374*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 40;
375*834a2baaSAndroid Build Coastguard Worker         // clang-format off
376*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
377*834a2baaSAndroid Build Coastguard Worker                 { "This " , 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
378*834a2baaSAndroid Build Coastguard Worker                 { "is "   , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
379*834a2baaSAndroid Build Coastguard Worker                 { "an "   , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
380*834a2baaSAndroid Build Coastguard Worker                 { "exam"  , 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
381*834a2baaSAndroid Build Coastguard Worker                 { "ple "  , 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
382*834a2baaSAndroid Build Coastguard Worker                 { "text"  , 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
383*834a2baaSAndroid Build Coastguard Worker                 { "."     , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
384*834a2baaSAndroid Build Coastguard Worker         };
385*834a2baaSAndroid Build Coastguard Worker         // clang-format on
386*834a2baaSAndroid Build Coastguard Worker 
387*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
388*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
389*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
390*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
391*834a2baaSAndroid Build Coastguard Worker     }
392*834a2baaSAndroid Build Coastguard Worker     {
393*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 30;
394*834a2baaSAndroid Build Coastguard Worker         // clang-format off
395*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
396*834a2baaSAndroid Build Coastguard Worker                 { "Thi" , 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
397*834a2baaSAndroid Build Coastguard Worker                 { "s "  , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
398*834a2baaSAndroid Build Coastguard Worker                 { "is " , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
399*834a2baaSAndroid Build Coastguard Worker                 { "an " , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
400*834a2baaSAndroid Build Coastguard Worker                 { "exa" , 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
401*834a2baaSAndroid Build Coastguard Worker                 { "mpl" , 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
402*834a2baaSAndroid Build Coastguard Worker                 { "e "  , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
403*834a2baaSAndroid Build Coastguard Worker                 { "tex" , 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
404*834a2baaSAndroid Build Coastguard Worker                 { "t."  , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
405*834a2baaSAndroid Build Coastguard Worker         };
406*834a2baaSAndroid Build Coastguard Worker         // clang-format on
407*834a2baaSAndroid Build Coastguard Worker 
408*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
409*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
410*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
411*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
412*834a2baaSAndroid Build Coastguard Worker     }
413*834a2baaSAndroid Build Coastguard Worker     {
414*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 20;
415*834a2baaSAndroid Build Coastguard Worker         // clang-format off
416*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
417*834a2baaSAndroid Build Coastguard Worker                 { "Th" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
418*834a2baaSAndroid Build Coastguard Worker                 { "is ", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
419*834a2baaSAndroid Build Coastguard Worker                 { "is ", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
420*834a2baaSAndroid Build Coastguard Worker                 { "an ", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
421*834a2baaSAndroid Build Coastguard Worker                 { "ex" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
422*834a2baaSAndroid Build Coastguard Worker                 { "am" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
423*834a2baaSAndroid Build Coastguard Worker                 { "pl" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
424*834a2baaSAndroid Build Coastguard Worker                 { "e " , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
425*834a2baaSAndroid Build Coastguard Worker                 { "te" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
426*834a2baaSAndroid Build Coastguard Worker                 { "xt" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
427*834a2baaSAndroid Build Coastguard Worker                 { "."  , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
428*834a2baaSAndroid Build Coastguard Worker         };
429*834a2baaSAndroid Build Coastguard Worker         // clang-format on
430*834a2baaSAndroid Build Coastguard Worker 
431*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
432*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
433*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
434*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
435*834a2baaSAndroid Build Coastguard Worker     }
436*834a2baaSAndroid Build Coastguard Worker     {
437*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 10;
438*834a2baaSAndroid Build Coastguard Worker         // clang-format off
439*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
440*834a2baaSAndroid Build Coastguard Worker                 { "T" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
441*834a2baaSAndroid Build Coastguard Worker                 { "h" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
442*834a2baaSAndroid Build Coastguard Worker                 { "i" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
443*834a2baaSAndroid Build Coastguard Worker                 { "s ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
444*834a2baaSAndroid Build Coastguard Worker                 { "i" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
445*834a2baaSAndroid Build Coastguard Worker                 { "s ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
446*834a2baaSAndroid Build Coastguard Worker                 { "a" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
447*834a2baaSAndroid Build Coastguard Worker                 { "n ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
448*834a2baaSAndroid Build Coastguard Worker                 { "e" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
449*834a2baaSAndroid Build Coastguard Worker                 { "x" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
450*834a2baaSAndroid Build Coastguard Worker                 { "a" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
451*834a2baaSAndroid Build Coastguard Worker                 { "m" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
452*834a2baaSAndroid Build Coastguard Worker                 { "p" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
453*834a2baaSAndroid Build Coastguard Worker                 { "l" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
454*834a2baaSAndroid Build Coastguard Worker                 { "e ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
455*834a2baaSAndroid Build Coastguard Worker                 { "t" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
456*834a2baaSAndroid Build Coastguard Worker                 { "e" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
457*834a2baaSAndroid Build Coastguard Worker                 { "x" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
458*834a2baaSAndroid Build Coastguard Worker                 { "t" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
459*834a2baaSAndroid Build Coastguard Worker                 { "." , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
460*834a2baaSAndroid Build Coastguard Worker         };
461*834a2baaSAndroid Build Coastguard Worker         // clang-format on
462*834a2baaSAndroid Build Coastguard Worker 
463*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
464*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
465*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
466*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
467*834a2baaSAndroid Build Coastguard Worker     }
468*834a2baaSAndroid Build Coastguard Worker }
469*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testBreakWithHyphenation)470*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testBreakWithHyphenation) {
471*834a2baaSAndroid Build Coastguard Worker     constexpr bool NO_HYPHEN = true;  // Do hyphenation in this test case.
472*834a2baaSAndroid Build Coastguard Worker     // "hyphenation" is hyphnated to "hy-phen-a-tion".
473*834a2baaSAndroid Build Coastguard Worker     const std::vector<uint16_t> textBuf = utf8ToUtf16("Hyphenation is hyphenation.");
474*834a2baaSAndroid Build Coastguard Worker 
475*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
476*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit END_HYPHEN = EndHyphenEdit::INSERT_HYPHEN;
477*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
478*834a2baaSAndroid Build Coastguard Worker 
479*834a2baaSAndroid Build Coastguard Worker     // Note that disable clang-format everywhere since aligned expectation is more readable.
480*834a2baaSAndroid Build Coastguard Worker     {
481*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 1000;
482*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
483*834a2baaSAndroid Build Coastguard Worker                 {"Hyphenation is hyphenation.", 270, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT,
484*834a2baaSAndroid Build Coastguard Worker                  DESCENT},
485*834a2baaSAndroid Build Coastguard Worker         };
486*834a2baaSAndroid Build Coastguard Worker 
487*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
488*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
489*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
490*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
491*834a2baaSAndroid Build Coastguard Worker     }
492*834a2baaSAndroid Build Coastguard Worker     {
493*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 270;
494*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
495*834a2baaSAndroid Build Coastguard Worker                 {"Hyphenation is hyphenation.", 270, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT,
496*834a2baaSAndroid Build Coastguard Worker                  DESCENT},
497*834a2baaSAndroid Build Coastguard Worker         };
498*834a2baaSAndroid Build Coastguard Worker 
499*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
500*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
501*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
502*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
503*834a2baaSAndroid Build Coastguard Worker     }
504*834a2baaSAndroid Build Coastguard Worker     {
505*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 260;
506*834a2baaSAndroid Build Coastguard Worker         // clang-format off
507*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
508*834a2baaSAndroid Build Coastguard Worker                 { "Hyphenation is " , 140, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
509*834a2baaSAndroid Build Coastguard Worker                 { "hyphenation."    , 120, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
510*834a2baaSAndroid Build Coastguard Worker         };
511*834a2baaSAndroid Build Coastguard Worker         // clang-format on
512*834a2baaSAndroid Build Coastguard Worker 
513*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
514*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
515*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
516*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
517*834a2baaSAndroid Build Coastguard Worker     }
518*834a2baaSAndroid Build Coastguard Worker     {
519*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 170;
520*834a2baaSAndroid Build Coastguard Worker         // clang-format off
521*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
522*834a2baaSAndroid Build Coastguard Worker                 { "Hyphenation is " , 140, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
523*834a2baaSAndroid Build Coastguard Worker                 { "hyphenation."    , 120, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
524*834a2baaSAndroid Build Coastguard Worker         };
525*834a2baaSAndroid Build Coastguard Worker         // clang-format on
526*834a2baaSAndroid Build Coastguard Worker 
527*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
528*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
529*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
530*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
531*834a2baaSAndroid Build Coastguard Worker     }
532*834a2baaSAndroid Build Coastguard Worker     {
533*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 120;
534*834a2baaSAndroid Build Coastguard Worker         // clang-format off
535*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
536*834a2baaSAndroid Build Coastguard Worker                 { "Hyphenation " , 110, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
537*834a2baaSAndroid Build Coastguard Worker                 { "is "          , 20 , NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
538*834a2baaSAndroid Build Coastguard Worker                 { "hyphenation." , 120, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
539*834a2baaSAndroid Build Coastguard Worker         };
540*834a2baaSAndroid Build Coastguard Worker         // clang-format on
541*834a2baaSAndroid Build Coastguard Worker 
542*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
543*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
544*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
545*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
546*834a2baaSAndroid Build Coastguard Worker     }
547*834a2baaSAndroid Build Coastguard Worker     {
548*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
549*834a2baaSAndroid Build Coastguard Worker         // clang-format off
550*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
551*834a2baaSAndroid Build Coastguard Worker                 { "Hyphena-", 80, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
552*834a2baaSAndroid Build Coastguard Worker                 { "tion is ", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
553*834a2baaSAndroid Build Coastguard Worker                 { "hyphena-", 80, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
554*834a2baaSAndroid Build Coastguard Worker                 { "tion."   , 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
555*834a2baaSAndroid Build Coastguard Worker         };
556*834a2baaSAndroid Build Coastguard Worker         // clang-format on
557*834a2baaSAndroid Build Coastguard Worker 
558*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
559*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
560*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
561*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
562*834a2baaSAndroid Build Coastguard Worker     }
563*834a2baaSAndroid Build Coastguard Worker     {
564*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 80;
565*834a2baaSAndroid Build Coastguard Worker         // clang-format off
566*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
567*834a2baaSAndroid Build Coastguard Worker                 { "Hyphena-", 80, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
568*834a2baaSAndroid Build Coastguard Worker                 { "tion is ", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
569*834a2baaSAndroid Build Coastguard Worker                 { "hyphena-", 80, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
570*834a2baaSAndroid Build Coastguard Worker                 { "tion."   , 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
571*834a2baaSAndroid Build Coastguard Worker         };
572*834a2baaSAndroid Build Coastguard Worker         // clang-format on
573*834a2baaSAndroid Build Coastguard Worker 
574*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
575*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
576*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
577*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
578*834a2baaSAndroid Build Coastguard Worker     }
579*834a2baaSAndroid Build Coastguard Worker     {
580*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 70;
581*834a2baaSAndroid Build Coastguard Worker         // clang-format off
582*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
583*834a2baaSAndroid Build Coastguard Worker                 { "Hyphen-", 70, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
584*834a2baaSAndroid Build Coastguard Worker                 { "ation " , 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
585*834a2baaSAndroid Build Coastguard Worker                 { "is "    , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
586*834a2baaSAndroid Build Coastguard Worker                 { "hyphen-", 70, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
587*834a2baaSAndroid Build Coastguard Worker                 { "ation." , 60, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
588*834a2baaSAndroid Build Coastguard Worker         };
589*834a2baaSAndroid Build Coastguard Worker         // clang-format on
590*834a2baaSAndroid Build Coastguard Worker 
591*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
592*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
593*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
594*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
595*834a2baaSAndroid Build Coastguard Worker     }
596*834a2baaSAndroid Build Coastguard Worker     {
597*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 60;
598*834a2baaSAndroid Build Coastguard Worker         // clang-format off
599*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
600*834a2baaSAndroid Build Coastguard Worker                 { "Hy-"   , 30, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
601*834a2baaSAndroid Build Coastguard Worker                 { "phena-", 60, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
602*834a2baaSAndroid Build Coastguard Worker                 { "tion " , 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
603*834a2baaSAndroid Build Coastguard Worker                 { "is "   , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
604*834a2baaSAndroid Build Coastguard Worker                 { "hy-"   , 30, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
605*834a2baaSAndroid Build Coastguard Worker                 { "phena-", 60, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
606*834a2baaSAndroid Build Coastguard Worker                 { "tion." , 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
607*834a2baaSAndroid Build Coastguard Worker         };
608*834a2baaSAndroid Build Coastguard Worker         // clang-format on
609*834a2baaSAndroid Build Coastguard Worker 
610*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
611*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
612*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
613*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
614*834a2baaSAndroid Build Coastguard Worker     }
615*834a2baaSAndroid Build Coastguard Worker     {
616*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 50;
617*834a2baaSAndroid Build Coastguard Worker         // clang-format off
618*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
619*834a2baaSAndroid Build Coastguard Worker                 { "Hy-"   , 30, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
620*834a2baaSAndroid Build Coastguard Worker                 { "phen-" , 50, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
621*834a2baaSAndroid Build Coastguard Worker                 { "ation ", 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
622*834a2baaSAndroid Build Coastguard Worker                 { "is "   , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
623*834a2baaSAndroid Build Coastguard Worker                 { "hy-"   , 30, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
624*834a2baaSAndroid Build Coastguard Worker                 { "phen-" , 50, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
625*834a2baaSAndroid Build Coastguard Worker                 { "a-"    , 20, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
626*834a2baaSAndroid Build Coastguard Worker                 { "tion." , 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
627*834a2baaSAndroid Build Coastguard Worker         };
628*834a2baaSAndroid Build Coastguard Worker         // clang-format on
629*834a2baaSAndroid Build Coastguard Worker 
630*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
631*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
632*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
633*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
634*834a2baaSAndroid Build Coastguard Worker     }
635*834a2baaSAndroid Build Coastguard Worker     {
636*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 40;
637*834a2baaSAndroid Build Coastguard Worker         // clang-format off
638*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
639*834a2baaSAndroid Build Coastguard Worker                 { "Hy-"  , 30, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
640*834a2baaSAndroid Build Coastguard Worker                 { "phen" , 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
641*834a2baaSAndroid Build Coastguard Worker                 { "a-"   , 20, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
642*834a2baaSAndroid Build Coastguard Worker                 { "tion ", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
643*834a2baaSAndroid Build Coastguard Worker                 { "is "  , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
644*834a2baaSAndroid Build Coastguard Worker                 { "hy-"  , 30, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
645*834a2baaSAndroid Build Coastguard Worker                 { "phen" , 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
646*834a2baaSAndroid Build Coastguard Worker                 { "a-"   , 20, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
647*834a2baaSAndroid Build Coastguard Worker                 { "tion" , 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
648*834a2baaSAndroid Build Coastguard Worker                 { "."    , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
649*834a2baaSAndroid Build Coastguard Worker         };
650*834a2baaSAndroid Build Coastguard Worker         // clang-format on
651*834a2baaSAndroid Build Coastguard Worker 
652*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
653*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
654*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
655*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
656*834a2baaSAndroid Build Coastguard Worker     }
657*834a2baaSAndroid Build Coastguard Worker     {
658*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 30;
659*834a2baaSAndroid Build Coastguard Worker         // clang-format off
660*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
661*834a2baaSAndroid Build Coastguard Worker                 { "Hy-", 30, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
662*834a2baaSAndroid Build Coastguard Worker                 { "phe", 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
663*834a2baaSAndroid Build Coastguard Worker                 { "na-", 30, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
664*834a2baaSAndroid Build Coastguard Worker                 { "tio", 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
665*834a2baaSAndroid Build Coastguard Worker                 { "n " , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
666*834a2baaSAndroid Build Coastguard Worker                 { "is ", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
667*834a2baaSAndroid Build Coastguard Worker                 { "hy-", 30, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
668*834a2baaSAndroid Build Coastguard Worker                 { "phe", 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
669*834a2baaSAndroid Build Coastguard Worker                 { "na-", 30, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
670*834a2baaSAndroid Build Coastguard Worker                 { "tio", 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
671*834a2baaSAndroid Build Coastguard Worker                 { "n." , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
672*834a2baaSAndroid Build Coastguard Worker         };
673*834a2baaSAndroid Build Coastguard Worker         // clang-format on
674*834a2baaSAndroid Build Coastguard Worker 
675*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
676*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
677*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
678*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
679*834a2baaSAndroid Build Coastguard Worker     }
680*834a2baaSAndroid Build Coastguard Worker     {
681*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 20;
682*834a2baaSAndroid Build Coastguard Worker         // clang-format off
683*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
684*834a2baaSAndroid Build Coastguard Worker                 { "Hy" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
685*834a2baaSAndroid Build Coastguard Worker                 { "ph" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
686*834a2baaSAndroid Build Coastguard Worker                 { "en" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
687*834a2baaSAndroid Build Coastguard Worker                 { "a-" , 20, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
688*834a2baaSAndroid Build Coastguard Worker                 { "ti" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
689*834a2baaSAndroid Build Coastguard Worker                 { "on ", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
690*834a2baaSAndroid Build Coastguard Worker                 { "is ", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
691*834a2baaSAndroid Build Coastguard Worker                 { "hy" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
692*834a2baaSAndroid Build Coastguard Worker                 { "ph" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
693*834a2baaSAndroid Build Coastguard Worker                 { "en" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
694*834a2baaSAndroid Build Coastguard Worker                 { "a-" , 20, NO_START_HYPHEN, END_HYPHEN, ASCENT, DESCENT },
695*834a2baaSAndroid Build Coastguard Worker                 { "ti" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
696*834a2baaSAndroid Build Coastguard Worker                 { "on" , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
697*834a2baaSAndroid Build Coastguard Worker                 { "."  , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
698*834a2baaSAndroid Build Coastguard Worker         };
699*834a2baaSAndroid Build Coastguard Worker         // clang-format on
700*834a2baaSAndroid Build Coastguard Worker 
701*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
702*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
703*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
704*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
705*834a2baaSAndroid Build Coastguard Worker     }
706*834a2baaSAndroid Build Coastguard Worker     {
707*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 10;
708*834a2baaSAndroid Build Coastguard Worker         // clang-format off
709*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
710*834a2baaSAndroid Build Coastguard Worker                 { "H" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
711*834a2baaSAndroid Build Coastguard Worker                 { "y" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
712*834a2baaSAndroid Build Coastguard Worker                 { "p" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
713*834a2baaSAndroid Build Coastguard Worker                 { "h" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
714*834a2baaSAndroid Build Coastguard Worker                 { "e" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
715*834a2baaSAndroid Build Coastguard Worker                 { "n" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
716*834a2baaSAndroid Build Coastguard Worker                 { "a" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
717*834a2baaSAndroid Build Coastguard Worker                 { "t" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
718*834a2baaSAndroid Build Coastguard Worker                 { "i" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
719*834a2baaSAndroid Build Coastguard Worker                 { "o" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
720*834a2baaSAndroid Build Coastguard Worker                 { "n ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
721*834a2baaSAndroid Build Coastguard Worker                 { "i" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
722*834a2baaSAndroid Build Coastguard Worker                 { "s ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
723*834a2baaSAndroid Build Coastguard Worker                 { "h" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
724*834a2baaSAndroid Build Coastguard Worker                 { "y" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
725*834a2baaSAndroid Build Coastguard Worker                 { "p" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
726*834a2baaSAndroid Build Coastguard Worker                 { "h" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
727*834a2baaSAndroid Build Coastguard Worker                 { "e" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
728*834a2baaSAndroid Build Coastguard Worker                 { "n" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
729*834a2baaSAndroid Build Coastguard Worker                 { "a" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
730*834a2baaSAndroid Build Coastguard Worker                 { "t" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
731*834a2baaSAndroid Build Coastguard Worker                 { "i" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
732*834a2baaSAndroid Build Coastguard Worker                 { "o" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
733*834a2baaSAndroid Build Coastguard Worker                 { "n" , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
734*834a2baaSAndroid Build Coastguard Worker                 { "." , 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
735*834a2baaSAndroid Build Coastguard Worker         };
736*834a2baaSAndroid Build Coastguard Worker         // clang-format on
737*834a2baaSAndroid Build Coastguard Worker 
738*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
739*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
740*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
741*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
742*834a2baaSAndroid Build Coastguard Worker     }
743*834a2baaSAndroid Build Coastguard Worker }
744*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testHyphenationStartLineChange)745*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testHyphenationStartLineChange) {
746*834a2baaSAndroid Build Coastguard Worker     constexpr bool DO_HYPHEN = true;  // Do hyphenation in this test case.
747*834a2baaSAndroid Build Coastguard Worker     // "hyphenation" is hyphnated to "hy-phen-a-tion".
748*834a2baaSAndroid Build Coastguard Worker     const std::vector<uint16_t> textBuf = utf8ToUtf16("czerwono-niebieska");
749*834a2baaSAndroid Build Coastguard Worker 
750*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
751*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
752*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit START_HYPHEN = StartHyphenEdit::INSERT_HYPHEN;
753*834a2baaSAndroid Build Coastguard Worker 
754*834a2baaSAndroid Build Coastguard Worker     // Note that disable clang-format everywhere since aligned expectation is more readable.
755*834a2baaSAndroid Build Coastguard Worker     {
756*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 1000;
757*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
758*834a2baaSAndroid Build Coastguard Worker                 {"czerwono-niebieska", 180, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
759*834a2baaSAndroid Build Coastguard Worker         };
760*834a2baaSAndroid Build Coastguard Worker 
761*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, DO_HYPHEN, "pl", LINE_WIDTH);
762*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
763*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
764*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
765*834a2baaSAndroid Build Coastguard Worker     }
766*834a2baaSAndroid Build Coastguard Worker     {
767*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 180;
768*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
769*834a2baaSAndroid Build Coastguard Worker                 {"czerwono-niebieska", 180, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
770*834a2baaSAndroid Build Coastguard Worker         };
771*834a2baaSAndroid Build Coastguard Worker 
772*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, DO_HYPHEN, "pl", LINE_WIDTH);
773*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
774*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
775*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
776*834a2baaSAndroid Build Coastguard Worker     }
777*834a2baaSAndroid Build Coastguard Worker     {
778*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 130;
779*834a2baaSAndroid Build Coastguard Worker         // clang-format off
780*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
781*834a2baaSAndroid Build Coastguard Worker                 {"czerwono-" ,  90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
782*834a2baaSAndroid Build Coastguard Worker                 {"-niebieska", 100,    START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
783*834a2baaSAndroid Build Coastguard Worker         };
784*834a2baaSAndroid Build Coastguard Worker         // clang-format on
785*834a2baaSAndroid Build Coastguard Worker 
786*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, DO_HYPHEN, "pl", LINE_WIDTH);
787*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
788*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
789*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
790*834a2baaSAndroid Build Coastguard Worker     }
791*834a2baaSAndroid Build Coastguard Worker }
792*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testZeroWidthLine)793*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testZeroWidthLine) {
794*834a2baaSAndroid Build Coastguard Worker     constexpr bool DO_HYPHEN = true;  // Do hyphenation in this test case.
795*834a2baaSAndroid Build Coastguard Worker     constexpr float LINE_WIDTH = 0;
796*834a2baaSAndroid Build Coastguard Worker 
797*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
798*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
799*834a2baaSAndroid Build Coastguard Worker 
800*834a2baaSAndroid Build Coastguard Worker     {
801*834a2baaSAndroid Build Coastguard Worker         const auto textBuf = utf8ToUtf16("");
802*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {};
803*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, DO_HYPHEN, LINE_WIDTH);
804*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
805*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
806*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
807*834a2baaSAndroid Build Coastguard Worker     }
808*834a2baaSAndroid Build Coastguard Worker     {
809*834a2baaSAndroid Build Coastguard Worker         const auto textBuf = utf8ToUtf16("A");
810*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
811*834a2baaSAndroid Build Coastguard Worker                 {"A", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
812*834a2baaSAndroid Build Coastguard Worker         };
813*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, DO_HYPHEN, LINE_WIDTH);
814*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
815*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
816*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
817*834a2baaSAndroid Build Coastguard Worker     }
818*834a2baaSAndroid Build Coastguard Worker     {
819*834a2baaSAndroid Build Coastguard Worker         const auto textBuf = utf8ToUtf16("AB");
820*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
821*834a2baaSAndroid Build Coastguard Worker                 {"A", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
822*834a2baaSAndroid Build Coastguard Worker                 {"B", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
823*834a2baaSAndroid Build Coastguard Worker         };
824*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, DO_HYPHEN, LINE_WIDTH);
825*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
826*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
827*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
828*834a2baaSAndroid Build Coastguard Worker     }
829*834a2baaSAndroid Build Coastguard Worker }
830*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testZeroWidthCharacter)831*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testZeroWidthCharacter) {
832*834a2baaSAndroid Build Coastguard Worker     constexpr float CHAR_WIDTH = 0.0;
833*834a2baaSAndroid Build Coastguard Worker     constexpr bool DO_HYPHEN = true;  // Do hyphenation in this test case.
834*834a2baaSAndroid Build Coastguard Worker 
835*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
836*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
837*834a2baaSAndroid Build Coastguard Worker     {
838*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 1.0;
839*834a2baaSAndroid Build Coastguard Worker         const auto textBuf = utf8ToUtf16("This is an example text.");
840*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
841*834a2baaSAndroid Build Coastguard Worker                 {"This is an example text.", 0, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
842*834a2baaSAndroid Build Coastguard Worker         };
843*834a2baaSAndroid Build Coastguard Worker 
844*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
845*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(0, textBuf.size()), "en-US", CHAR_WIDTH, ASCENT,
846*834a2baaSAndroid Build Coastguard Worker                                           DESCENT);
847*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
848*834a2baaSAndroid Build Coastguard Worker                 textBuf, false /* compute hyphenation */, false /* compute full layout */,
849*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
850*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(LINE_WIDTH);
851*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 10);
852*834a2baaSAndroid Build Coastguard Worker         const auto actual = breakLineGreedy(textBuf, *measuredText, rectangleLineWidth, tabStops,
853*834a2baaSAndroid Build Coastguard Worker                                             DO_HYPHEN, false /* useBoundsForWidth */);
854*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
855*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
856*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
857*834a2baaSAndroid Build Coastguard Worker     }
858*834a2baaSAndroid Build Coastguard Worker     {
859*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 0.0;
860*834a2baaSAndroid Build Coastguard Worker         const auto textBuf = utf8ToUtf16("This is an example text.");
861*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
862*834a2baaSAndroid Build Coastguard Worker                 {"This is an example text.", 0, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
863*834a2baaSAndroid Build Coastguard Worker         };
864*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
865*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(0, textBuf.size()), "en-US", CHAR_WIDTH, ASCENT,
866*834a2baaSAndroid Build Coastguard Worker                                           DESCENT);
867*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
868*834a2baaSAndroid Build Coastguard Worker                 textBuf, false /* compute hyphenation */, false /* compute full layout */,
869*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
870*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(LINE_WIDTH);
871*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 10);
872*834a2baaSAndroid Build Coastguard Worker         const auto actual = breakLineGreedy(textBuf, *measuredText, rectangleLineWidth, tabStops,
873*834a2baaSAndroid Build Coastguard Worker                                             DO_HYPHEN, false /* useBoundsForWidth */);
874*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
875*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
876*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
877*834a2baaSAndroid Build Coastguard Worker     }
878*834a2baaSAndroid Build Coastguard Worker }
879*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testLocaleSwitchTest)880*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testLocaleSwitchTest) {
881*834a2baaSAndroid Build Coastguard Worker     constexpr float CHAR_WIDTH = 10.0;
882*834a2baaSAndroid Build Coastguard Worker     constexpr bool DO_HYPHEN = true;  // Do hyphenation in this test case.
883*834a2baaSAndroid Build Coastguard Worker 
884*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
885*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
886*834a2baaSAndroid Build Coastguard Worker 
887*834a2baaSAndroid Build Coastguard Worker     constexpr float LINE_WIDTH = 240;
888*834a2baaSAndroid Build Coastguard Worker     const auto textBuf = utf8ToUtf16("This is an example text.");
889*834a2baaSAndroid Build Coastguard Worker     {
890*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
891*834a2baaSAndroid Build Coastguard Worker                 {"This is an example text.", 240, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
892*834a2baaSAndroid Build Coastguard Worker         };
893*834a2baaSAndroid Build Coastguard Worker 
894*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
895*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(0, 18), "en-US", CHAR_WIDTH, ASCENT, DESCENT);
896*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(18, textBuf.size()), "en-US", CHAR_WIDTH, ASCENT,
897*834a2baaSAndroid Build Coastguard Worker                                           DESCENT);
898*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
899*834a2baaSAndroid Build Coastguard Worker                 textBuf, false /* compute hyphenation */, false /* compute full layout */,
900*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
901*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(LINE_WIDTH);
902*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 0);
903*834a2baaSAndroid Build Coastguard Worker 
904*834a2baaSAndroid Build Coastguard Worker         const auto actual = breakLineGreedy(textBuf, *measuredText, rectangleLineWidth, tabStops,
905*834a2baaSAndroid Build Coastguard Worker                                             DO_HYPHEN, false /* useBoundsForWidth */);
906*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
907*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
908*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
909*834a2baaSAndroid Build Coastguard Worker     }
910*834a2baaSAndroid Build Coastguard Worker     {
911*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
912*834a2baaSAndroid Build Coastguard Worker                 {"This is an example text.", 240, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
913*834a2baaSAndroid Build Coastguard Worker         };
914*834a2baaSAndroid Build Coastguard Worker 
915*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
916*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(0, 18), "en-US", CHAR_WIDTH, ASCENT, DESCENT);
917*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(18, textBuf.size()), "fr-FR", CHAR_WIDTH, ASCENT,
918*834a2baaSAndroid Build Coastguard Worker                                           DESCENT);
919*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
920*834a2baaSAndroid Build Coastguard Worker                 textBuf, false /* compute hyphenation */, false /* compute full layout */,
921*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
922*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(LINE_WIDTH);
923*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 0);
924*834a2baaSAndroid Build Coastguard Worker 
925*834a2baaSAndroid Build Coastguard Worker         const auto actual = breakLineGreedy(textBuf, *measuredText, rectangleLineWidth, tabStops,
926*834a2baaSAndroid Build Coastguard Worker                                             DO_HYPHEN, false /* useBoundsForWidth */);
927*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
928*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
929*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
930*834a2baaSAndroid Build Coastguard Worker     }
931*834a2baaSAndroid Build Coastguard Worker }
932*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testEmailOrUrl)933*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testEmailOrUrl) {
934*834a2baaSAndroid Build Coastguard Worker     constexpr bool DO_HYPHEN = true;  // Do hyphenation in this test case.
935*834a2baaSAndroid Build Coastguard Worker 
936*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
937*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
938*834a2baaSAndroid Build Coastguard Worker     {
939*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 240;
940*834a2baaSAndroid Build Coastguard Worker         const auto textBuf = utf8ToUtf16("This is an url: http://a.b");
941*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
942*834a2baaSAndroid Build Coastguard Worker                 {"This is an url: ", 150, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
943*834a2baaSAndroid Build Coastguard Worker                 {"http://a.b", 100, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
944*834a2baaSAndroid Build Coastguard Worker         };
945*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, DO_HYPHEN, LINE_WIDTH);
946*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
947*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
948*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
949*834a2baaSAndroid Build Coastguard Worker     }
950*834a2baaSAndroid Build Coastguard Worker     {
951*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 240;
952*834a2baaSAndroid Build Coastguard Worker         const auto textBuf = utf8ToUtf16("This is an email: [email protected]");
953*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
954*834a2baaSAndroid Build Coastguard Worker                 {"This is an email: ", 170, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
955*834a2baaSAndroid Build Coastguard Worker                 {"[email protected]", 130, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
956*834a2baaSAndroid Build Coastguard Worker         };
957*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, DO_HYPHEN, LINE_WIDTH);
958*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
959*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
960*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
961*834a2baaSAndroid Build Coastguard Worker     }
962*834a2baaSAndroid Build Coastguard Worker }
963*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testLocaleSwitch_InEmailOrUrl)964*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testLocaleSwitch_InEmailOrUrl) {
965*834a2baaSAndroid Build Coastguard Worker     constexpr float CHAR_WIDTH = 10.0;
966*834a2baaSAndroid Build Coastguard Worker     constexpr bool DO_HYPHEN = true;  // Do hyphenation in this test case.
967*834a2baaSAndroid Build Coastguard Worker 
968*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
969*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
970*834a2baaSAndroid Build Coastguard Worker 
971*834a2baaSAndroid Build Coastguard Worker     constexpr float LINE_WIDTH = 240;
972*834a2baaSAndroid Build Coastguard Worker     {
973*834a2baaSAndroid Build Coastguard Worker         const auto textBuf = utf8ToUtf16("This is an url: http://a.b");
974*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
975*834a2baaSAndroid Build Coastguard Worker                 {"This is an url: ", 150, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
976*834a2baaSAndroid Build Coastguard Worker                 {"http://a.b", 100, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
977*834a2baaSAndroid Build Coastguard Worker         };
978*834a2baaSAndroid Build Coastguard Worker 
979*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
980*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(0, 18), "en-US", CHAR_WIDTH, ASCENT, DESCENT);
981*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(18, textBuf.size()), "fr-FR", CHAR_WIDTH, ASCENT,
982*834a2baaSAndroid Build Coastguard Worker                                           DESCENT);
983*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
984*834a2baaSAndroid Build Coastguard Worker                 textBuf, false /* compute hyphenation */, false /* compute full layout */,
985*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
986*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(LINE_WIDTH);
987*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 0);
988*834a2baaSAndroid Build Coastguard Worker 
989*834a2baaSAndroid Build Coastguard Worker         const auto actual = breakLineGreedy(textBuf, *measuredText, rectangleLineWidth, tabStops,
990*834a2baaSAndroid Build Coastguard Worker                                             DO_HYPHEN, false /* useBoundsForWidth */);
991*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
992*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
993*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
994*834a2baaSAndroid Build Coastguard Worker     }
995*834a2baaSAndroid Build Coastguard Worker     {
996*834a2baaSAndroid Build Coastguard Worker         const auto textBuf = utf8ToUtf16("This is an email: [email protected]");
997*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
998*834a2baaSAndroid Build Coastguard Worker                 {"This is an email: ", 170, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
999*834a2baaSAndroid Build Coastguard Worker                 {"[email protected]", 130, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1000*834a2baaSAndroid Build Coastguard Worker         };
1001*834a2baaSAndroid Build Coastguard Worker 
1002*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
1003*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(0, 18), "en-US", CHAR_WIDTH, ASCENT, DESCENT);
1004*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(18, textBuf.size()), "fr-FR", CHAR_WIDTH, ASCENT,
1005*834a2baaSAndroid Build Coastguard Worker                                           DESCENT);
1006*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
1007*834a2baaSAndroid Build Coastguard Worker                 textBuf, false /* compute hyphenation */, false /* compute full layout */,
1008*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
1009*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(LINE_WIDTH);
1010*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 0);
1011*834a2baaSAndroid Build Coastguard Worker 
1012*834a2baaSAndroid Build Coastguard Worker         const auto actual = breakLineGreedy(textBuf, *measuredText, rectangleLineWidth, tabStops,
1013*834a2baaSAndroid Build Coastguard Worker                                             DO_HYPHEN, false /* useBoundsForWidth */);
1014*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1015*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1016*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1017*834a2baaSAndroid Build Coastguard Worker     }
1018*834a2baaSAndroid Build Coastguard Worker }
1019*834a2baaSAndroid Build Coastguard Worker 
1020*834a2baaSAndroid Build Coastguard Worker // b/68669534
TEST_F(GreedyLineBreakerTest,CrashFix_Space_Tab)1021*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, CrashFix_Space_Tab) {
1022*834a2baaSAndroid Build Coastguard Worker     constexpr float CHAR_WIDTH = 10.0;
1023*834a2baaSAndroid Build Coastguard Worker     constexpr bool DO_HYPHEN = true;  // Do hyphenation in this test case.
1024*834a2baaSAndroid Build Coastguard Worker 
1025*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
1026*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
1027*834a2baaSAndroid Build Coastguard Worker     {
1028*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 50;
1029*834a2baaSAndroid Build Coastguard Worker         const auto textBuf = utf8ToUtf16("a \tb");
1030*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1031*834a2baaSAndroid Build Coastguard Worker                 {"a \tb", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1032*834a2baaSAndroid Build Coastguard Worker         };
1033*834a2baaSAndroid Build Coastguard Worker 
1034*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
1035*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(0, textBuf.size()), "en-US", CHAR_WIDTH, ASCENT,
1036*834a2baaSAndroid Build Coastguard Worker                                           DESCENT);
1037*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
1038*834a2baaSAndroid Build Coastguard Worker                 textBuf, false /* compute hyphenation */, false /* compute full layout */,
1039*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
1040*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(LINE_WIDTH);
1041*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, CHAR_WIDTH);
1042*834a2baaSAndroid Build Coastguard Worker 
1043*834a2baaSAndroid Build Coastguard Worker         const auto actual = breakLineGreedy(textBuf, *measuredText, rectangleLineWidth, tabStops,
1044*834a2baaSAndroid Build Coastguard Worker                                             DO_HYPHEN, false /* useBoundsForWidth */);
1045*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1046*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1047*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1048*834a2baaSAndroid Build Coastguard Worker     }
1049*834a2baaSAndroid Build Coastguard Worker }
1050*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,ExtentTest)1051*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, ExtentTest) {
1052*834a2baaSAndroid Build Coastguard Worker     constexpr bool NO_HYPHEN = false;  // No hyphenation in this test case.
1053*834a2baaSAndroid Build Coastguard Worker     const std::vector<uint16_t> textBuf = utf8ToUtf16("The \u3042\u3044\u3046 is Japanese.");
1054*834a2baaSAndroid Build Coastguard Worker 
1055*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
1056*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
1057*834a2baaSAndroid Build Coastguard Worker     {
1058*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 1000;
1059*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1060*834a2baaSAndroid Build Coastguard Worker                 {"The \u3042\u3044\u3046 is Japanese.", 200, NO_START_HYPHEN, NO_END_HYPHEN,
1061*834a2baaSAndroid Build Coastguard Worker                  CUSTOM_ASCENT, CUSTOM_DESCENT},
1062*834a2baaSAndroid Build Coastguard Worker         };
1063*834a2baaSAndroid Build Coastguard Worker 
1064*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
1065*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1066*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1067*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1068*834a2baaSAndroid Build Coastguard Worker     }
1069*834a2baaSAndroid Build Coastguard Worker     {
1070*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 200;
1071*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1072*834a2baaSAndroid Build Coastguard Worker                 {"The \u3042\u3044\u3046 is Japanese.", 200, NO_START_HYPHEN, NO_END_HYPHEN,
1073*834a2baaSAndroid Build Coastguard Worker                  CUSTOM_ASCENT, CUSTOM_DESCENT},
1074*834a2baaSAndroid Build Coastguard Worker         };
1075*834a2baaSAndroid Build Coastguard Worker 
1076*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
1077*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1078*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1079*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1080*834a2baaSAndroid Build Coastguard Worker     }
1081*834a2baaSAndroid Build Coastguard Worker     {
1082*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 190;
1083*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1084*834a2baaSAndroid Build Coastguard Worker                 {"The \u3042\u3044\u3046 is ", 100, NO_START_HYPHEN, NO_END_HYPHEN, CUSTOM_ASCENT,
1085*834a2baaSAndroid Build Coastguard Worker                  CUSTOM_DESCENT},
1086*834a2baaSAndroid Build Coastguard Worker                 {"Japanese.", 90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1087*834a2baaSAndroid Build Coastguard Worker         };
1088*834a2baaSAndroid Build Coastguard Worker 
1089*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
1090*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1091*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1092*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1093*834a2baaSAndroid Build Coastguard Worker     }
1094*834a2baaSAndroid Build Coastguard Worker     {
1095*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 90;
1096*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1097*834a2baaSAndroid Build Coastguard Worker                 {"The \u3042\u3044\u3046 ", 70, NO_START_HYPHEN, NO_END_HYPHEN, CUSTOM_ASCENT,
1098*834a2baaSAndroid Build Coastguard Worker                  CUSTOM_DESCENT},
1099*834a2baaSAndroid Build Coastguard Worker                 {"is ", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1100*834a2baaSAndroid Build Coastguard Worker                 {"Japanese.", 90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1101*834a2baaSAndroid Build Coastguard Worker         };
1102*834a2baaSAndroid Build Coastguard Worker 
1103*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
1104*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1105*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1106*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1107*834a2baaSAndroid Build Coastguard Worker     }
1108*834a2baaSAndroid Build Coastguard Worker     {
1109*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 50;
1110*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1111*834a2baaSAndroid Build Coastguard Worker                 {"The \u3042", 50, NO_START_HYPHEN, NO_END_HYPHEN, CUSTOM_ASCENT, CUSTOM_DESCENT},
1112*834a2baaSAndroid Build Coastguard Worker                 {"\u3044\u3046 is ", 50, NO_START_HYPHEN, NO_END_HYPHEN, CUSTOM_ASCENT,
1113*834a2baaSAndroid Build Coastguard Worker                  CUSTOM_DESCENT},
1114*834a2baaSAndroid Build Coastguard Worker                 {"Japan", 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1115*834a2baaSAndroid Build Coastguard Worker                 {"ese.", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1116*834a2baaSAndroid Build Coastguard Worker         };
1117*834a2baaSAndroid Build Coastguard Worker 
1118*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
1119*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1120*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1121*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1122*834a2baaSAndroid Build Coastguard Worker     }
1123*834a2baaSAndroid Build Coastguard Worker     {
1124*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 40;
1125*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1126*834a2baaSAndroid Build Coastguard Worker                 {"The ", 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1127*834a2baaSAndroid Build Coastguard Worker                 {"\u3042\u3044\u3046 ", 30, NO_START_HYPHEN, NO_END_HYPHEN, CUSTOM_ASCENT,
1128*834a2baaSAndroid Build Coastguard Worker                  CUSTOM_DESCENT},
1129*834a2baaSAndroid Build Coastguard Worker                 {"is ", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1130*834a2baaSAndroid Build Coastguard Worker                 {"Japa", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1131*834a2baaSAndroid Build Coastguard Worker                 {"nese", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1132*834a2baaSAndroid Build Coastguard Worker                 {".", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1133*834a2baaSAndroid Build Coastguard Worker         };
1134*834a2baaSAndroid Build Coastguard Worker 
1135*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
1136*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1137*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1138*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1139*834a2baaSAndroid Build Coastguard Worker     }
1140*834a2baaSAndroid Build Coastguard Worker     {
1141*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 20;
1142*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1143*834a2baaSAndroid Build Coastguard Worker                 {"Th", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1144*834a2baaSAndroid Build Coastguard Worker                 {"e ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1145*834a2baaSAndroid Build Coastguard Worker                 {"\u3042\u3044", 20, NO_START_HYPHEN, NO_END_HYPHEN, CUSTOM_ASCENT, CUSTOM_DESCENT},
1146*834a2baaSAndroid Build Coastguard Worker                 {"\u3046 ", 10, NO_START_HYPHEN, NO_END_HYPHEN, CUSTOM_ASCENT, CUSTOM_DESCENT},
1147*834a2baaSAndroid Build Coastguard Worker                 {"is ", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1148*834a2baaSAndroid Build Coastguard Worker                 {"Ja", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1149*834a2baaSAndroid Build Coastguard Worker                 {"pa", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1150*834a2baaSAndroid Build Coastguard Worker                 {"ne", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1151*834a2baaSAndroid Build Coastguard Worker                 {"se", 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1152*834a2baaSAndroid Build Coastguard Worker                 {".", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1153*834a2baaSAndroid Build Coastguard Worker         };
1154*834a2baaSAndroid Build Coastguard Worker 
1155*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
1156*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1157*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1158*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1159*834a2baaSAndroid Build Coastguard Worker     }
1160*834a2baaSAndroid Build Coastguard Worker     {
1161*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 10;
1162*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1163*834a2baaSAndroid Build Coastguard Worker                 {"T", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1164*834a2baaSAndroid Build Coastguard Worker                 {"h", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1165*834a2baaSAndroid Build Coastguard Worker                 {"e ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1166*834a2baaSAndroid Build Coastguard Worker                 {"\u3042", 10, NO_START_HYPHEN, NO_END_HYPHEN, CUSTOM_ASCENT, CUSTOM_DESCENT},
1167*834a2baaSAndroid Build Coastguard Worker                 {"\u3044", 10, NO_START_HYPHEN, NO_END_HYPHEN, CUSTOM_ASCENT, CUSTOM_DESCENT},
1168*834a2baaSAndroid Build Coastguard Worker                 {"\u3046 ", 10, NO_START_HYPHEN, NO_END_HYPHEN, CUSTOM_ASCENT, CUSTOM_DESCENT},
1169*834a2baaSAndroid Build Coastguard Worker                 {"i", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1170*834a2baaSAndroid Build Coastguard Worker                 {"s ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1171*834a2baaSAndroid Build Coastguard Worker                 {"J", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1172*834a2baaSAndroid Build Coastguard Worker                 {"a", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1173*834a2baaSAndroid Build Coastguard Worker                 {"p", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1174*834a2baaSAndroid Build Coastguard Worker                 {"a", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1175*834a2baaSAndroid Build Coastguard Worker                 {"n", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1176*834a2baaSAndroid Build Coastguard Worker                 {"e", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1177*834a2baaSAndroid Build Coastguard Worker                 {"s", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1178*834a2baaSAndroid Build Coastguard Worker                 {"e", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1179*834a2baaSAndroid Build Coastguard Worker                 {".", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1180*834a2baaSAndroid Build Coastguard Worker         };
1181*834a2baaSAndroid Build Coastguard Worker 
1182*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
1183*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1184*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1185*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1186*834a2baaSAndroid Build Coastguard Worker     }
1187*834a2baaSAndroid Build Coastguard Worker }
1188*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testReplacementSpanNotBreakTest_SingleChar)1189*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testReplacementSpanNotBreakTest_SingleChar) {
1190*834a2baaSAndroid Build Coastguard Worker     constexpr float CHAR_WIDTH = 10.0;
1191*834a2baaSAndroid Build Coastguard Worker     constexpr bool DO_HYPHEN = true;  // Do hyphenation in this test case.
1192*834a2baaSAndroid Build Coastguard Worker 
1193*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
1194*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
1195*834a2baaSAndroid Build Coastguard Worker 
1196*834a2baaSAndroid Build Coastguard Worker     const auto textBuf = utf8ToUtf16("This is an example \u2639 text.");
1197*834a2baaSAndroid Build Coastguard Worker 
1198*834a2baaSAndroid Build Coastguard Worker     // In this test case, assign a replacement run for "U+2639" with 5 times of CHAR_WIDTH.
1199*834a2baaSAndroid Build Coastguard Worker     auto doLineBreak = [=](float width) {
1200*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
1201*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(0, 19), "en-US", CHAR_WIDTH, ASCENT, DESCENT);
1202*834a2baaSAndroid Build Coastguard Worker         builder.addReplacementRun(19, 20, 5 * CHAR_WIDTH, LocaleListCache::getId("en-US"));
1203*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(20, textBuf.size()), "en-US", CHAR_WIDTH, ASCENT,
1204*834a2baaSAndroid Build Coastguard Worker                                           DESCENT);
1205*834a2baaSAndroid Build Coastguard Worker 
1206*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
1207*834a2baaSAndroid Build Coastguard Worker                 textBuf, false /* compute hyphenation */, false /* compute full layout */,
1208*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
1209*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(width);
1210*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 0);
1211*834a2baaSAndroid Build Coastguard Worker         return breakLineGreedy(textBuf, *measuredText, rectangleLineWidth, tabStops, DO_HYPHEN,
1212*834a2baaSAndroid Build Coastguard Worker                                false /* useBoundsForWidth */);
1213*834a2baaSAndroid Build Coastguard Worker     };
1214*834a2baaSAndroid Build Coastguard Worker 
1215*834a2baaSAndroid Build Coastguard Worker     {
1216*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
1217*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1218*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1219*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1220*834a2baaSAndroid Build Coastguard Worker                 {"This is an ",   100, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1221*834a2baaSAndroid Build Coastguard Worker                 {"example ",       70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1222*834a2baaSAndroid Build Coastguard Worker                 {"\u2639 ",        50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1223*834a2baaSAndroid Build Coastguard Worker                 {"text.",          50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1224*834a2baaSAndroid Build Coastguard Worker         };
1225*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1226*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1227*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1228*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1229*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1230*834a2baaSAndroid Build Coastguard Worker     }
1231*834a2baaSAndroid Build Coastguard Worker     {
1232*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 90;
1233*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1234*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1235*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1236*834a2baaSAndroid Build Coastguard Worker                 {"This is ", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1237*834a2baaSAndroid Build Coastguard Worker                 {"an ",      20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1238*834a2baaSAndroid Build Coastguard Worker                 {"example ", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1239*834a2baaSAndroid Build Coastguard Worker                 {"\u2639 ",  50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1240*834a2baaSAndroid Build Coastguard Worker                 {"text.",    50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1241*834a2baaSAndroid Build Coastguard Worker         };
1242*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1243*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1244*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1245*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1246*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1247*834a2baaSAndroid Build Coastguard Worker     }
1248*834a2baaSAndroid Build Coastguard Worker     {
1249*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 10;
1250*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1251*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1252*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1253*834a2baaSAndroid Build Coastguard Worker                 {"T",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1254*834a2baaSAndroid Build Coastguard Worker                 {"h",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1255*834a2baaSAndroid Build Coastguard Worker                 {"i",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1256*834a2baaSAndroid Build Coastguard Worker                 {"s ",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1257*834a2baaSAndroid Build Coastguard Worker                 {"i",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1258*834a2baaSAndroid Build Coastguard Worker                 {"s ",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1259*834a2baaSAndroid Build Coastguard Worker                 {"a",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1260*834a2baaSAndroid Build Coastguard Worker                 {"n ",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1261*834a2baaSAndroid Build Coastguard Worker                 {"e",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1262*834a2baaSAndroid Build Coastguard Worker                 {"x",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1263*834a2baaSAndroid Build Coastguard Worker                 {"a",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1264*834a2baaSAndroid Build Coastguard Worker                 {"m",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1265*834a2baaSAndroid Build Coastguard Worker                 {"p",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1266*834a2baaSAndroid Build Coastguard Worker                 {"l",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1267*834a2baaSAndroid Build Coastguard Worker                 {"e ",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1268*834a2baaSAndroid Build Coastguard Worker                 // TODO: This should be "\u2639 " since should not count the trailing line end space
1269*834a2baaSAndroid Build Coastguard Worker                 {"\u2639", 50, NO_START_HYPHEN, NO_END_HYPHEN,      0,       0},
1270*834a2baaSAndroid Build Coastguard Worker                 {" ",       0, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1271*834a2baaSAndroid Build Coastguard Worker                 {"t",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1272*834a2baaSAndroid Build Coastguard Worker                 {"e",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1273*834a2baaSAndroid Build Coastguard Worker                 {"x",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1274*834a2baaSAndroid Build Coastguard Worker                 {"t",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1275*834a2baaSAndroid Build Coastguard Worker                 {".",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1276*834a2baaSAndroid Build Coastguard Worker         };
1277*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1278*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1279*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1280*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1281*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1282*834a2baaSAndroid Build Coastguard Worker     }
1283*834a2baaSAndroid Build Coastguard Worker }
1284*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testReplacementSpanNotBreakTest_MultipleChars)1285*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testReplacementSpanNotBreakTest_MultipleChars) {
1286*834a2baaSAndroid Build Coastguard Worker     constexpr float CHAR_WIDTH = 10.0;
1287*834a2baaSAndroid Build Coastguard Worker     constexpr bool DO_HYPHEN = true;  // Do hyphenation in this test case.
1288*834a2baaSAndroid Build Coastguard Worker 
1289*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
1290*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
1291*834a2baaSAndroid Build Coastguard Worker 
1292*834a2baaSAndroid Build Coastguard Worker     const auto textBuf = utf8ToUtf16("This is an example text.");
1293*834a2baaSAndroid Build Coastguard Worker 
1294*834a2baaSAndroid Build Coastguard Worker     // In this test case, assign a replacement run for "is an " with 5 times of CHAR_WIDTH.
1295*834a2baaSAndroid Build Coastguard Worker     auto doLineBreak = [=](float width) {
1296*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
1297*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(0, 5), "en-US", CHAR_WIDTH, ASCENT, DESCENT);
1298*834a2baaSAndroid Build Coastguard Worker         builder.addReplacementRun(5, 11, 5 * CHAR_WIDTH, LocaleListCache::getId("en-US"));
1299*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(11, textBuf.size()), "en-US", CHAR_WIDTH, ASCENT,
1300*834a2baaSAndroid Build Coastguard Worker                                           DESCENT);
1301*834a2baaSAndroid Build Coastguard Worker 
1302*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
1303*834a2baaSAndroid Build Coastguard Worker                 textBuf, false /* compute hyphenation */, false /* compute full layout */,
1304*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
1305*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(width);
1306*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 0);
1307*834a2baaSAndroid Build Coastguard Worker         return breakLineGreedy(textBuf, *measuredText, rectangleLineWidth, tabStops, DO_HYPHEN,
1308*834a2baaSAndroid Build Coastguard Worker                                false /* useBoundsForWidth */);
1309*834a2baaSAndroid Build Coastguard Worker     };
1310*834a2baaSAndroid Build Coastguard Worker 
1311*834a2baaSAndroid Build Coastguard Worker     {
1312*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
1313*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1314*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1315*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1316*834a2baaSAndroid Build Coastguard Worker                 {"This is an ",   100, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1317*834a2baaSAndroid Build Coastguard Worker                 {"example ",       70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1318*834a2baaSAndroid Build Coastguard Worker                 {"text.",          50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1319*834a2baaSAndroid Build Coastguard Worker         };
1320*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1321*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1322*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1323*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1324*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1325*834a2baaSAndroid Build Coastguard Worker     }
1326*834a2baaSAndroid Build Coastguard Worker     {
1327*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 90;
1328*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1329*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1330*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1331*834a2baaSAndroid Build Coastguard Worker                 {"This ",   40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1332*834a2baaSAndroid Build Coastguard Worker                 {"is an ",  50, NO_START_HYPHEN, NO_END_HYPHEN,      0,       0},
1333*834a2baaSAndroid Build Coastguard Worker                 {"example ",70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1334*834a2baaSAndroid Build Coastguard Worker                 {"text.",   50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1335*834a2baaSAndroid Build Coastguard Worker         };
1336*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1337*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1338*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1339*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1340*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1341*834a2baaSAndroid Build Coastguard Worker     }
1342*834a2baaSAndroid Build Coastguard Worker     {
1343*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 10;
1344*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1345*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1346*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1347*834a2baaSAndroid Build Coastguard Worker                 {"T",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1348*834a2baaSAndroid Build Coastguard Worker                 {"h",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1349*834a2baaSAndroid Build Coastguard Worker                 {"i",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1350*834a2baaSAndroid Build Coastguard Worker                 {"s ",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1351*834a2baaSAndroid Build Coastguard Worker                 {"is an ", 50, NO_START_HYPHEN, NO_END_HYPHEN,      0,       0},
1352*834a2baaSAndroid Build Coastguard Worker                 {"e",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1353*834a2baaSAndroid Build Coastguard Worker                 {"x",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1354*834a2baaSAndroid Build Coastguard Worker                 {"a",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1355*834a2baaSAndroid Build Coastguard Worker                 {"m",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1356*834a2baaSAndroid Build Coastguard Worker                 {"p",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1357*834a2baaSAndroid Build Coastguard Worker                 {"l",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1358*834a2baaSAndroid Build Coastguard Worker                 {"e ",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1359*834a2baaSAndroid Build Coastguard Worker                 {"t",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1360*834a2baaSAndroid Build Coastguard Worker                 {"e",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1361*834a2baaSAndroid Build Coastguard Worker                 {"x",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1362*834a2baaSAndroid Build Coastguard Worker                 {"t",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1363*834a2baaSAndroid Build Coastguard Worker                 {".",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1364*834a2baaSAndroid Build Coastguard Worker         };
1365*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1366*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1367*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1368*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1369*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1370*834a2baaSAndroid Build Coastguard Worker     }
1371*834a2baaSAndroid Build Coastguard Worker }
1372*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testReplacementSpanNotBreakTest_CJK)1373*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testReplacementSpanNotBreakTest_CJK) {
1374*834a2baaSAndroid Build Coastguard Worker     constexpr float CHAR_WIDTH = 10.0;
1375*834a2baaSAndroid Build Coastguard Worker     constexpr bool DO_HYPHEN = true;  // Do hyphenation in this test case.
1376*834a2baaSAndroid Build Coastguard Worker 
1377*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
1378*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
1379*834a2baaSAndroid Build Coastguard Worker 
1380*834a2baaSAndroid Build Coastguard Worker     // Example string: "Today is a sunny day." in Japanese.
1381*834a2baaSAndroid Build Coastguard Worker     const auto textBuf = utf8ToUtf16("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A");
1382*834a2baaSAndroid Build Coastguard Worker 
1383*834a2baaSAndroid Build Coastguard Worker     // In this test case, assign a replacement run for "\u6674\u5929" with 5 times of CHAR_WIDTH.
1384*834a2baaSAndroid Build Coastguard Worker     auto doLineBreak = [=](float width) {
1385*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
1386*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(0, 3), "ja-JP", CHAR_WIDTH, ASCENT, DESCENT);
1387*834a2baaSAndroid Build Coastguard Worker         builder.addReplacementRun(3, 5, 5 * CHAR_WIDTH, LocaleListCache::getId("ja-JP"));
1388*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(5, textBuf.size()), "ja-JP", CHAR_WIDTH, ASCENT,
1389*834a2baaSAndroid Build Coastguard Worker                                           DESCENT);
1390*834a2baaSAndroid Build Coastguard Worker 
1391*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
1392*834a2baaSAndroid Build Coastguard Worker                 textBuf, false /* compute hyphenation */, false /* compute full layout */,
1393*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
1394*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(width);
1395*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 0);
1396*834a2baaSAndroid Build Coastguard Worker         return breakLineGreedy(textBuf, *measuredText, rectangleLineWidth, tabStops, DO_HYPHEN,
1397*834a2baaSAndroid Build Coastguard Worker                                false /* useBoundsForWidth */);
1398*834a2baaSAndroid Build Coastguard Worker     };
1399*834a2baaSAndroid Build Coastguard Worker 
1400*834a2baaSAndroid Build Coastguard Worker     {
1401*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
1402*834a2baaSAndroid Build Coastguard Worker         // "\u6674\u5929" is a single replacement span. Do not break.
1403*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1404*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1405*834a2baaSAndroid Build Coastguard Worker                 {"\u672C\u65E5\u306F\u6674\u5929\u306A\u308A",
1406*834a2baaSAndroid Build Coastguard Worker                   100, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1407*834a2baaSAndroid Build Coastguard Worker         };
1408*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1409*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1410*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1411*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1412*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1413*834a2baaSAndroid Build Coastguard Worker     }
1414*834a2baaSAndroid Build Coastguard Worker     {
1415*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 90;
1416*834a2baaSAndroid Build Coastguard Worker         // "\u6674\u5929" is a single replacement span. Do not break.
1417*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1418*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1419*834a2baaSAndroid Build Coastguard Worker                 {"\u672C\u65E5\u306F\u6674\u5929\u306A",
1420*834a2baaSAndroid Build Coastguard Worker                   90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1421*834a2baaSAndroid Build Coastguard Worker                 {"\u308A",
1422*834a2baaSAndroid Build Coastguard Worker                   10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1423*834a2baaSAndroid Build Coastguard Worker         };
1424*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1425*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1426*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1427*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1428*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1429*834a2baaSAndroid Build Coastguard Worker     }
1430*834a2baaSAndroid Build Coastguard Worker     {
1431*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 80;
1432*834a2baaSAndroid Build Coastguard Worker         // "\u6674\u5929" is a single replacement span. Do not break.
1433*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1434*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1435*834a2baaSAndroid Build Coastguard Worker                 {"\u672C\u65E5\u306F\u6674\u5929",
1436*834a2baaSAndroid Build Coastguard Worker                   80, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1437*834a2baaSAndroid Build Coastguard Worker                 {"\u306A\u308A",
1438*834a2baaSAndroid Build Coastguard Worker                   20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1439*834a2baaSAndroid Build Coastguard Worker         };
1440*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1441*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1442*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1443*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1444*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1445*834a2baaSAndroid Build Coastguard Worker     }
1446*834a2baaSAndroid Build Coastguard Worker     {
1447*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 70;
1448*834a2baaSAndroid Build Coastguard Worker         // "\u6674\u5929" is a single replacement span. Do not break.
1449*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1450*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1451*834a2baaSAndroid Build Coastguard Worker                 {"\u672C\u65E5\u306F", 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1452*834a2baaSAndroid Build Coastguard Worker                 {"\u6674\u5929\u306A\u308A", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1453*834a2baaSAndroid Build Coastguard Worker         };
1454*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1455*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1456*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1457*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1458*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1459*834a2baaSAndroid Build Coastguard Worker     }
1460*834a2baaSAndroid Build Coastguard Worker     {
1461*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 60;
1462*834a2baaSAndroid Build Coastguard Worker         // "\u6674\u5929" is a single replacement span. Do not break.
1463*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1464*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1465*834a2baaSAndroid Build Coastguard Worker                 {"\u672C\u65E5\u306F", 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1466*834a2baaSAndroid Build Coastguard Worker                 {"\u6674\u5929\u306A", 60, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1467*834a2baaSAndroid Build Coastguard Worker                 {"\u308A",             10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1468*834a2baaSAndroid Build Coastguard Worker         };
1469*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1470*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1471*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1472*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1473*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1474*834a2baaSAndroid Build Coastguard Worker     }
1475*834a2baaSAndroid Build Coastguard Worker     {
1476*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 50;
1477*834a2baaSAndroid Build Coastguard Worker         // "\u6674\u5929" is a single replacement span. Do not break.
1478*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1479*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1480*834a2baaSAndroid Build Coastguard Worker                 {"\u672C\u65E5\u306F", 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1481*834a2baaSAndroid Build Coastguard Worker                 {"\u6674\u5929",       50, NO_START_HYPHEN, NO_END_HYPHEN,      0,       0},
1482*834a2baaSAndroid Build Coastguard Worker                 {"\u306A\u308A",       20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1483*834a2baaSAndroid Build Coastguard Worker         };
1484*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1485*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1486*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1487*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1488*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1489*834a2baaSAndroid Build Coastguard Worker     }
1490*834a2baaSAndroid Build Coastguard Worker     {
1491*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 40;
1492*834a2baaSAndroid Build Coastguard Worker         // "\u6674\u5929" is a single replacement span. Do not break.
1493*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1494*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1495*834a2baaSAndroid Build Coastguard Worker                 {"\u672C\u65E5\u306F", 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1496*834a2baaSAndroid Build Coastguard Worker                 {"\u6674\u5929",       50, NO_START_HYPHEN, NO_END_HYPHEN,      0,       0},
1497*834a2baaSAndroid Build Coastguard Worker                 {"\u306A\u308A",       20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1498*834a2baaSAndroid Build Coastguard Worker         };
1499*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1500*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1501*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1502*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1503*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1504*834a2baaSAndroid Build Coastguard Worker     }
1505*834a2baaSAndroid Build Coastguard Worker     {
1506*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 10;
1507*834a2baaSAndroid Build Coastguard Worker         // "\u6674\u5929" is a single replacement span. Do not break.
1508*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1509*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1510*834a2baaSAndroid Build Coastguard Worker                 {"\u672C",       10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1511*834a2baaSAndroid Build Coastguard Worker                 {"\u65E5",       10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1512*834a2baaSAndroid Build Coastguard Worker                 {"\u306F",       10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1513*834a2baaSAndroid Build Coastguard Worker                 {"\u6674\u5929", 50, NO_START_HYPHEN, NO_END_HYPHEN,      0,       0},
1514*834a2baaSAndroid Build Coastguard Worker                 {"\u306A",       10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1515*834a2baaSAndroid Build Coastguard Worker                 {"\u308A",       10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1516*834a2baaSAndroid Build Coastguard Worker         };
1517*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1518*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1519*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1520*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1521*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1522*834a2baaSAndroid Build Coastguard Worker     }
1523*834a2baaSAndroid Build Coastguard Worker }
1524*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testReplacementSpanNotBreakTest_with_punctuation)1525*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testReplacementSpanNotBreakTest_with_punctuation) {
1526*834a2baaSAndroid Build Coastguard Worker     constexpr float CHAR_WIDTH = 10.0;
1527*834a2baaSAndroid Build Coastguard Worker     constexpr bool DO_HYPHEN = true;  // Do hyphenation in this test case.
1528*834a2baaSAndroid Build Coastguard Worker 
1529*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
1530*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit END_HYPHEN = EndHyphenEdit::INSERT_HYPHEN;
1531*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
1532*834a2baaSAndroid Build Coastguard Worker 
1533*834a2baaSAndroid Build Coastguard Worker     const auto textBuf = utf8ToUtf16("This (is an) example text.");
1534*834a2baaSAndroid Build Coastguard Worker 
1535*834a2baaSAndroid Build Coastguard Worker     // In this test case, assign a replacement run for "U+2639" with 5 times of CHAR_WIDTH.
1536*834a2baaSAndroid Build Coastguard Worker     auto doLineBreak = [=](float width) {
1537*834a2baaSAndroid Build Coastguard Worker         MeasuredTextBuilder builder;
1538*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(0, 6), "en-US", CHAR_WIDTH, ASCENT, DESCENT);
1539*834a2baaSAndroid Build Coastguard Worker         builder.addReplacementRun(6, 11, 5 * CHAR_WIDTH, LocaleListCache::getId("en-US"));
1540*834a2baaSAndroid Build Coastguard Worker         builder.addCustomRun<ConstantRun>(Range(11, textBuf.size()), "en-US", CHAR_WIDTH, ASCENT,
1541*834a2baaSAndroid Build Coastguard Worker                                           DESCENT);
1542*834a2baaSAndroid Build Coastguard Worker 
1543*834a2baaSAndroid Build Coastguard Worker         std::unique_ptr<MeasuredText> measuredText = builder.build(
1544*834a2baaSAndroid Build Coastguard Worker                 textBuf, false /* compute hyphenation */, false /* compute full layout */,
1545*834a2baaSAndroid Build Coastguard Worker                 false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
1546*834a2baaSAndroid Build Coastguard Worker         RectangleLineWidth rectangleLineWidth(width);
1547*834a2baaSAndroid Build Coastguard Worker         TabStops tabStops(nullptr, 0, 0);
1548*834a2baaSAndroid Build Coastguard Worker         return breakLineGreedy(textBuf, *measuredText, rectangleLineWidth, tabStops, DO_HYPHEN,
1549*834a2baaSAndroid Build Coastguard Worker                                false /* useBoundsForWidth */);
1550*834a2baaSAndroid Build Coastguard Worker     };
1551*834a2baaSAndroid Build Coastguard Worker 
1552*834a2baaSAndroid Build Coastguard Worker     {
1553*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 1000;
1554*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1555*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1556*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1557*834a2baaSAndroid Build Coastguard Worker                 {"This (is an) example text.",
1558*834a2baaSAndroid Build Coastguard Worker                   260, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1559*834a2baaSAndroid Build Coastguard Worker         };
1560*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1561*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1562*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1563*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1564*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1565*834a2baaSAndroid Build Coastguard Worker     }
1566*834a2baaSAndroid Build Coastguard Worker     {
1567*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 250;
1568*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1569*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1570*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1571*834a2baaSAndroid Build Coastguard Worker                 {"This (is an) example ", 200, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1572*834a2baaSAndroid Build Coastguard Worker                 {"text.",                  50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1573*834a2baaSAndroid Build Coastguard Worker         };
1574*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1575*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1576*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1577*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1578*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1579*834a2baaSAndroid Build Coastguard Worker     }
1580*834a2baaSAndroid Build Coastguard Worker     {
1581*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 190;
1582*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1583*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1584*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1585*834a2baaSAndroid Build Coastguard Worker                 {"This (is an) ", 120, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1586*834a2baaSAndroid Build Coastguard Worker                 {"example text.", 130, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1587*834a2baaSAndroid Build Coastguard Worker         };
1588*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1589*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1590*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1591*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1592*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1593*834a2baaSAndroid Build Coastguard Worker     }
1594*834a2baaSAndroid Build Coastguard Worker     {
1595*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 120;
1596*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1597*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1598*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1599*834a2baaSAndroid Build Coastguard Worker                 {"This (is an) ", 120, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1600*834a2baaSAndroid Build Coastguard Worker                 {"example ",       70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1601*834a2baaSAndroid Build Coastguard Worker                 {"text.",          50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1602*834a2baaSAndroid Build Coastguard Worker         };
1603*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1604*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1605*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1606*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1607*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1608*834a2baaSAndroid Build Coastguard Worker     }
1609*834a2baaSAndroid Build Coastguard Worker     {
1610*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 110;
1611*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1612*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1613*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1614*834a2baaSAndroid Build Coastguard Worker                 {"This ",    40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1615*834a2baaSAndroid Build Coastguard Worker                 {"(is an) ", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1616*834a2baaSAndroid Build Coastguard Worker                 {"example ", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1617*834a2baaSAndroid Build Coastguard Worker                 {"text.",    50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1618*834a2baaSAndroid Build Coastguard Worker         };
1619*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1620*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1621*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1622*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1623*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1624*834a2baaSAndroid Build Coastguard Worker     }
1625*834a2baaSAndroid Build Coastguard Worker     {
1626*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 60;
1627*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1628*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1629*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1630*834a2baaSAndroid Build Coastguard Worker                 {"This ",  40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1631*834a2baaSAndroid Build Coastguard Worker                 {"(is an", 60, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1632*834a2baaSAndroid Build Coastguard Worker                 {") ",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1633*834a2baaSAndroid Build Coastguard Worker                 {"exam-",  50, NO_START_HYPHEN,    END_HYPHEN, ASCENT, DESCENT},
1634*834a2baaSAndroid Build Coastguard Worker                 {"ple ",   30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1635*834a2baaSAndroid Build Coastguard Worker                 {"text.",  50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1636*834a2baaSAndroid Build Coastguard Worker         };
1637*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1638*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1639*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1640*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1641*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1642*834a2baaSAndroid Build Coastguard Worker     }
1643*834a2baaSAndroid Build Coastguard Worker     {
1644*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 50;
1645*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1646*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1647*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1648*834a2baaSAndroid Build Coastguard Worker                 {"This ",  40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1649*834a2baaSAndroid Build Coastguard Worker                 {"(",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1650*834a2baaSAndroid Build Coastguard Worker                 {"is an",  50, NO_START_HYPHEN, NO_END_HYPHEN,      0,       0},
1651*834a2baaSAndroid Build Coastguard Worker                 {") ",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1652*834a2baaSAndroid Build Coastguard Worker                 {"exam-",  50, NO_START_HYPHEN,    END_HYPHEN, ASCENT, DESCENT},
1653*834a2baaSAndroid Build Coastguard Worker                 {"ple ",   30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1654*834a2baaSAndroid Build Coastguard Worker                 {"text.",  50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1655*834a2baaSAndroid Build Coastguard Worker         };
1656*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1657*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1658*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1659*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1660*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1661*834a2baaSAndroid Build Coastguard Worker     }
1662*834a2baaSAndroid Build Coastguard Worker     {
1663*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 40;
1664*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1665*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1666*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1667*834a2baaSAndroid Build Coastguard Worker                 {"This ", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1668*834a2baaSAndroid Build Coastguard Worker                 {"(",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1669*834a2baaSAndroid Build Coastguard Worker                 {"is an", 50, NO_START_HYPHEN, NO_END_HYPHEN,      0,       0},
1670*834a2baaSAndroid Build Coastguard Worker                 {") ",    10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1671*834a2baaSAndroid Build Coastguard Worker                 {"ex-",   30, NO_START_HYPHEN,    END_HYPHEN, ASCENT, DESCENT},
1672*834a2baaSAndroid Build Coastguard Worker                 {"am-",   30, NO_START_HYPHEN,    END_HYPHEN, ASCENT, DESCENT},
1673*834a2baaSAndroid Build Coastguard Worker                 {"ple ",  30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1674*834a2baaSAndroid Build Coastguard Worker                 {"text",  40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1675*834a2baaSAndroid Build Coastguard Worker                 {".",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1676*834a2baaSAndroid Build Coastguard Worker         };
1677*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1678*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1679*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1680*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1681*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1682*834a2baaSAndroid Build Coastguard Worker     }
1683*834a2baaSAndroid Build Coastguard Worker     {
1684*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 10;
1685*834a2baaSAndroid Build Coastguard Worker         // "is an" is a single replacement span. Do not break.
1686*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1687*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1688*834a2baaSAndroid Build Coastguard Worker                 {"T",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1689*834a2baaSAndroid Build Coastguard Worker                 {"h",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1690*834a2baaSAndroid Build Coastguard Worker                 {"i",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1691*834a2baaSAndroid Build Coastguard Worker                 {"s ",    10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1692*834a2baaSAndroid Build Coastguard Worker                 {"(",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1693*834a2baaSAndroid Build Coastguard Worker                 {"is an", 50, NO_START_HYPHEN, NO_END_HYPHEN,      0,       0},
1694*834a2baaSAndroid Build Coastguard Worker                 {") ",    10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1695*834a2baaSAndroid Build Coastguard Worker                 {"e",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1696*834a2baaSAndroid Build Coastguard Worker                 {"x",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1697*834a2baaSAndroid Build Coastguard Worker                 {"a",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1698*834a2baaSAndroid Build Coastguard Worker                 {"m",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1699*834a2baaSAndroid Build Coastguard Worker                 {"p",    10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1700*834a2baaSAndroid Build Coastguard Worker                 {"l",    10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1701*834a2baaSAndroid Build Coastguard Worker                 {"e ",    10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1702*834a2baaSAndroid Build Coastguard Worker                 {"t",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1703*834a2baaSAndroid Build Coastguard Worker                 {"e",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1704*834a2baaSAndroid Build Coastguard Worker                 {"x",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1705*834a2baaSAndroid Build Coastguard Worker                 {"t",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1706*834a2baaSAndroid Build Coastguard Worker                 {".",     10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1707*834a2baaSAndroid Build Coastguard Worker         };
1708*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1709*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(LINE_WIDTH);
1710*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1711*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1712*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1713*834a2baaSAndroid Build Coastguard Worker     }
1714*834a2baaSAndroid Build Coastguard Worker }
1715*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testControllCharAfterSpace)1716*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testControllCharAfterSpace) {
1717*834a2baaSAndroid Build Coastguard Worker     constexpr bool NO_HYPHEN = false;  // No hyphenation in this test case.
1718*834a2baaSAndroid Build Coastguard Worker     const std::vector<uint16_t> textBuf = utf8ToUtf16("example \u2066example");
1719*834a2baaSAndroid Build Coastguard Worker 
1720*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
1721*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
1722*834a2baaSAndroid Build Coastguard Worker     {
1723*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 90;
1724*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1725*834a2baaSAndroid Build Coastguard Worker                 {"example ", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1726*834a2baaSAndroid Build Coastguard Worker                 {"\u2066example", 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1727*834a2baaSAndroid Build Coastguard Worker         };
1728*834a2baaSAndroid Build Coastguard Worker 
1729*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, NO_HYPHEN, LINE_WIDTH);
1730*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1731*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1732*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1733*834a2baaSAndroid Build Coastguard Worker     }
1734*834a2baaSAndroid Build Coastguard Worker }
1735*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testBreakWithoutBounds_trail)1736*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testBreakWithoutBounds_trail) {
1737*834a2baaSAndroid Build Coastguard Worker     // The OvershootTest.ttf has following coverage, extent, width and bbox.
1738*834a2baaSAndroid Build Coastguard Worker     // U+0061(a): 1em, (   0, 0) - (1,   1)
1739*834a2baaSAndroid Build Coastguard Worker     // U+0062(b): 1em, (   0, 0) - (1.5, 1)
1740*834a2baaSAndroid Build Coastguard Worker     // U+0063(c): 1em, (   0, 0) - (2,   1)
1741*834a2baaSAndroid Build Coastguard Worker     // U+0064(d): 1em, (   0, 0) - (2.5, 1)
1742*834a2baaSAndroid Build Coastguard Worker     // U+0065(e): 1em, (-0.5, 0) - (1,   1)
1743*834a2baaSAndroid Build Coastguard Worker     // U+0066(f): 1em, (-1.0, 0) - (1,   1)
1744*834a2baaSAndroid Build Coastguard Worker     // U+0067(g): 1em, (-1.5, 0) - (1,   1)
1745*834a2baaSAndroid Build Coastguard Worker     constexpr bool NO_HYPHEN = false;  // No hyphenation in this test case.
1746*834a2baaSAndroid Build Coastguard Worker 
1747*834a2baaSAndroid Build Coastguard Worker     const std::vector<uint16_t> textBuf = utf8ToUtf16("dddd dddd dddd dddd");
1748*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
1749*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
1750*834a2baaSAndroid Build Coastguard Worker     // Note that disable clang-format everywhere since aligned expectation is more readable.
1751*834a2baaSAndroid Build Coastguard Worker     {
1752*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 1000;
1753*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1754*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1755*834a2baaSAndroid Build Coastguard Worker                 {"dddd dddd dddd dddd", 190, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1756*834a2baaSAndroid Build Coastguard Worker         };
1757*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1758*834a2baaSAndroid Build Coastguard Worker 
1759*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForBounds(textBuf, NO_HYPHEN, LINE_WIDTH);
1760*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1761*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1762*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1763*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(0, -10, 205, 0), actual.bounds[0]);
1764*834a2baaSAndroid Build Coastguard Worker     }
1765*834a2baaSAndroid Build Coastguard Worker     {
1766*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 110;
1767*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1768*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1769*834a2baaSAndroid Build Coastguard Worker                 {"dddd dddd ", 90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1770*834a2baaSAndroid Build Coastguard Worker                 {"dddd dddd", 90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1771*834a2baaSAndroid Build Coastguard Worker         };
1772*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1773*834a2baaSAndroid Build Coastguard Worker 
1774*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForBounds(textBuf, NO_HYPHEN, LINE_WIDTH);
1775*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1776*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1777*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1778*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(0, -10, 105, 0), actual.bounds[0]);
1779*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(0, -10, 105, 0), actual.bounds[1]);
1780*834a2baaSAndroid Build Coastguard Worker     }
1781*834a2baaSAndroid Build Coastguard Worker     {
1782*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
1783*834a2baaSAndroid Build Coastguard Worker         // Even if the total advance of "dddd dddd" is 90, the width of bounding box of "dddd dddd"
1784*834a2baaSAndroid Build Coastguard Worker         // is
1785*834a2baaSAndroid Build Coastguard Worker         // Rect(0em, 1em, 10.5em, 0em). So "dddd dddd" is broken into two lines.
1786*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1787*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1788*834a2baaSAndroid Build Coastguard Worker                 {"dddd ", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1789*834a2baaSAndroid Build Coastguard Worker                 {"dddd ", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1790*834a2baaSAndroid Build Coastguard Worker                 {"dddd ", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1791*834a2baaSAndroid Build Coastguard Worker                 {"dddd", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1792*834a2baaSAndroid Build Coastguard Worker         };
1793*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1794*834a2baaSAndroid Build Coastguard Worker 
1795*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForBounds(textBuf, NO_HYPHEN, LINE_WIDTH);
1796*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1797*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1798*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1799*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(0, -10, 55, 0), actual.bounds[0]);
1800*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(0, -10, 55, 0), actual.bounds[1]);
1801*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(0, -10, 55, 0), actual.bounds[2]);
1802*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(0, -10, 55, 0), actual.bounds[3]);
1803*834a2baaSAndroid Build Coastguard Worker     }
1804*834a2baaSAndroid Build Coastguard Worker }
1805*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testBreakWithoutBounds_preceding)1806*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testBreakWithoutBounds_preceding) {
1807*834a2baaSAndroid Build Coastguard Worker     // The OvershootTest.ttf has following coverage, extent, width and bbox.
1808*834a2baaSAndroid Build Coastguard Worker     // U+0061(a): 1em, (   0, 0) - (1,   1)
1809*834a2baaSAndroid Build Coastguard Worker     // U+0062(b): 1em, (   0, 0) - (1.5, 1)
1810*834a2baaSAndroid Build Coastguard Worker     // U+0063(c): 1em, (   0, 0) - (2,   1)
1811*834a2baaSAndroid Build Coastguard Worker     // U+0064(d): 1em, (   0, 0) - (2.5, 1)
1812*834a2baaSAndroid Build Coastguard Worker     // U+0065(e): 1em, (-0.5, 0) - (1,   1)
1813*834a2baaSAndroid Build Coastguard Worker     // U+0066(f): 1em, (-1.0, 0) - (1,   1)
1814*834a2baaSAndroid Build Coastguard Worker     // U+0067(g): 1em, (-1.5, 0) - (1,   1)
1815*834a2baaSAndroid Build Coastguard Worker     constexpr bool NO_HYPHEN = false;  // No hyphenation in this test case.
1816*834a2baaSAndroid Build Coastguard Worker 
1817*834a2baaSAndroid Build Coastguard Worker     const std::vector<uint16_t> textBuf = utf8ToUtf16("gggg gggg gggg gggg");
1818*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
1819*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
1820*834a2baaSAndroid Build Coastguard Worker     // Note that disable clang-format everywhere since aligned expectation is more readable.
1821*834a2baaSAndroid Build Coastguard Worker     {
1822*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 1000;
1823*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1824*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1825*834a2baaSAndroid Build Coastguard Worker                 {"gggg gggg gggg gggg", 190, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1826*834a2baaSAndroid Build Coastguard Worker         };
1827*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1828*834a2baaSAndroid Build Coastguard Worker 
1829*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForBounds(textBuf, NO_HYPHEN, LINE_WIDTH);
1830*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1831*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1832*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1833*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(-15, -10, 190, 0), actual.bounds[0]);
1834*834a2baaSAndroid Build Coastguard Worker     }
1835*834a2baaSAndroid Build Coastguard Worker     {
1836*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 110;
1837*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1838*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1839*834a2baaSAndroid Build Coastguard Worker                 {"gggg gggg ", 90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1840*834a2baaSAndroid Build Coastguard Worker                 {"gggg gggg" , 90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1841*834a2baaSAndroid Build Coastguard Worker         };
1842*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1843*834a2baaSAndroid Build Coastguard Worker 
1844*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForBounds(textBuf, NO_HYPHEN, LINE_WIDTH);
1845*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1846*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1847*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1848*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(-15, -10, 90, 0), actual.bounds[0]);
1849*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(-15, -10, 90, 0), actual.bounds[1]);
1850*834a2baaSAndroid Build Coastguard Worker     }
1851*834a2baaSAndroid Build Coastguard Worker     {
1852*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
1853*834a2baaSAndroid Build Coastguard Worker         // Even if the total advance of "dddd dddd" is 90, the width of bounding box of "dddd dddd"
1854*834a2baaSAndroid Build Coastguard Worker         // is
1855*834a2baaSAndroid Build Coastguard Worker         // Rect(0em, 1em, 10.5em, 0em). So "dddd dddd" is broken into two lines.
1856*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1857*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1858*834a2baaSAndroid Build Coastguard Worker                 {"gggg ", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1859*834a2baaSAndroid Build Coastguard Worker                 {"gggg ", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1860*834a2baaSAndroid Build Coastguard Worker                 {"gggg ", 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1861*834a2baaSAndroid Build Coastguard Worker                 {"gggg" , 40, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
1862*834a2baaSAndroid Build Coastguard Worker         };
1863*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1864*834a2baaSAndroid Build Coastguard Worker 
1865*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForBounds(textBuf, NO_HYPHEN, LINE_WIDTH);
1866*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1867*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1868*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1869*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(-15, -10, 40, 0), actual.bounds[0]);
1870*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(-15, -10, 40, 0), actual.bounds[1]);
1871*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(-15, -10, 40, 0), actual.bounds[2]);
1872*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(MinikinRect(-15, -10, 40, 0), actual.bounds[3]);
1873*834a2baaSAndroid Build Coastguard Worker     }
1874*834a2baaSAndroid Build Coastguard Worker }
1875*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testBreakWithHyphenation_NoHyphenationSpan)1876*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testBreakWithHyphenation_NoHyphenationSpan) {
1877*834a2baaSAndroid Build Coastguard Worker     // "hyphenation" is hyphnated to "hy-phen-a-tion".
1878*834a2baaSAndroid Build Coastguard Worker     const std::vector<uint16_t> textBuf = utf8ToUtf16("This is Android. Here is hyphenation.");
1879*834a2baaSAndroid Build Coastguard Worker     const Range noHyphenRange(25, 37);  // the range of the word "hyphenation".
1880*834a2baaSAndroid Build Coastguard Worker 
1881*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
1882*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit END_HYPHEN = EndHyphenEdit::INSERT_HYPHEN;
1883*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
1884*834a2baaSAndroid Build Coastguard Worker 
1885*834a2baaSAndroid Build Coastguard Worker     // Note that disable clang-format everywhere since aligned expectation is more readable.
1886*834a2baaSAndroid Build Coastguard Worker     {
1887*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
1888*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1889*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1890*834a2baaSAndroid Build Coastguard Worker                 { "This is "  , 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
1891*834a2baaSAndroid Build Coastguard Worker                 { "Android. " , 80, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
1892*834a2baaSAndroid Build Coastguard Worker                 { "Here is "  , 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
1893*834a2baaSAndroid Build Coastguard Worker                 { "hyphena-"  , 80, NO_START_HYPHEN,    END_HYPHEN, ASCENT, DESCENT },
1894*834a2baaSAndroid Build Coastguard Worker                 { "tion."    , 50, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
1895*834a2baaSAndroid Build Coastguard Worker         };
1896*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1897*834a2baaSAndroid Build Coastguard Worker 
1898*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreak(textBuf, true /* do hyphenation */, LINE_WIDTH);
1899*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1900*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1901*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1902*834a2baaSAndroid Build Coastguard Worker     }
1903*834a2baaSAndroid Build Coastguard Worker     {
1904*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
1905*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1906*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1907*834a2baaSAndroid Build Coastguard Worker                 { "This is "   , 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
1908*834a2baaSAndroid Build Coastguard Worker                 { "Android. "  , 80, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
1909*834a2baaSAndroid Build Coastguard Worker                 { "Here is "   , 70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
1910*834a2baaSAndroid Build Coastguard Worker                 // Prevent hyphenation of "hyphenation". Fallback to desperate break.
1911*834a2baaSAndroid Build Coastguard Worker                 { "hyphenatio" ,100, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
1912*834a2baaSAndroid Build Coastguard Worker                 { "n."         , 20, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT },
1913*834a2baaSAndroid Build Coastguard Worker         };
1914*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1915*834a2baaSAndroid Build Coastguard Worker 
1916*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakWithNoHyphenSpan(textBuf, noHyphenRange, LINE_WIDTH);
1917*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1918*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1919*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1920*834a2baaSAndroid Build Coastguard Worker     }
1921*834a2baaSAndroid Build Coastguard Worker }
1922*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testPhraseBreakNone)1923*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testPhraseBreakNone) {
1924*834a2baaSAndroid Build Coastguard Worker     // For short hand of writing expectation for lines.
1925*834a2baaSAndroid Build Coastguard Worker     auto line = [](std::string t, float w) -> LineBreakExpectation {
1926*834a2baaSAndroid Build Coastguard Worker         return {t, w, StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, ASCENT, DESCENT};
1927*834a2baaSAndroid Build Coastguard Worker     };
1928*834a2baaSAndroid Build Coastguard Worker 
1929*834a2baaSAndroid Build Coastguard Worker     // Note that disable clang-format everywhere since aligned expectation is more readable.
1930*834a2baaSAndroid Build Coastguard Worker     {
1931*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 1));
1932*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
1933*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1934*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1935*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002" , 80),
1936*834a2baaSAndroid Build Coastguard Worker         };
1937*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1938*834a2baaSAndroid Build Coastguard Worker 
1939*834a2baaSAndroid Build Coastguard Worker         const auto actual =
1940*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::None, "ja-JP", LINE_WIDTH);
1941*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1942*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1943*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1944*834a2baaSAndroid Build Coastguard Worker     }
1945*834a2baaSAndroid Build Coastguard Worker     {
1946*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 2));
1947*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
1948*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1949*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1950*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5" , 100),
1951*834a2baaSAndroid Build Coastguard Worker                 line("\u306F\u6674\u5929\u306A\u308A\u3002" , 60),
1952*834a2baaSAndroid Build Coastguard Worker         };
1953*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1954*834a2baaSAndroid Build Coastguard Worker 
1955*834a2baaSAndroid Build Coastguard Worker         const auto actual =
1956*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::None, "ja-JP", LINE_WIDTH);
1957*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1958*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1959*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1960*834a2baaSAndroid Build Coastguard Worker     }
1961*834a2baaSAndroid Build Coastguard Worker     {
1962*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 3));
1963*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
1964*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1965*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1966*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5", 100),
1967*834a2baaSAndroid Build Coastguard Worker                 line("\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5\u306F\u6674", 100),
1968*834a2baaSAndroid Build Coastguard Worker                 line("\u5929\u306A\u308A\u3002", 40),
1969*834a2baaSAndroid Build Coastguard Worker         };
1970*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1971*834a2baaSAndroid Build Coastguard Worker 
1972*834a2baaSAndroid Build Coastguard Worker         const auto actual =
1973*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::None, "ja-JP", LINE_WIDTH);
1974*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1975*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1976*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1977*834a2baaSAndroid Build Coastguard Worker     }
1978*834a2baaSAndroid Build Coastguard Worker     {
1979*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 4));
1980*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
1981*834a2baaSAndroid Build Coastguard Worker         // clang-format off
1982*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
1983*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5", 100),
1984*834a2baaSAndroid Build Coastguard Worker                 line("\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5\u306F\u6674", 100),
1985*834a2baaSAndroid Build Coastguard Worker                 line("\u5929\u306A\u308A\u3002\u672C\u65E5\u306F\u6674\u5929\u306A", 100),
1986*834a2baaSAndroid Build Coastguard Worker                 line("\u308A\u3002"  , 20),
1987*834a2baaSAndroid Build Coastguard Worker         };
1988*834a2baaSAndroid Build Coastguard Worker         // clang-format on
1989*834a2baaSAndroid Build Coastguard Worker 
1990*834a2baaSAndroid Build Coastguard Worker         const auto actual =
1991*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::None, "ja-JP", LINE_WIDTH);
1992*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
1993*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
1994*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
1995*834a2baaSAndroid Build Coastguard Worker     }
1996*834a2baaSAndroid Build Coastguard Worker     {
1997*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 5));
1998*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
1999*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2000*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2001*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5", 100),
2002*834a2baaSAndroid Build Coastguard Worker                 line("\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5\u306F\u6674", 100),
2003*834a2baaSAndroid Build Coastguard Worker                 line("\u5929\u306A\u308A\u3002\u672C\u65E5\u306F\u6674\u5929\u306A", 100),
2004*834a2baaSAndroid Build Coastguard Worker                 line("\u308A\u3002\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 100),
2005*834a2baaSAndroid Build Coastguard Worker         };
2006*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2007*834a2baaSAndroid Build Coastguard Worker 
2008*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2009*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::None, "ja-JP", LINE_WIDTH);
2010*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2011*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2012*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2013*834a2baaSAndroid Build Coastguard Worker     }
2014*834a2baaSAndroid Build Coastguard Worker     {
2015*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 6));
2016*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2017*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2018*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2019*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5", 100),
2020*834a2baaSAndroid Build Coastguard Worker                 line("\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5\u306F\u6674", 100),
2021*834a2baaSAndroid Build Coastguard Worker                 line("\u5929\u306A\u308A\u3002\u672C\u65E5\u306F\u6674\u5929\u306A", 100),
2022*834a2baaSAndroid Build Coastguard Worker                 line("\u308A\u3002\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 100),
2023*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2024*834a2baaSAndroid Build Coastguard Worker         };
2025*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2026*834a2baaSAndroid Build Coastguard Worker 
2027*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2028*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::None, "ja-JP", LINE_WIDTH);
2029*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2030*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2031*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2032*834a2baaSAndroid Build Coastguard Worker     }
2033*834a2baaSAndroid Build Coastguard Worker }
2034*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testPhraseBreakPhrase)2035*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testPhraseBreakPhrase) {
2036*834a2baaSAndroid Build Coastguard Worker     // For short hand of writing expectation for lines.
2037*834a2baaSAndroid Build Coastguard Worker     auto line = [](std::string t, float w) -> LineBreakExpectation {
2038*834a2baaSAndroid Build Coastguard Worker         return {t, w, StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, ASCENT, DESCENT};
2039*834a2baaSAndroid Build Coastguard Worker     };
2040*834a2baaSAndroid Build Coastguard Worker 
2041*834a2baaSAndroid Build Coastguard Worker     // Note that disable clang-format everywhere since aligned expectation is more readable.
2042*834a2baaSAndroid Build Coastguard Worker     {
2043*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 1));
2044*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2045*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2046*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2047*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2048*834a2baaSAndroid Build Coastguard Worker         };
2049*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2050*834a2baaSAndroid Build Coastguard Worker 
2051*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2052*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::Phrase, "ja-JP", LINE_WIDTH);
2053*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2054*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2055*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2056*834a2baaSAndroid Build Coastguard Worker     }
2057*834a2baaSAndroid Build Coastguard Worker     {
2058*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 2));
2059*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2060*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2061*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2062*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2063*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2064*834a2baaSAndroid Build Coastguard Worker         };
2065*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2066*834a2baaSAndroid Build Coastguard Worker 
2067*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2068*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::Phrase, "ja-JP", LINE_WIDTH);
2069*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2070*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2071*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2072*834a2baaSAndroid Build Coastguard Worker     }
2073*834a2baaSAndroid Build Coastguard Worker     {
2074*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 3));
2075*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2076*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2077*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2078*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2079*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2080*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2081*834a2baaSAndroid Build Coastguard Worker         };
2082*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2083*834a2baaSAndroid Build Coastguard Worker 
2084*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2085*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::Phrase, "ja-JP", LINE_WIDTH);
2086*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2087*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2088*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2089*834a2baaSAndroid Build Coastguard Worker     }
2090*834a2baaSAndroid Build Coastguard Worker     {
2091*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 4));
2092*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2093*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2094*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2095*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2096*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2097*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2098*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2099*834a2baaSAndroid Build Coastguard Worker         };
2100*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2101*834a2baaSAndroid Build Coastguard Worker 
2102*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2103*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::Phrase, "ja-JP", LINE_WIDTH);
2104*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2105*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2106*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2107*834a2baaSAndroid Build Coastguard Worker     }
2108*834a2baaSAndroid Build Coastguard Worker     {
2109*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 5));
2110*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2111*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2112*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2113*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2114*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2115*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2116*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2117*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2118*834a2baaSAndroid Build Coastguard Worker         };
2119*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2120*834a2baaSAndroid Build Coastguard Worker 
2121*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2122*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::Phrase, "ja-JP", LINE_WIDTH);
2123*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2124*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2125*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2126*834a2baaSAndroid Build Coastguard Worker     }
2127*834a2baaSAndroid Build Coastguard Worker     {
2128*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 6));
2129*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2130*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2131*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2132*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2133*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2134*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2135*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2136*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2137*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2138*834a2baaSAndroid Build Coastguard Worker         };
2139*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2140*834a2baaSAndroid Build Coastguard Worker 
2141*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2142*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::Phrase, "ja-JP", LINE_WIDTH);
2143*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2144*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2145*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2146*834a2baaSAndroid Build Coastguard Worker     }
2147*834a2baaSAndroid Build Coastguard Worker }
2148*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testPhraseBreakAuto)2149*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testPhraseBreakAuto) {
2150*834a2baaSAndroid Build Coastguard Worker     // For short hand of writing expectation for lines.
2151*834a2baaSAndroid Build Coastguard Worker     auto line = [](std::string t, float w) -> LineBreakExpectation {
2152*834a2baaSAndroid Build Coastguard Worker         return {t, w, StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, ASCENT, DESCENT};
2153*834a2baaSAndroid Build Coastguard Worker     };
2154*834a2baaSAndroid Build Coastguard Worker 
2155*834a2baaSAndroid Build Coastguard Worker     // Note that disable clang-format everywhere since aligned expectation is more readable.
2156*834a2baaSAndroid Build Coastguard Worker     {
2157*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 1));
2158*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2159*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2160*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2161*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2162*834a2baaSAndroid Build Coastguard Worker         };
2163*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2164*834a2baaSAndroid Build Coastguard Worker 
2165*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2166*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::Auto, "ja-JP", LINE_WIDTH);
2167*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2168*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2169*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2170*834a2baaSAndroid Build Coastguard Worker     }
2171*834a2baaSAndroid Build Coastguard Worker     {
2172*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 2));
2173*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2174*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2175*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2176*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2177*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2178*834a2baaSAndroid Build Coastguard Worker         };
2179*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2180*834a2baaSAndroid Build Coastguard Worker 
2181*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2182*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::Auto, "ja-JP", LINE_WIDTH);
2183*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2184*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2185*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2186*834a2baaSAndroid Build Coastguard Worker     }
2187*834a2baaSAndroid Build Coastguard Worker     {
2188*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 3));
2189*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2190*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2191*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2192*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2193*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2194*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2195*834a2baaSAndroid Build Coastguard Worker         };
2196*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2197*834a2baaSAndroid Build Coastguard Worker 
2198*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2199*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::Auto, "ja-JP", LINE_WIDTH);
2200*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2201*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2202*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2203*834a2baaSAndroid Build Coastguard Worker     }
2204*834a2baaSAndroid Build Coastguard Worker     {
2205*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 4));
2206*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2207*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2208*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2209*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2210*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2211*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2212*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 80),
2213*834a2baaSAndroid Build Coastguard Worker         };
2214*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2215*834a2baaSAndroid Build Coastguard Worker 
2216*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2217*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::Auto, "ja-JP", LINE_WIDTH);
2218*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2219*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2220*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2221*834a2baaSAndroid Build Coastguard Worker     }
2222*834a2baaSAndroid Build Coastguard Worker     // When the line becomes more or equal to 5, the phrase based line break is disabled.
2223*834a2baaSAndroid Build Coastguard Worker     {
2224*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 5));
2225*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2226*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2227*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2228*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5", 100),
2229*834a2baaSAndroid Build Coastguard Worker                 line("\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5\u306F\u6674", 100),
2230*834a2baaSAndroid Build Coastguard Worker                 line("\u5929\u306A\u308A\u3002\u672C\u65E5\u306F\u6674\u5929\u306A", 100),
2231*834a2baaSAndroid Build Coastguard Worker                 line("\u308A\u3002\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 100),
2232*834a2baaSAndroid Build Coastguard Worker         };
2233*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2234*834a2baaSAndroid Build Coastguard Worker 
2235*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2236*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::Auto, "ja-JP", LINE_WIDTH);
2237*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2238*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2239*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2240*834a2baaSAndroid Build Coastguard Worker     }
2241*834a2baaSAndroid Build Coastguard Worker     {
2242*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(repeat(JP_TEXT, 6));
2243*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2244*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2245*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2246*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5", 100),
2247*834a2baaSAndroid Build Coastguard Worker                 line("\u306F\u6674\u5929\u306A\u308A\u3002\u672C\u65E5\u306F\u6674", 100),
2248*834a2baaSAndroid Build Coastguard Worker                 line("\u5929\u306A\u308A\u3002\u672C\u65E5\u306F\u6674\u5929\u306A", 100),
2249*834a2baaSAndroid Build Coastguard Worker                 line("\u308A\u3002\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002", 100),
2250*834a2baaSAndroid Build Coastguard Worker                 line("\u672C\u65E5\u306F\u6674\u5929\u306A\u308A\u3002"  , 80),
2251*834a2baaSAndroid Build Coastguard Worker         };
2252*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2253*834a2baaSAndroid Build Coastguard Worker 
2254*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2255*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForJapanese(textBuf, LineBreakWordStyle::Auto, "ja-JP", LINE_WIDTH);
2256*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2257*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2258*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2259*834a2baaSAndroid Build Coastguard Worker     }
2260*834a2baaSAndroid Build Coastguard Worker }
2261*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testPhraseBreak_Korean)2262*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testPhraseBreak_Korean) {
2263*834a2baaSAndroid Build Coastguard Worker     // For short hand of writing expectation for lines.
2264*834a2baaSAndroid Build Coastguard Worker     auto line = [](std::string t, float w) -> LineBreakExpectation {
2265*834a2baaSAndroid Build Coastguard Worker         return {t, w, StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, ASCENT, DESCENT};
2266*834a2baaSAndroid Build Coastguard Worker     };
2267*834a2baaSAndroid Build Coastguard Worker 
2268*834a2baaSAndroid Build Coastguard Worker     // Note that disable clang-format everywhere since aligned expectation is more readable.
2269*834a2baaSAndroid Build Coastguard Worker     {
2270*834a2baaSAndroid Build Coastguard Worker         SCOPED_TRACE("LineBreakWOrdStyle::None should break with grapheme bounds");
2271*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(KO_TEXT);
2272*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2273*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2274*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2275*834a2baaSAndroid Build Coastguard Worker                 line("\uC544\uCE68\uBC25\uC744\u0020\uBA39\uACE0\u0020\uC2F6\uC2B5", 100),
2276*834a2baaSAndroid Build Coastguard Worker                 line("\uB2C8\uB2E4\u002E", 30),
2277*834a2baaSAndroid Build Coastguard Worker         };
2278*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2279*834a2baaSAndroid Build Coastguard Worker 
2280*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2281*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForKorean(textBuf, LineBreakWordStyle::None, "ko-KR", LINE_WIDTH);
2282*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2283*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2284*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2285*834a2baaSAndroid Build Coastguard Worker     }
2286*834a2baaSAndroid Build Coastguard Worker     {
2287*834a2baaSAndroid Build Coastguard Worker         SCOPED_TRACE("LineBreakWOrdStyle::Phrase should break with spaces");
2288*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(KO_TEXT);
2289*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2290*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2291*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2292*834a2baaSAndroid Build Coastguard Worker                 line("\uC544\uCE68\uBC25\uC744\u0020\uBA39\uACE0\u0020", 70),
2293*834a2baaSAndroid Build Coastguard Worker                 line("\uC2F6\uC2B5\uB2C8\uB2E4\u002E", 50),
2294*834a2baaSAndroid Build Coastguard Worker         };
2295*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2296*834a2baaSAndroid Build Coastguard Worker 
2297*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2298*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForKorean(textBuf, LineBreakWordStyle::Phrase, "ko-KR", LINE_WIDTH);
2299*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2300*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2301*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2302*834a2baaSAndroid Build Coastguard Worker     }
2303*834a2baaSAndroid Build Coastguard Worker     {
2304*834a2baaSAndroid Build Coastguard Worker         SCOPED_TRACE("LineBreakWOrdStyle::Auto should perform as phrase based line break.");
2305*834a2baaSAndroid Build Coastguard Worker         const std::vector<uint16_t> textBuf = utf8ToUtf16(KO_TEXT);
2306*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 100;
2307*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2308*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2309*834a2baaSAndroid Build Coastguard Worker                 line("\uC544\uCE68\uBC25\uC744\u0020\uBA39\uACE0\u0020", 70),
2310*834a2baaSAndroid Build Coastguard Worker                 line("\uC2F6\uC2B5\uB2C8\uB2E4\u002E", 50),
2311*834a2baaSAndroid Build Coastguard Worker         };
2312*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2313*834a2baaSAndroid Build Coastguard Worker 
2314*834a2baaSAndroid Build Coastguard Worker         const auto actual =
2315*834a2baaSAndroid Build Coastguard Worker                 doLineBreakForKorean(textBuf, LineBreakWordStyle::Auto, "ko-KR", LINE_WIDTH);
2316*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2317*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2318*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2319*834a2baaSAndroid Build Coastguard Worker     }
2320*834a2baaSAndroid Build Coastguard Worker }
2321*834a2baaSAndroid Build Coastguard Worker 
TEST_F(GreedyLineBreakerTest,testBreakWithLetterSpacing)2322*834a2baaSAndroid Build Coastguard Worker TEST_F(GreedyLineBreakerTest, testBreakWithLetterSpacing) {
2323*834a2baaSAndroid Build Coastguard Worker     const std::vector<uint16_t> textBuf = utf8ToUtf16("This is an example text.");
2324*834a2baaSAndroid Build Coastguard Worker 
2325*834a2baaSAndroid Build Coastguard Worker     constexpr StartHyphenEdit NO_START_HYPHEN = StartHyphenEdit::NO_EDIT;
2326*834a2baaSAndroid Build Coastguard Worker     constexpr EndHyphenEdit NO_END_HYPHEN = EndHyphenEdit::NO_EDIT;
2327*834a2baaSAndroid Build Coastguard Worker     // Note that disable clang-format everywhere since aligned expectation is more readable.
2328*834a2baaSAndroid Build Coastguard Worker     {
2329*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 1000;
2330*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2331*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2332*834a2baaSAndroid Build Coastguard Worker                 {"This is an example text.", 470, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2333*834a2baaSAndroid Build Coastguard Worker         };
2334*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2335*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForLetterSpacing(textBuf, 1.0f, LINE_WIDTH);
2336*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2337*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2338*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2339*834a2baaSAndroid Build Coastguard Worker     }
2340*834a2baaSAndroid Build Coastguard Worker     {
2341*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 470;
2342*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2343*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2344*834a2baaSAndroid Build Coastguard Worker                 {"This is an example text.", 470, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2345*834a2baaSAndroid Build Coastguard Worker         };
2346*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2347*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForLetterSpacing(textBuf, 1.0f, LINE_WIDTH);
2348*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2349*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2350*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2351*834a2baaSAndroid Build Coastguard Worker     }
2352*834a2baaSAndroid Build Coastguard Worker     {
2353*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 460;
2354*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2355*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2356*834a2baaSAndroid Build Coastguard Worker                 {"This is an example ", 350, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2357*834a2baaSAndroid Build Coastguard Worker                 {"text.",                90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2358*834a2baaSAndroid Build Coastguard Worker         };
2359*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2360*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForLetterSpacing(textBuf, 1.0f, LINE_WIDTH);
2361*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2362*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2363*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2364*834a2baaSAndroid Build Coastguard Worker     }
2365*834a2baaSAndroid Build Coastguard Worker     {
2366*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 240;
2367*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2368*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2369*834a2baaSAndroid Build Coastguard Worker                 {"This is an ", 190, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2370*834a2baaSAndroid Build Coastguard Worker                 {"example ",    130, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2371*834a2baaSAndroid Build Coastguard Worker                 {"text.",        90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2372*834a2baaSAndroid Build Coastguard Worker         };
2373*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2374*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForLetterSpacing(textBuf, 1.0f, LINE_WIDTH);
2375*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2376*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2377*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2378*834a2baaSAndroid Build Coastguard Worker     }
2379*834a2baaSAndroid Build Coastguard Worker     {
2380*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 130;
2381*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2382*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2383*834a2baaSAndroid Build Coastguard Worker                 {"This is ", 130, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2384*834a2baaSAndroid Build Coastguard Worker                 {"an ",       30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2385*834a2baaSAndroid Build Coastguard Worker                 {"example ", 130, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2386*834a2baaSAndroid Build Coastguard Worker                 {"text.",     90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2387*834a2baaSAndroid Build Coastguard Worker         };
2388*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2389*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForLetterSpacing(textBuf, 1.0f, LINE_WIDTH);
2390*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2391*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2392*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2393*834a2baaSAndroid Build Coastguard Worker     }
2394*834a2baaSAndroid Build Coastguard Worker     {
2395*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 120;
2396*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2397*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2398*834a2baaSAndroid Build Coastguard Worker                 {"This ",   70, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2399*834a2baaSAndroid Build Coastguard Worker                 {"is an ",  90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2400*834a2baaSAndroid Build Coastguard Worker                 {"exampl", 110, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2401*834a2baaSAndroid Build Coastguard Worker                 {"e ",      10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2402*834a2baaSAndroid Build Coastguard Worker                 {"text.",   90, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2403*834a2baaSAndroid Build Coastguard Worker         };
2404*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2405*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForLetterSpacing(textBuf, 1.0f, LINE_WIDTH);
2406*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2407*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2408*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2409*834a2baaSAndroid Build Coastguard Worker     }
2410*834a2baaSAndroid Build Coastguard Worker     {
2411*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 30;
2412*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2413*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2414*834a2baaSAndroid Build Coastguard Worker                 {"Th",  30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2415*834a2baaSAndroid Build Coastguard Worker                 {"is ", 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2416*834a2baaSAndroid Build Coastguard Worker                 {"is ", 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2417*834a2baaSAndroid Build Coastguard Worker                 {"an ", 30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2418*834a2baaSAndroid Build Coastguard Worker                 {"ex",  30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2419*834a2baaSAndroid Build Coastguard Worker                 {"am",  30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2420*834a2baaSAndroid Build Coastguard Worker                 {"pl",  30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2421*834a2baaSAndroid Build Coastguard Worker                 {"e ",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2422*834a2baaSAndroid Build Coastguard Worker                 {"te",  30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2423*834a2baaSAndroid Build Coastguard Worker                 {"xt",  30, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2424*834a2baaSAndroid Build Coastguard Worker                 {".",   10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2425*834a2baaSAndroid Build Coastguard Worker         };
2426*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2427*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForLetterSpacing(textBuf, 1.0f, LINE_WIDTH);
2428*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2429*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2430*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2431*834a2baaSAndroid Build Coastguard Worker     }
2432*834a2baaSAndroid Build Coastguard Worker     {
2433*834a2baaSAndroid Build Coastguard Worker         constexpr float LINE_WIDTH = 10;
2434*834a2baaSAndroid Build Coastguard Worker         // clang-format off
2435*834a2baaSAndroid Build Coastguard Worker         std::vector<LineBreakExpectation> expect = {
2436*834a2baaSAndroid Build Coastguard Worker                 {"T",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2437*834a2baaSAndroid Build Coastguard Worker                 {"h",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2438*834a2baaSAndroid Build Coastguard Worker                 {"i",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2439*834a2baaSAndroid Build Coastguard Worker                 {"s ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2440*834a2baaSAndroid Build Coastguard Worker                 {"i",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2441*834a2baaSAndroid Build Coastguard Worker                 {"s ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2442*834a2baaSAndroid Build Coastguard Worker                 {"a",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2443*834a2baaSAndroid Build Coastguard Worker                 {"n ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2444*834a2baaSAndroid Build Coastguard Worker                 {"e",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2445*834a2baaSAndroid Build Coastguard Worker                 {"x",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2446*834a2baaSAndroid Build Coastguard Worker                 {"a",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2447*834a2baaSAndroid Build Coastguard Worker                 {"m",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2448*834a2baaSAndroid Build Coastguard Worker                 {"p",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2449*834a2baaSAndroid Build Coastguard Worker                 {"l",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2450*834a2baaSAndroid Build Coastguard Worker                 {"e ", 10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2451*834a2baaSAndroid Build Coastguard Worker                 {"t",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2452*834a2baaSAndroid Build Coastguard Worker                 {"e",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2453*834a2baaSAndroid Build Coastguard Worker                 {"x",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2454*834a2baaSAndroid Build Coastguard Worker                 {"t",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2455*834a2baaSAndroid Build Coastguard Worker                 {".",  10, NO_START_HYPHEN, NO_END_HYPHEN, ASCENT, DESCENT},
2456*834a2baaSAndroid Build Coastguard Worker         };
2457*834a2baaSAndroid Build Coastguard Worker         // clang-format on
2458*834a2baaSAndroid Build Coastguard Worker         const auto actual = doLineBreakForLetterSpacing(textBuf, 1.0f, LINE_WIDTH);
2459*834a2baaSAndroid Build Coastguard Worker         EXPECT_TRUE(sameLineBreak(expect, actual)) << toString(expect) << std::endl
2460*834a2baaSAndroid Build Coastguard Worker                                                    << " vs " << std::endl
2461*834a2baaSAndroid Build Coastguard Worker                                                    << toString(textBuf, actual);
2462*834a2baaSAndroid Build Coastguard Worker     }
2463*834a2baaSAndroid Build Coastguard Worker }
2464*834a2baaSAndroid Build Coastguard Worker 
2465*834a2baaSAndroid Build Coastguard Worker }  // namespace
2466*834a2baaSAndroid Build Coastguard Worker }  // namespace minikin
2467