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