1705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka/*
2705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * Copyright (C) 2018 The Android Open Source Project
3705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka *
4705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License");
5705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * you may not use this file except in compliance with the License.
6705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * You may obtain a copy of the License at
7705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka *
8705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka *      http://www.apache.org/licenses/LICENSE-2.0
9705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka *
10705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * Unless required by applicable law or agreed to in writing, software
11705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS,
12705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * See the License for the specific language governing permissions and
14705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka * limitations under the License.
15705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka */
16705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
17705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka#include "minikin/Layout.h"
18705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
19705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka#include <gtest/gtest.h>
20705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
213da4269e6097e0dafdb438c760dafdde13feda95Seigo Nonaka#include "minikin/LayoutCache.h"
223da4269e6097e0dafdb438c760dafdde13feda95Seigo Nonaka
23705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka#include "FontTestUtils.h"
243da4269e6097e0dafdb438c760dafdde13feda95Seigo Nonaka#include "LocaleListCache.h"
25705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka#include "UnicodeUtils.h"
26705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
27705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonakanamespace minikin {
28705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
29705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonakaclass TestableLayoutCache : public LayoutCache {
30705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonakapublic:
31705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    TestableLayoutCache(uint32_t maxEntries) : LayoutCache(maxEntries) {}
32705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka};
33705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
34705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonakaclass LayoutCapture {
35705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonakapublic:
36705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    LayoutCapture() {}
37705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
38705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    void operator()(const Layout& layout) { mLayout = &layout; }
39705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
40705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    const Layout* get() const { return mLayout; }
41705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
42705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonakaprivate:
43705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    const Layout* mLayout;
44705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka};
45705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
46705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo NonakaTEST(LayoutCacheTest, cacheHitTest) {
47705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    auto text = utf8ToUtf16("android");
48705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    Range range(0, text.size());
49705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    MinikinPaint paint(buildFontCollection("Ascii.ttf"));
50705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
51705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    TestableLayoutCache layoutCache(10);
52705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
53705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    LayoutCapture layout1;
54705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    layoutCache.getOrCreate(text, range, paint, false /* LTR */, StartHyphenEdit::NO_EDIT,
55705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                            EndHyphenEdit::NO_EDIT, layout1);
56705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
57705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    LayoutCapture layout2;
58705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    layoutCache.getOrCreate(text, range, paint, false /* LTR */, StartHyphenEdit::NO_EDIT,
59705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                            EndHyphenEdit::NO_EDIT, layout2);
60705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
61705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    EXPECT_EQ(layout1.get(), layout2.get());
62705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka}
63705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
64705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo NonakaTEST(LayoutCacheTest, cacheMissTest) {
65705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    auto text1 = utf8ToUtf16("android");
66705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    auto text2 = utf8ToUtf16("ANDROID");
67705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    MinikinPaint paint(buildFontCollection("Ascii.ttf"));
68705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
69705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    TestableLayoutCache layoutCache(10);
70705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
71705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    LayoutCapture layout1;
72705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    LayoutCapture layout2;
73705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
74705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
75705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different text");
76705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */,
77705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
78705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text2, Range(0, text2.size()), paint, false /* LTR */,
79705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
80705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
81705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
82705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
83705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different range");
84705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */,
85705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
86705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(1, text1.size()), paint, false /* LTR */,
87705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
88705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
89705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
90705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
91705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different text");
92705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */,
93705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
94705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text2, Range(0, text2.size()), paint, false /* LTR */,
95705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
96705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
97705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
98705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
99705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different direction");
100705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */,
101705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
102705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, true /* RTL */,
103705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
104705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
105705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
106705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
107705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different start hyphenation");
108705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */,
109705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
110705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */,
111705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::INSERT_HYPHEN, EndHyphenEdit::NO_EDIT, layout2);
112705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
113705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
114705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
115705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different end hyphen");
116705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */,
117705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
118705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */,
119705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::INSERT_HYPHEN, layout2);
120705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
121705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
122705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
123705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different collection");
124705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint1(buildFontCollection("Ascii.ttf"));
125705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */,
126705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
127705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint2(buildFontCollection("Emoji.ttf"));
128705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */,
129705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
130705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
131705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
132705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
133705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different size");
134705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        auto collection = buildFontCollection("Ascii.ttf");
135705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint1(collection);
136705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint1.size = 10.0f;
137705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */,
138705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
139705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint2(collection);
140705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint2.size = 20.0f;
141705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */,
142705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
143705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
144705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
145705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
146705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different scale X");
147705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        auto collection = buildFontCollection("Ascii.ttf");
148705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint1(collection);
149705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint1.scaleX = 1.0f;
150705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */,
151705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
152705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint2(collection);
153705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint2.scaleX = 2.0f;
154705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */,
155705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
156705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
157705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
158705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
159705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different skew X");
160705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        auto collection = buildFontCollection("Ascii.ttf");
161705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint1(collection);
162705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint1.skewX = 1.0f;
163705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */,
164705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
165705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint2(collection);
166705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint2.skewX = 2.0f;
167705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */,
168705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
169705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
170705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
171705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
172705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different letter spacing");
173705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        auto collection = buildFontCollection("Ascii.ttf");
174705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint1(collection);
175705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint1.letterSpacing = 0.0f;
176705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */,
177705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
178705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint2(collection);
179705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint2.letterSpacing = 1.0f;
180705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */,
181705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
182705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
183705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
184705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
185705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different word spacing");
186705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        auto collection = buildFontCollection("Ascii.ttf");
187705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint1(collection);
188705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint1.wordSpacing = 0.0f;
189705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */,
190705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
191705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint2(collection);
192705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint2.wordSpacing = 1.0f;
193705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */,
194705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
195705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
196705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
197705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
198705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different paint flags");
199705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        auto collection = buildFontCollection("Ascii.ttf");
200705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint1(collection);
201705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint1.paintFlags = 0;
202705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */,
203705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
204705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint2(collection);
205705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint2.paintFlags = LinearTextFlag;
206705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */,
207705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
208705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
209705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
210705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
211705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different locale list ID");
212705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        auto collection = buildFontCollection("Ascii.ttf");
213705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint1(collection);
214705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint1.localeListId = LocaleListCache::getId("en-US");
215705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */,
216705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
217705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint2(collection);
218705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint2.localeListId = LocaleListCache::getId("ja-JP");
219705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */,
220705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
221705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
222705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
223705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
224705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different family variant");
225705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        auto collection = buildFontCollection("Ascii.ttf");
226705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint1(collection);
227705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint1.familyVariant = FontFamily::Variant::DEFAULT;
228705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */,
229705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
230705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint2(collection);
231705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint2.familyVariant = FontFamily::Variant::COMPACT;
232705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */,
233705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
234705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
235705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
236705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    {
237705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        SCOPED_TRACE("Different font feature settings");
238705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        auto collection = buildFontCollection("Ascii.ttf");
239705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint1(collection);
240705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint1.fontFeatureSettings = "";
241705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint1, false /* LTR */,
242705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout1);
243705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        MinikinPaint paint2(collection);
244705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        paint2.fontFeatureSettings = "'liga' on";
245705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint2, false /* LTR */,
246705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
247705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        EXPECT_NE(layout1.get(), layout2.get());
248705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
249705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka}
250705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
251705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo NonakaTEST(LayoutCacheTest, cacheOverflowTest) {
252705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    auto text = utf8ToUtf16("android");
253705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    Range range(0, text.size());
254705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    MinikinPaint paint(buildFontCollection("Ascii.ttf"));
255705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
256705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    TestableLayoutCache layoutCache(5);
257705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
258705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    LayoutCapture layout1;
259705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    layoutCache.getOrCreate(text, range, paint, false /* LTR */, StartHyphenEdit::NO_EDIT,
260705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                            EndHyphenEdit::NO_EDIT, layout1);
261705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
262705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    for (char c = 'a'; c <= 'z'; c++) {
263705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        auto text1 = utf8ToUtf16(std::string(c, 10));
264705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        LayoutCapture layout2;
265705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka        layoutCache.getOrCreate(text1, Range(0, text1.size()), paint, false /* LTR */,
266705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                                StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT, layout2);
267705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    }
268705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
269705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    LayoutCapture layout3;
270705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    layoutCache.getOrCreate(text, range, paint, false /* LTR */, StartHyphenEdit::NO_EDIT,
271705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka                            EndHyphenEdit::NO_EDIT, layout3);
272705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka    EXPECT_NE(layout1.get(), layout3.get());
273705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka}
274705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka
275705f31eef365439e3fe6b3eb60df77d6af1dec70Seigo Nonaka}  // namespace minikin
276