1acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka/*
2acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * Copyright (C) 2016 The Android Open Source Project
3acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka *
4acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License");
5acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * you may not use this file except in compliance with the License.
6acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * You may obtain a copy of the License at
7acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka *
8acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka *      http://www.apache.org/licenses/LICENSE-2.0
9acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka *
10acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * Unless required by applicable law or agreed to in writing, software
11acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS,
12acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * See the License for the specific language governing permissions and
14acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * limitations under the License.
15acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka */
16acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
17acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka#include <gtest/gtest.h>
18acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
19acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka#include "ICUTestBase.h"
20acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka#include "minikin/FontCollection.h"
21acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka#include "minikin/Layout.h"
22acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka#include "../util/FontTestUtils.h"
23acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka#include "../util/UnicodeUtils.h"
24acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
25acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakaconst char* SYSTEM_FONT_PATH = "/system/fonts/";
26acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakaconst char* SYSTEM_FONT_XML = "/system/etc/fonts.xml";
27acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
28acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakanamespace minikin {
29acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
30acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakaconst float UNTOUCHED_MARKER = 1e+38;
31acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
32acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakastatic void expectAdvances(std::vector<float> expected, float* advances, size_t length) {
33acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    EXPECT_LE(expected.size(), length);
34acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    for (size_t i = 0; i < expected.size(); ++i) {
35acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(expected[i], advances[i])
36acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka                << i << "th element is different. Expected: " << expected[i]
37acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka                << ", Actual: " << advances[i];
38acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
39acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    EXPECT_EQ(UNTOUCHED_MARKER, advances[expected.size()]);
40acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka}
41acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
42acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakastatic void resetAdvances(float* advances, size_t length) {
43acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    for (size_t i = 0; i < length; ++i) {
44acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        advances[i] = UNTOUCHED_MARKER;
45acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
46acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka}
47acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
48acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakaclass LayoutTest : public ICUTestBase {
49acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakaprotected:
50acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    LayoutTest() : mCollection(nullptr) {
51acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
52acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
53acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    virtual ~LayoutTest() {}
54acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
55acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    virtual void SetUp() override {
56dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka        mCollection = std::shared_ptr<FontCollection>(
57dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka                getFontCollection(SYSTEM_FONT_PATH, SYSTEM_FONT_XML));
58acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
59acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
60acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    virtual void TearDown() override {
61acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
62acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
63dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    std::shared_ptr<FontCollection> mCollection;
64acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka};
65acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
66acd401d02981af51419f4b740abb2c41e4980fdbSeigo NonakaTEST_F(LayoutTest, doLayoutTest) {
67acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    MinikinPaint paint;
68acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    MinikinRect rect;
69acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    const size_t kMaxAdvanceLength = 32;
70acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    float advances[kMaxAdvanceLength];
71acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    std::vector<float> expectedValues;
72acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
7399ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka    Layout layout;
74acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    std::vector<uint16_t> text;
75acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
76acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    // The mock implementation returns 10.0f advance and 0,0-10x10 bounds for all glyph.
77acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    {
78acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        SCOPED_TRACE("one word");
79acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        text = utf8ToUtf16("oneword");
8099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
8199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
82acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(70.0f, layout.getAdvance());
83acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getBounds(&rect);
84acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mLeft);
85acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mTop);
86acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(70.0f, rect.mRight);
87acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(10.0f, rect.mBottom);
88acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
89acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
90acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues.resize(text.size());
91acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        for (size_t i = 0; i < expectedValues.size(); ++i) {
92acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka            expectedValues[i] = 10.0f;
93acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        }
94acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectAdvances(expectedValues, advances, kMaxAdvanceLength);
95acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
96acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    {
97acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        SCOPED_TRACE("two words");
98acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        text = utf8ToUtf16("two words");
9999ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
10099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
101acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(90.0f, layout.getAdvance());
102acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getBounds(&rect);
103acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mLeft);
104acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mTop);
105acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(90.0f, rect.mRight);
106acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(10.0f, rect.mBottom);
107acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
108acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
109acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues.resize(text.size());
110acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        for (size_t i = 0; i < expectedValues.size(); ++i) {
111acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka            expectedValues[i] = 10.0f;
112acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        }
113acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectAdvances(expectedValues, advances, kMaxAdvanceLength);
114acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
115acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    {
116acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        SCOPED_TRACE("three words");
117acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        text = utf8ToUtf16("three words test");
11899ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
11999ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
120acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(160.0f, layout.getAdvance());
121acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getBounds(&rect);
122acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mLeft);
123acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mTop);
124acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(160.0f, rect.mRight);
125acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(10.0f, rect.mBottom);
126acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
127acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
128acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues.resize(text.size());
129acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        for (size_t i = 0; i < expectedValues.size(); ++i) {
130acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka            expectedValues[i] = 10.0f;
131acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        }
132acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectAdvances(expectedValues, advances, kMaxAdvanceLength);
133acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
134acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    {
135acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        SCOPED_TRACE("two spaces");
136acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        text = utf8ToUtf16("two  spaces");
13799ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
13899ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
139acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(110.0f, layout.getAdvance());
140acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getBounds(&rect);
141acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mLeft);
142acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mTop);
143acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(110.0f, rect.mRight);
144acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(10.0f, rect.mBottom);
145acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
146acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
147acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues.resize(text.size());
148acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        for (size_t i = 0; i < expectedValues.size(); ++i) {
149acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka            expectedValues[i] = 10.0f;
150acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        }
151acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectAdvances(expectedValues, advances, kMaxAdvanceLength);
152acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
153acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka}
154acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
155acd401d02981af51419f4b740abb2c41e4980fdbSeigo NonakaTEST_F(LayoutTest, doLayoutTest_wordSpacing) {
156acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    MinikinPaint paint;
157acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    MinikinRect rect;
158acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    const size_t kMaxAdvanceLength = 32;
159acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    float advances[kMaxAdvanceLength];
160acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    std::vector<float> expectedValues;
161acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    std::vector<uint16_t> text;
162acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
16399ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka    Layout layout;
164acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
165acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    paint.wordSpacing = 5.0f;
166acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
167acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    // The mock implementation returns 10.0f advance and 0,0-10x10 bounds for all glyph.
168acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    {
169acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        SCOPED_TRACE("one word");
170acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        text = utf8ToUtf16("oneword");
17199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
17299ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
173acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(70.0f, layout.getAdvance());
174acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getBounds(&rect);
175acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mLeft);
176acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mTop);
177acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(70.0f, rect.mRight);
178acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(10.0f, rect.mBottom);
179acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
180acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
181acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues.resize(text.size());
182acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        for (size_t i = 0; i < expectedValues.size(); ++i) {
183acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka            expectedValues[i] = 10.0f;
184acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        }
185acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectAdvances(expectedValues, advances, kMaxAdvanceLength);
186acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
187acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    {
188acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        SCOPED_TRACE("two words");
189acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        text = utf8ToUtf16("two words");
19099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
19199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
192acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(95.0f, layout.getAdvance());
193acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getBounds(&rect);
194acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mLeft);
195acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mTop);
196acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(95.0f, rect.mRight);
197acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(10.0f, rect.mBottom);
198acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
199acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
200acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(UNTOUCHED_MARKER, advances[text.size()]);
201acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
202acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
203acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues.resize(text.size());
204acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        for (size_t i = 0; i < expectedValues.size(); ++i) {
205acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka            expectedValues[i] = 10.0f;
206acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        }
207acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues[3] = 15.0f;
208acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectAdvances(expectedValues, advances, kMaxAdvanceLength);
209acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
210acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    {
211acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        SCOPED_TRACE("three words test");
212acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        text = utf8ToUtf16("three words test");
21399ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
21499ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
215acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(170.0f, layout.getAdvance());
216acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getBounds(&rect);
217acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mLeft);
218acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mTop);
219acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(170.0f, rect.mRight);
220acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(10.0f, rect.mBottom);
221acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
222acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
223acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues.resize(text.size());
224acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        for (size_t i = 0; i < expectedValues.size(); ++i) {
225acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka            expectedValues[i] = 10.0f;
226acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        }
227acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues[5] = 15.0f;
228acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues[11] = 15.0f;
229acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectAdvances(expectedValues, advances, kMaxAdvanceLength);
230acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
231acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    {
232acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        SCOPED_TRACE("two spaces");
233acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        text = utf8ToUtf16("two  spaces");
23499ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
23599ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
236acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(120.0f, layout.getAdvance());
237acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getBounds(&rect);
238acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mLeft);
239acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mTop);
240acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(120.0f, rect.mRight);
241acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(10.0f, rect.mBottom);
242acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
243acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
244acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues.resize(text.size());
245acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        for (size_t i = 0; i < expectedValues.size(); ++i) {
246acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka            expectedValues[i] = 10.0f;
247acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        }
248acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues[3] = 15.0f;
249acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues[4] = 15.0f;
250acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectAdvances(expectedValues, advances, kMaxAdvanceLength);
251acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
252acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka}
253acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
254acd401d02981af51419f4b740abb2c41e4980fdbSeigo NonakaTEST_F(LayoutTest, doLayoutTest_negativeWordSpacing) {
255acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    MinikinPaint paint;
256acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    MinikinRect rect;
257acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    const size_t kMaxAdvanceLength = 32;
258acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    float advances[kMaxAdvanceLength];
259acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    std::vector<float> expectedValues;
260acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
26199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka    Layout layout;
262acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    std::vector<uint16_t> text;
263acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
264acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    // Negative word spacing also should work.
265acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    paint.wordSpacing = -5.0f;
266acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
267acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    {
268acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        SCOPED_TRACE("one word");
269acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        text = utf8ToUtf16("oneword");
27099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
27199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
272acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(70.0f, layout.getAdvance());
273acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getBounds(&rect);
274acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mLeft);
275acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mTop);
276acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(70.0f, rect.mRight);
277acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(10.0f, rect.mBottom);
278acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
279acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
280acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues.resize(text.size());
281acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        for (size_t i = 0; i < expectedValues.size(); ++i) {
282acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka            expectedValues[i] = 10.0f;
283acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        }
284acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectAdvances(expectedValues, advances, kMaxAdvanceLength);
285acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
286acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    {
287acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        SCOPED_TRACE("two words");
288acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        text = utf8ToUtf16("two words");
28999ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
29099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
291acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(85.0f, layout.getAdvance());
292acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getBounds(&rect);
293acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mLeft);
294acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mTop);
295acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(85.0f, rect.mRight);
296acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(10.0f, rect.mBottom);
297acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
298acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
299acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues.resize(text.size());
300acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        for (size_t i = 0; i < expectedValues.size(); ++i) {
301acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka            expectedValues[i] = 10.0f;
302acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        }
303acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues[3] = 5.0f;
304acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectAdvances(expectedValues, advances, kMaxAdvanceLength);
305acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
306acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    {
307acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        SCOPED_TRACE("three words");
308acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        text = utf8ToUtf16("three word test");
30999ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
31099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
311acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(140.0f, layout.getAdvance());
312acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getBounds(&rect);
313acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mLeft);
314acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mTop);
315acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(140.0f, rect.mRight);
316acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(10.0f, rect.mBottom);
317acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
318acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
319acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues.resize(text.size());
320acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        for (size_t i = 0; i < expectedValues.size(); ++i) {
321acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka            expectedValues[i] = 10.0f;
322acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        }
323acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues[5] = 5.0f;
324acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues[10] = 5.0f;
325acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectAdvances(expectedValues, advances, kMaxAdvanceLength);
326acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
327acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    {
328acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        SCOPED_TRACE("two spaces");
329acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        text = utf8ToUtf16("two  spaces");
33099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
33199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
332acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(100.0f, layout.getAdvance());
333acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getBounds(&rect);
334acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mLeft);
335acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(0.0f, rect.mTop);
336acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(100.0f, rect.mRight);
337acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        EXPECT_EQ(10.0f, rect.mBottom);
338acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        resetAdvances(advances, kMaxAdvanceLength);
339acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        layout.getAdvances(advances);
340acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues.resize(text.size());
341acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        for (size_t i = 0; i < expectedValues.size(); ++i) {
342acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka            expectedValues[i] = 10.0f;
343acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        }
344acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues[3] = 5.0f;
345acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectedValues[4] = 5.0f;
346acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka        expectAdvances(expectedValues, advances, kMaxAdvanceLength);
347acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka    }
348acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka}
349acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
350dfbc6e374259f9d81940b5195ac013b02429af27Seigo NonakaTEST_F(LayoutTest, doLayoutTest_rtlTest) {
351dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    MinikinPaint paint;
352dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka
353dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    std::vector<uint16_t> text = parseUnicodeString("'a' 'b' U+3042 U+3043 'c' 'd'");
354dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka
35599ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka    Layout ltrLayout;
35699ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka    ltrLayout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
35799ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka            mCollection);
358dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka
35999ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka    Layout rtlLayout;
36099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka    rtlLayout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_RTL, FontStyle(), paint,
36199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka            mCollection);
362dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka
363dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    ASSERT_EQ(ltrLayout.nGlyphs(), rtlLayout.nGlyphs());
364dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    ASSERT_EQ(6u, ltrLayout.nGlyphs());
365dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka
366dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    size_t nGlyphs = ltrLayout.nGlyphs();
367dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    for (size_t i = 0; i < nGlyphs; ++i) {
368dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka        EXPECT_EQ(ltrLayout.getFont(i), rtlLayout.getFont(nGlyphs - i - 1));
369dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka        EXPECT_EQ(ltrLayout.getGlyphId(i), rtlLayout.getGlyphId(nGlyphs - i - 1));
370dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka    }
371dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka}
372dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka
373c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh PournaderTEST_F(LayoutTest, hyphenationTest) {
37499ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka    Layout layout;
375c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader    std::vector<uint16_t> text;
376c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader
377c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader    // The mock implementation returns 10.0f advance for all glyphs.
378c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader    {
379c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        SCOPED_TRACE("one word with no hyphen edit");
380c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        text = utf8ToUtf16("oneword");
381c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        MinikinPaint paint;
382c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        paint.hyphenEdit = HyphenEdit::NO_EDIT;
38399ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
38499ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
385c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        EXPECT_EQ(70.0f, layout.getAdvance());
386c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader    }
387c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader    {
388c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        SCOPED_TRACE("one word with hyphen insertion at the end");
389c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        text = utf8ToUtf16("oneword");
390c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        MinikinPaint paint;
391c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        paint.hyphenEdit = HyphenEdit::INSERT_HYPHEN_AT_END;
39299ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
39399ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
394c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        EXPECT_EQ(80.0f, layout.getAdvance());
395c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader    }
396c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader    {
397c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        SCOPED_TRACE("one word with hyphen replacement at the end");
398c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        text = utf8ToUtf16("oneword");
399c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        MinikinPaint paint;
400c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        paint.hyphenEdit = HyphenEdit::REPLACE_WITH_HYPHEN_AT_END;
40199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
40299ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
403c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        EXPECT_EQ(70.0f, layout.getAdvance());
404c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader    }
405c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader    {
406c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        SCOPED_TRACE("one word with hyphen insertion at the start");
407c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        text = utf8ToUtf16("oneword");
408c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        MinikinPaint paint;
409c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        paint.hyphenEdit = HyphenEdit::INSERT_HYPHEN_AT_START;
41099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
41199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
412c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        EXPECT_EQ(80.0f, layout.getAdvance());
413c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader    }
414c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader    {
415c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        SCOPED_TRACE("one word with hyphen insertion at the both ends");
416c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        text = utf8ToUtf16("oneword");
417c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        MinikinPaint paint;
418c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        paint.hyphenEdit = HyphenEdit::INSERT_HYPHEN_AT_START | HyphenEdit::INSERT_HYPHEN_AT_END;
41999ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka        layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint,
42099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka                mCollection);
421c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader        EXPECT_EQ(90.0f, layout.getAdvance());
422c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader    }
423c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader}
424c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader
425acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka// TODO: Add more test cases, e.g. measure text, letter spacing.
426acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka
427acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka}  // namespace minikin
428