blob: 345cfd647b11d01fbbde443a1422984c3eac276e [file] [log] [blame]
Seigo Nonaka1f9c4612017-05-01 22:17:36 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gtest/gtest.h>
18
19#include <fcntl.h>
20#include <sys/mman.h>
21#include <sys/stat.h>
22#include <utils/Log.h>
23
24#include "SkFontMgr.h"
25#include "SkStream.h"
26
27#include "hwui/MinikinSkia.h"
28#include "hwui/Typeface.h"
29
30using namespace android;
31
32namespace {
33
34constexpr char kRobotoRegular[] = "/system/fonts/Roboto-Regular.ttf";
35constexpr char kRobotoBold[] = "/system/fonts/Roboto-Bold.ttf";
36constexpr char kRobotoItalic[] = "/system/fonts/Roboto-Italic.ttf";
37constexpr char kRobotoBoldItalic[] = "/system/fonts/Roboto-BoldItalic.ttf";
38
39void unmap(const void* ptr, void* context) {
40 void* p = const_cast<void*>(ptr);
41 size_t len = reinterpret_cast<size_t>(context);
42 munmap(p, len);
43}
44
45std::shared_ptr<minikin::FontFamily> buildFamily(const char* fileName) {
46 int fd = open(fileName, O_RDONLY);
47 LOG_ALWAYS_FATAL_IF(fd == -1, "Failed to open file %s", fileName);
48 struct stat st = {};
49 LOG_ALWAYS_FATAL_IF(fstat(fd, &st) == -1, "Failed to stat file %s", fileName);
50 void* data = mmap(nullptr, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
51 sk_sp<SkData> skData =
52 SkData::MakeWithProc(data, st.st_size, unmap, reinterpret_cast<void*>(st.st_size));
53 std::unique_ptr<SkStreamAsset> fontData(new SkMemoryStream(skData));
54 sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
55 sk_sp<SkTypeface> typeface(fm->createFromStream(fontData.release()));
56 LOG_ALWAYS_FATAL_IF(typeface == nullptr, "Failed to make typeface from %s", fileName);
57 std::shared_ptr<minikin::MinikinFont> font = std::make_shared<MinikinFontSkia>(
58 std::move(typeface), data, st.st_size, 0, std::vector<minikin::FontVariation>());
59 return std::make_shared<minikin::FontFamily>(
60 std::vector<minikin::Font>({ minikin::Font(std::move(font), minikin::FontStyle()) }));
61}
62
63std::vector<std::shared_ptr<minikin::FontFamily>> makeSingleFamlyVector(const char* fileName) {
64 return std::vector<std::shared_ptr<minikin::FontFamily>>({ buildFamily(fileName) });
65}
66
67TEST(TypefaceTest, resolveDefault_and_setDefaultTest) {
68 std::unique_ptr<Typeface> regular(
69 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoRegular),
70 RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
71 EXPECT_EQ(regular.get(), Typeface::resolveDefault(regular.get()));
72
Seigo Nonaka318ca042017-08-01 16:36:18 -070073 // Keep the original to restore it later.
74 const Typeface* old = Typeface::resolveDefault(nullptr);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070075 ASSERT_NE(nullptr, old);
76
77 Typeface::setDefault(regular.get());
78 EXPECT_EQ(regular.get(), Typeface::resolveDefault(nullptr));
79
80 Typeface::setDefault(old); // Restore to the original.
81}
82
83TEST(TypefaceTest, createWithDifferentBaseWeight) {
84 std::unique_ptr<Typeface> bold(Typeface::createWithDifferentBaseWeight(nullptr, 700));
85 EXPECT_EQ(7, bold->fStyle.getWeight());
86 EXPECT_FALSE(bold->fStyle.getItalic());
87 EXPECT_EQ(SkTypeface::kNormal, bold->fSkiaStyle);
88
89 std::unique_ptr<Typeface> light(Typeface::createWithDifferentBaseWeight(nullptr, 300));
90 EXPECT_EQ(3, light->fStyle.getWeight());
91 EXPECT_FALSE(light->fStyle.getItalic());
92 EXPECT_EQ(SkTypeface::kNormal, light->fSkiaStyle);
93}
94
95TEST(TypefaceTest, createRelativeTest_fromRegular) {
96 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.NORMAL);
97 std::unique_ptr<Typeface> normal(Typeface::createRelative(nullptr, SkTypeface::kNormal));
98 EXPECT_EQ(4, normal->fStyle.getWeight());
99 EXPECT_FALSE(normal->fStyle.getItalic());
100 EXPECT_EQ(SkTypeface::kNormal, normal->fSkiaStyle);
101
102 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.BOLD);
103 std::unique_ptr<Typeface> bold(Typeface::createRelative(nullptr, SkTypeface::kBold));
104 EXPECT_EQ(7, bold->fStyle.getWeight());
105 EXPECT_FALSE(bold->fStyle.getItalic());
106 EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
107
108 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.ITALIC);
109 std::unique_ptr<Typeface> italic(Typeface::createRelative(nullptr, SkTypeface::kItalic));
110 EXPECT_EQ(4, italic->fStyle.getWeight());
111 EXPECT_TRUE(italic->fStyle.getItalic());
112 EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
113
114 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.BOLD_ITALIC);
115 std::unique_ptr<Typeface> boldItalic(
116 Typeface::createRelative(nullptr, SkTypeface::kBoldItalic));
117 EXPECT_EQ(7, boldItalic->fStyle.getWeight());
118 EXPECT_TRUE(boldItalic->fStyle.getItalic());
119 EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
120}
121
122TEST(TypefaceTest, createRelativeTest_BoldBase) {
123 std::unique_ptr<Typeface> base(Typeface::createWithDifferentBaseWeight(nullptr, 700));
124
125 // In Java, Typeface.create(Typeface.create("sans-serif-bold"), Typeface.NORMAL);
126 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), SkTypeface::kNormal));
127 EXPECT_EQ(7, normal->fStyle.getWeight());
128 EXPECT_FALSE(normal->fStyle.getItalic());
129 EXPECT_EQ(SkTypeface::kNormal, normal->fSkiaStyle);
130
131 // In Java, Typeface.create(Typeface.create("sans-serif-bold"), Typeface.BOLD);
132 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), SkTypeface::kBold));
133 EXPECT_EQ(10, bold->fStyle.getWeight());
134 EXPECT_FALSE(bold->fStyle.getItalic());
135 EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
136
137 // In Java, Typeface.create(Typeface.create("sans-serif-bold"), Typeface.ITALIC);
138 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), SkTypeface::kItalic));
139 EXPECT_EQ(7, italic->fStyle.getWeight());
140 EXPECT_TRUE(italic->fStyle.getItalic());
141 EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
142
143 // In Java, Typeface.create(Typeface.create("sans-serif-bold"), Typeface.BOLD_ITALIC);
144 std::unique_ptr<Typeface>
145 boldItalic(Typeface::createRelative(base.get(), SkTypeface::kBoldItalic));
146 EXPECT_EQ(10, boldItalic->fStyle.getWeight());
147 EXPECT_TRUE(boldItalic->fStyle.getItalic());
148 EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
149}
150
151TEST(TypefaceTest, createRelativeTest_LightBase) {
152 std::unique_ptr<Typeface> base(Typeface::createWithDifferentBaseWeight(nullptr, 300));
153
154 // In Java, Typeface.create(Typeface.create("sans-serif-light"), Typeface.NORMAL);
155 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), SkTypeface::kNormal));
156 EXPECT_EQ(3, normal->fStyle.getWeight());
157 EXPECT_FALSE(normal->fStyle.getItalic());
158 EXPECT_EQ(SkTypeface::kNormal, normal->fSkiaStyle);
159
160 // In Java, Typeface.create(Typeface.create("sans-serif-light"), Typeface.BOLD);
161 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), SkTypeface::kBold));
162 EXPECT_EQ(6, bold->fStyle.getWeight());
163 EXPECT_FALSE(bold->fStyle.getItalic());
164 EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
165
166 // In Java, Typeface.create(Typeface.create("sans-serif-light"), Typeface.ITLIC);
167 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), SkTypeface::kItalic));
168 EXPECT_EQ(3, italic->fStyle.getWeight());
169 EXPECT_TRUE(italic->fStyle.getItalic());
170 EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
171
172 // In Java, Typeface.create(Typeface.create("sans-serif-light"), Typeface.BOLD_ITALIC);
173 std::unique_ptr<Typeface>
174 boldItalic(Typeface::createRelative(base.get(), SkTypeface::kBoldItalic));
175 EXPECT_EQ(6, boldItalic->fStyle.getWeight());
176 EXPECT_TRUE(boldItalic->fStyle.getItalic());
177 EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
178}
179
180TEST(TypefaceTest, createRelativeTest_fromBoldStyled) {
181 std::unique_ptr<Typeface> base(Typeface::createRelative(nullptr, SkTypeface::kBold));
182
183 // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD), Typeface.NORMAL);
184 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), SkTypeface::kNormal));
185 EXPECT_EQ(4, normal->fStyle.getWeight());
186 EXPECT_FALSE(normal->fStyle.getItalic());
187 EXPECT_EQ(SkTypeface::kNormal, normal->fSkiaStyle);
188
189 // In Java Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD), Typeface.BOLD);
190 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), SkTypeface::kBold));
191 EXPECT_EQ(7, bold->fStyle.getWeight());
192 EXPECT_FALSE(bold->fStyle.getItalic());
193 EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
194
195 // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD), Typeface.ITALIC);
196 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), SkTypeface::kItalic));
197 EXPECT_EQ(4, normal->fStyle.getWeight());
198 EXPECT_TRUE(italic->fStyle.getItalic());
199 EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
200
201 // In Java,
202 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD), Typeface.BOLD_ITALIC);
203 std::unique_ptr<Typeface>
204 boldItalic(Typeface::createRelative(base.get(), SkTypeface::kBoldItalic));
205 EXPECT_EQ(7, boldItalic->fStyle.getWeight());
206 EXPECT_TRUE(boldItalic->fStyle.getItalic());
207 EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
208}
209
210TEST(TypefaceTest, createRelativeTest_fromItalicStyled) {
211 std::unique_ptr<Typeface> base(Typeface::createRelative(nullptr, SkTypeface::kItalic));
212
213 // In Java,
214 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC), Typeface.NORMAL);
215 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), SkTypeface::kNormal));
216 EXPECT_EQ(4, normal->fStyle.getWeight());
217 EXPECT_FALSE(normal->fStyle.getItalic());
218 EXPECT_EQ(SkTypeface::kNormal, normal->fSkiaStyle);
219
220 // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC), Typeface.BOLD);
221 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), SkTypeface::kBold));
222 EXPECT_EQ(7, bold->fStyle.getWeight());
223 EXPECT_FALSE(bold->fStyle.getItalic());
224 EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
225
226 // In Java,
227 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC), Typeface.ITALIC);
228 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), SkTypeface::kItalic));
229 EXPECT_EQ(4, italic->fStyle.getWeight());
230 EXPECT_TRUE(italic->fStyle.getItalic());
231 EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
232
233 // In Java,
234 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC), Typeface.BOLD_ITALIC);
235 std::unique_ptr<Typeface>
236 boldItalic(Typeface::createRelative(base.get(), SkTypeface::kBoldItalic));
237 EXPECT_EQ(7, boldItalic->fStyle.getWeight());
238 EXPECT_TRUE(boldItalic->fStyle.getItalic());
239 EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
240}
241
242TEST(TypefaceTest, createRelativeTest_fromSpecifiedStyled) {
243 std::unique_ptr<Typeface> base(Typeface::createAbsolute(nullptr, 400, false));
244
245 // In Java,
246 // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
247 // .setWeight(700).setItalic(false).build();
248 // Typeface.create(typeface, Typeface.NORMAL);
249 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), SkTypeface::kNormal));
250 EXPECT_EQ(4, normal->fStyle.getWeight());
251 EXPECT_FALSE(normal->fStyle.getItalic());
252 EXPECT_EQ(SkTypeface::kNormal, normal->fSkiaStyle);
253
254 // In Java,
255 // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
256 // .setWeight(700).setItalic(false).build();
257 // Typeface.create(typeface, Typeface.BOLD);
258 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), SkTypeface::kBold));
259 EXPECT_EQ(7, bold->fStyle.getWeight());
260 EXPECT_FALSE(bold->fStyle.getItalic());
261 EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
262
263 // In Java,
264 // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
265 // .setWeight(700).setItalic(false).build();
266 // Typeface.create(typeface, Typeface.ITALIC);
267 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), SkTypeface::kItalic));
268 EXPECT_EQ(4, italic->fStyle.getWeight());
269 EXPECT_TRUE(italic->fStyle.getItalic());
270 EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
271
272 // In Java,
273 // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
274 // .setWeight(700).setItalic(false).build();
275 // Typeface.create(typeface, Typeface.BOLD_ITALIC);
276 std::unique_ptr<Typeface>
277 boldItalic(Typeface::createRelative(base.get(), SkTypeface::kBoldItalic));
278 EXPECT_EQ(7, boldItalic->fStyle.getWeight());
279 EXPECT_TRUE(boldItalic->fStyle.getItalic());
280 EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
281}
282
283TEST(TypefaceTest, createAbsolute) {
284 // In Java,
285 // new Typeface.Builder(invalid).setFallback("sans-serif").setWeight(400).setItalic(false)
286 // .build();
287 std::unique_ptr<Typeface> regular(Typeface::createAbsolute(nullptr, 400, false));
288 EXPECT_EQ(4, regular->fStyle.getWeight());
289 EXPECT_FALSE(regular->fStyle.getItalic());
290 EXPECT_EQ(SkTypeface::kNormal, regular->fSkiaStyle);
291
292 // In Java,
293 // new Typeface.Builder(invalid).setFallback("sans-serif").setWeight(700).setItalic(false)
294 // .build();
295 std::unique_ptr<Typeface> bold(Typeface::createAbsolute(nullptr, 700, false));
296 EXPECT_EQ(7, bold->fStyle.getWeight());
297 EXPECT_FALSE(bold->fStyle.getItalic());
298 EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
299
300 // In Java,
301 // new Typeface.Builder(invalid).setFallback("sans-serif").setWeight(400).setItalic(true)
302 // .build();
303 std::unique_ptr<Typeface> italic(Typeface::createAbsolute(nullptr, 400, true));
304 EXPECT_EQ(4, italic->fStyle.getWeight());
305 EXPECT_TRUE(italic->fStyle.getItalic());
306 EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
307
308 // In Java,
309 // new Typeface.Builder(invalid).setFallback("sans-serif").setWeight(700).setItalic(true)
310 // .build();
311 std::unique_ptr<Typeface> boldItalic(Typeface::createAbsolute(nullptr, 700, true));
312 EXPECT_EQ(7, boldItalic->fStyle.getWeight());
313 EXPECT_TRUE(boldItalic->fStyle.getItalic());
314 EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
315
316 // In Java,
317 // new Typeface.Builder(invalid).setFallback("sans-serif").setWeight(1100).setItalic(true)
318 // .build();
319 std::unique_ptr<Typeface> over1000(Typeface::createAbsolute(nullptr, 1100, false));
320 EXPECT_EQ(10, over1000->fStyle.getWeight());
321 EXPECT_FALSE(over1000->fStyle.getItalic());
322 EXPECT_EQ(SkTypeface::kBold, over1000->fSkiaStyle);
323}
324
325TEST(TypefaceTest, createFromFamilies_Single) {
326 // In Java, new Typeface.Builder("Roboto-Regular.ttf").setWeight(400).setItalic(false).build();
327 std::unique_ptr<Typeface> regular(
328 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoRegular), 400, false));
329 EXPECT_EQ(4, regular->fStyle.getWeight());
330 EXPECT_FALSE(regular->fStyle.getItalic());
331 EXPECT_EQ(SkTypeface::kNormal, regular->fSkiaStyle);
332
333 // In Java, new Typeface.Builder("Roboto-Bold.ttf").setWeight(700).setItalic(false).build();
334 std::unique_ptr<Typeface> bold(
335 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBold), 700, false));
336 EXPECT_EQ(7, bold->fStyle.getWeight());
337 EXPECT_FALSE(bold->fStyle.getItalic());
338 EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
339
340 // In Java, new Typeface.Builder("Roboto-Italic.ttf").setWeight(400).setItalic(true).build();
341 std::unique_ptr<Typeface> italic(
342 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoItalic), 400, true));
343 EXPECT_EQ(4, italic->fStyle.getWeight());
344 EXPECT_TRUE(italic->fStyle.getItalic());
345 EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
346
347 // In Java,
348 // new Typeface.Builder("Roboto-BoldItalic.ttf").setWeight(700).setItalic(true).build();
349 std::unique_ptr<Typeface> boldItalic(
350 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBoldItalic), 700, true));
351 EXPECT_EQ(7, boldItalic->fStyle.getWeight());
352 EXPECT_TRUE(boldItalic->fStyle.getItalic());
353 EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
354
355 // In Java,
356 // new Typeface.Builder("Roboto-BoldItalic.ttf").setWeight(1100).setItalic(false).build();
357 std::unique_ptr<Typeface> over1000(
358 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBold), 1100, false));
359 EXPECT_EQ(10, over1000->fStyle.getWeight());
360 EXPECT_FALSE(over1000->fStyle.getItalic());
361 EXPECT_EQ(SkTypeface::kBold, over1000->fSkiaStyle);
362}
363
364TEST(TypefaceTest, createFromFamilies_Single_resolveByTable) {
365 // In Java, new Typeface.Builder("Roboto-Regular.ttf").build();
366 std::unique_ptr<Typeface> regular(
367 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoRegular),
368 RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
369 EXPECT_EQ(4, regular->fStyle.getWeight());
370 EXPECT_FALSE(regular->fStyle.getItalic());
371 EXPECT_EQ(SkTypeface::kNormal, regular->fSkiaStyle);
372
373 // In Java, new Typeface.Builder("Roboto-Bold.ttf").build();
374 std::unique_ptr<Typeface> bold(
375 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBold),
376 RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
377 EXPECT_EQ(7, bold->fStyle.getWeight());
378 EXPECT_FALSE(bold->fStyle.getItalic());
379 EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
380
381 // In Java, new Typeface.Builder("Roboto-Italic.ttf").build();
382 std::unique_ptr<Typeface> italic(
383 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoItalic),
384 RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
385 EXPECT_EQ(4, italic->fStyle.getWeight());
386 EXPECT_TRUE(italic->fStyle.getItalic());
387 EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
388
389 // In Java, new Typeface.Builder("Roboto-BoldItalic.ttf").build();
390 std::unique_ptr<Typeface> boldItalic(
391 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBoldItalic),
392 RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
393 EXPECT_EQ(7, boldItalic->fStyle.getWeight());
394 EXPECT_TRUE(boldItalic->fStyle.getItalic());
395 EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
396}
397
398TEST(TypefaceTest, createFromFamilies_Family) {
399 std::vector<std::shared_ptr<minikin::FontFamily>> families = {
400 buildFamily(kRobotoRegular), buildFamily(kRobotoBold), buildFamily(kRobotoItalic),
401 buildFamily(kRobotoBoldItalic)
402 };
403 std::unique_ptr<Typeface> typeface(Typeface::createFromFamilies(std::move(families),
404 RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
405 EXPECT_EQ(4, typeface->fStyle.getWeight());
406 EXPECT_FALSE(typeface->fStyle.getItalic());
407}
408
409TEST(TypefaceTest, createFromFamilies_Family_withoutRegular) {
410 std::vector<std::shared_ptr<minikin::FontFamily>> families = {
411 buildFamily(kRobotoBold), buildFamily(kRobotoItalic), buildFamily(kRobotoBoldItalic)
412 };
413 std::unique_ptr<Typeface> typeface(Typeface::createFromFamilies(std::move(families),
414 RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
415 EXPECT_EQ(7, typeface->fStyle.getWeight());
416 EXPECT_FALSE(typeface->fStyle.getItalic());
417}
418
419} // namespace