1*834a2baaSAndroid Build Coastguard Worker /*
2*834a2baaSAndroid Build Coastguard Worker * Copyright (C) 2021 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 "FontTestUtils.h"
22*834a2baaSAndroid Build Coastguard Worker #include "minikin/FontFeature.h"
23*834a2baaSAndroid Build Coastguard Worker #include "minikin/MinikinPaint.h"
24*834a2baaSAndroid Build Coastguard Worker
25*834a2baaSAndroid Build Coastguard Worker namespace minikin {
26*834a2baaSAndroid Build Coastguard Worker
27*834a2baaSAndroid Build Coastguard Worker namespace {
28*834a2baaSAndroid Build Coastguard Worker
29*834a2baaSAndroid Build Coastguard Worker constexpr hb_tag_t chws_tag = HB_TAG('c', 'h', 'w', 's');
30*834a2baaSAndroid Build Coastguard Worker constexpr hb_tag_t clig_tag = HB_TAG('c', 'l', 'i', 'g');
31*834a2baaSAndroid Build Coastguard Worker constexpr hb_tag_t halt_tag = HB_TAG('h', 'a', 'l', 't');
32*834a2baaSAndroid Build Coastguard Worker constexpr hb_tag_t liga_tag = HB_TAG('l', 'i', 'g', 'a');
33*834a2baaSAndroid Build Coastguard Worker constexpr hb_tag_t palt_tag = HB_TAG('p', 'a', 'l', 't');
34*834a2baaSAndroid Build Coastguard Worker constexpr hb_tag_t ruby_tag = HB_TAG('r', 'u', 'b', 'y');
35*834a2baaSAndroid Build Coastguard Worker
compareFeatureTag(hb_feature_t l,hb_feature_t r)36*834a2baaSAndroid Build Coastguard Worker bool compareFeatureTag(hb_feature_t l, hb_feature_t r) {
37*834a2baaSAndroid Build Coastguard Worker return l.tag < r.tag;
38*834a2baaSAndroid Build Coastguard Worker }
39*834a2baaSAndroid Build Coastguard Worker
40*834a2baaSAndroid Build Coastguard Worker } // namespace
41*834a2baaSAndroid Build Coastguard Worker
42*834a2baaSAndroid Build Coastguard Worker class DefaultFontFeatureTest : public testing::Test {
43*834a2baaSAndroid Build Coastguard Worker protected:
44*834a2baaSAndroid Build Coastguard Worker std::shared_ptr<FontCollection> font;
45*834a2baaSAndroid Build Coastguard Worker
SetUp()46*834a2baaSAndroid Build Coastguard Worker virtual void SetUp() override { font = buildFontCollection("Ascii.ttf"); }
47*834a2baaSAndroid Build Coastguard Worker };
48*834a2baaSAndroid Build Coastguard Worker
TEST_F(DefaultFontFeatureTest,default)49*834a2baaSAndroid Build Coastguard Worker TEST_F(DefaultFontFeatureTest, default) {
50*834a2baaSAndroid Build Coastguard Worker auto f = cleanAndAddDefaultFontFeatures(MinikinPaint(font));
51*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, f.size());
52*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(chws_tag, f[0].tag);
53*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(f[0].value);
54*834a2baaSAndroid Build Coastguard Worker }
55*834a2baaSAndroid Build Coastguard Worker
TEST_F(DefaultFontFeatureTest,disable)56*834a2baaSAndroid Build Coastguard Worker TEST_F(DefaultFontFeatureTest, disable) {
57*834a2baaSAndroid Build Coastguard Worker auto paint = MinikinPaint(font);
58*834a2baaSAndroid Build Coastguard Worker paint.fontFeatureSettings = FontFeature::parse("\"chws\" off");
59*834a2baaSAndroid Build Coastguard Worker
60*834a2baaSAndroid Build Coastguard Worker auto f = cleanAndAddDefaultFontFeatures(paint);
61*834a2baaSAndroid Build Coastguard Worker std::sort(f.begin(), f.end(), compareFeatureTag);
62*834a2baaSAndroid Build Coastguard Worker
63*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, f.size());
64*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(chws_tag, f[0].tag);
65*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(f[0].value);
66*834a2baaSAndroid Build Coastguard Worker }
67*834a2baaSAndroid Build Coastguard Worker
TEST_F(DefaultFontFeatureTest,preserve)68*834a2baaSAndroid Build Coastguard Worker TEST_F(DefaultFontFeatureTest, preserve) {
69*834a2baaSAndroid Build Coastguard Worker auto paint = MinikinPaint(font);
70*834a2baaSAndroid Build Coastguard Worker paint.fontFeatureSettings = FontFeature::parse("\"ruby\" on");
71*834a2baaSAndroid Build Coastguard Worker
72*834a2baaSAndroid Build Coastguard Worker auto f = cleanAndAddDefaultFontFeatures(paint);
73*834a2baaSAndroid Build Coastguard Worker std::sort(f.begin(), f.end(), compareFeatureTag);
74*834a2baaSAndroid Build Coastguard Worker
75*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, f.size());
76*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(chws_tag, f[0].tag);
77*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(f[0].value);
78*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(ruby_tag, f[1].tag);
79*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(f[1].value);
80*834a2baaSAndroid Build Coastguard Worker }
81*834a2baaSAndroid Build Coastguard Worker
TEST_F(DefaultFontFeatureTest,large_letter_spacing)82*834a2baaSAndroid Build Coastguard Worker TEST_F(DefaultFontFeatureTest, large_letter_spacing) {
83*834a2baaSAndroid Build Coastguard Worker auto paint = MinikinPaint(font);
84*834a2baaSAndroid Build Coastguard Worker paint.letterSpacing = 1.0; // em
85*834a2baaSAndroid Build Coastguard Worker
86*834a2baaSAndroid Build Coastguard Worker auto f = cleanAndAddDefaultFontFeatures(paint);
87*834a2baaSAndroid Build Coastguard Worker std::sort(f.begin(), f.end(), compareFeatureTag);
88*834a2baaSAndroid Build Coastguard Worker
89*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3u, f.size());
90*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(chws_tag, f[0].tag);
91*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(f[0].value);
92*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(clig_tag, f[1].tag);
93*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(f[1].value);
94*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(liga_tag, f[2].tag);
95*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(f[2].value);
96*834a2baaSAndroid Build Coastguard Worker }
97*834a2baaSAndroid Build Coastguard Worker
TEST_F(DefaultFontFeatureTest,halt_disable_chws)98*834a2baaSAndroid Build Coastguard Worker TEST_F(DefaultFontFeatureTest, halt_disable_chws) {
99*834a2baaSAndroid Build Coastguard Worker auto paint = MinikinPaint(font);
100*834a2baaSAndroid Build Coastguard Worker paint.fontFeatureSettings = FontFeature::parse("\"halt\" on");
101*834a2baaSAndroid Build Coastguard Worker
102*834a2baaSAndroid Build Coastguard Worker auto f = cleanAndAddDefaultFontFeatures(paint);
103*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, f.size());
104*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(halt_tag, f[0].tag);
105*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(f[0].value);
106*834a2baaSAndroid Build Coastguard Worker }
107*834a2baaSAndroid Build Coastguard Worker
TEST_F(DefaultFontFeatureTest,palt_disable_chws)108*834a2baaSAndroid Build Coastguard Worker TEST_F(DefaultFontFeatureTest, palt_disable_chws) {
109*834a2baaSAndroid Build Coastguard Worker auto paint = MinikinPaint(font);
110*834a2baaSAndroid Build Coastguard Worker paint.fontFeatureSettings = FontFeature::parse("\"palt\" on");
111*834a2baaSAndroid Build Coastguard Worker
112*834a2baaSAndroid Build Coastguard Worker auto f = cleanAndAddDefaultFontFeatures(paint);
113*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, f.size());
114*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(palt_tag, f[0].tag);
115*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(f[0].value);
116*834a2baaSAndroid Build Coastguard Worker }
117*834a2baaSAndroid Build Coastguard Worker
TEST_F(DefaultFontFeatureTest,halt_disable_chws_large_letter_spacing)118*834a2baaSAndroid Build Coastguard Worker TEST_F(DefaultFontFeatureTest, halt_disable_chws_large_letter_spacing) {
119*834a2baaSAndroid Build Coastguard Worker auto paint = MinikinPaint(font);
120*834a2baaSAndroid Build Coastguard Worker paint.letterSpacing = 1.0; // em
121*834a2baaSAndroid Build Coastguard Worker paint.fontFeatureSettings = FontFeature::parse("\"halt\" on");
122*834a2baaSAndroid Build Coastguard Worker
123*834a2baaSAndroid Build Coastguard Worker auto f = cleanAndAddDefaultFontFeatures(paint);
124*834a2baaSAndroid Build Coastguard Worker std::sort(f.begin(), f.end(), compareFeatureTag);
125*834a2baaSAndroid Build Coastguard Worker
126*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3u, f.size());
127*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(clig_tag, f[0].tag);
128*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(f[0].value);
129*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(halt_tag, f[1].tag);
130*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(f[1].value);
131*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(liga_tag, f[2].tag);
132*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(f[2].value);
133*834a2baaSAndroid Build Coastguard Worker }
134*834a2baaSAndroid Build Coastguard Worker
TEST_F(DefaultFontFeatureTest,palt_disable_chws_large_letter_spacing)135*834a2baaSAndroid Build Coastguard Worker TEST_F(DefaultFontFeatureTest, palt_disable_chws_large_letter_spacing) {
136*834a2baaSAndroid Build Coastguard Worker auto paint = MinikinPaint(font);
137*834a2baaSAndroid Build Coastguard Worker paint.letterSpacing = 1.0; // em
138*834a2baaSAndroid Build Coastguard Worker paint.fontFeatureSettings = FontFeature::parse("\"palt\" on");
139*834a2baaSAndroid Build Coastguard Worker
140*834a2baaSAndroid Build Coastguard Worker auto f = cleanAndAddDefaultFontFeatures(paint);
141*834a2baaSAndroid Build Coastguard Worker std::sort(f.begin(), f.end(), compareFeatureTag);
142*834a2baaSAndroid Build Coastguard Worker
143*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3u, f.size());
144*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(clig_tag, f[0].tag);
145*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(f[0].value);
146*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(liga_tag, f[1].tag);
147*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(f[1].value);
148*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(palt_tag, f[2].tag);
149*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(f[2].value);
150*834a2baaSAndroid Build Coastguard Worker }
151*834a2baaSAndroid Build Coastguard Worker
152*834a2baaSAndroid Build Coastguard Worker class FontFeatureTest : public testing::Test {
153*834a2baaSAndroid Build Coastguard Worker protected:
154*834a2baaSAndroid Build Coastguard Worker std::shared_ptr<FontCollection> font;
155*834a2baaSAndroid Build Coastguard Worker
SetUp()156*834a2baaSAndroid Build Coastguard Worker virtual void SetUp() override { font = buildFontCollection("Ascii.ttf"); }
157*834a2baaSAndroid Build Coastguard Worker };
158*834a2baaSAndroid Build Coastguard Worker
159*834a2baaSAndroid Build Coastguard Worker } // namespace minikin
160