summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/fonts/shaping/font_features_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/fonts/shaping/font_features_test.cc')
-rw-r--r--chromium/third_party/blink/renderer/platform/fonts/shaping/font_features_test.cc122
1 files changed, 122 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/platform/fonts/shaping/font_features_test.cc b/chromium/third_party/blink/renderer/platform/fonts/shaping/font_features_test.cc
new file mode 100644
index 00000000000..200cbb343f2
--- /dev/null
+++ b/chromium/third_party/blink/renderer/platform/fonts/shaping/font_features_test.cc
@@ -0,0 +1,122 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/platform/fonts/shaping/font_features.h"
+
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/renderer/platform/fonts/font_description.h"
+
+namespace blink {
+
+namespace {
+
+class FontFeaturesTest : public testing::Test {};
+
+static const FontOrientation orientations[] = {
+ FontOrientation::kHorizontal,
+ FontOrientation::kVerticalRotated,
+ FontOrientation::kVerticalMixed,
+ FontOrientation::kVerticalUpright,
+};
+
+class FontFeaturesByOrientationTest
+ : public FontFeaturesTest,
+ public testing::WithParamInterface<FontOrientation> {
+ public:
+ FontOrientation GetOrientation() const { return GetParam(); }
+ bool IsHorizontal() const { return !IsVerticalAnyUpright(GetOrientation()); }
+};
+
+INSTANTIATE_TEST_SUITE_P(FontFeaturesTest,
+ FontFeaturesByOrientationTest,
+ testing::ValuesIn(orientations));
+
+// Test 'chws' or 'vchw' is on by default.
+TEST_P(FontFeaturesByOrientationTest, EastAsianContextualSpacingOnByDefault) {
+ constexpr hb_tag_t chws = HB_TAG('c', 'h', 'w', 's');
+ constexpr hb_tag_t vchw = HB_TAG('v', 'c', 'h', 'w');
+ FontDescription font_description;
+ font_description.SetOrientation(GetOrientation());
+ FontFeatures features;
+ features.Initialize(font_description);
+ if (IsHorizontal()) {
+ EXPECT_EQ(features.FindValueForTesting(chws), 1u);
+ EXPECT_EQ(features.FindValueForTesting(vchw), base::nullopt);
+ } else {
+ EXPECT_EQ(features.FindValueForTesting(chws), base::nullopt);
+ EXPECT_EQ(features.FindValueForTesting(vchw), 1u);
+ }
+}
+
+// If author opted-in or opted-out, it should be honored.
+TEST_P(FontFeaturesByOrientationTest,
+ EastAsianContextualSpacingHonorsFontFeatureSettings) {
+ constexpr hb_tag_t chws = HB_TAG('c', 'h', 'w', 's');
+ constexpr hb_tag_t vchw = HB_TAG('v', 'c', 'h', 'w');
+ for (unsigned value = 0; value <= 1; ++value) {
+ scoped_refptr<FontFeatureSettings> settings = FontFeatureSettings::Create();
+ settings->Append({IsHorizontal() ? chws : vchw, value});
+ FontDescription font_description;
+ font_description.SetOrientation(GetOrientation());
+ font_description.SetFeatureSettings(settings);
+ FontFeatures features;
+ features.Initialize(font_description);
+ if (IsHorizontal()) {
+ EXPECT_EQ(features.FindValueForTesting(chws), value);
+ EXPECT_EQ(features.FindValueForTesting(vchw), base::nullopt);
+ } else {
+ EXPECT_EQ(features.FindValueForTesting(chws), base::nullopt);
+ EXPECT_EQ(features.FindValueForTesting(vchw), value);
+ }
+ }
+}
+
+// Test glyph-width GPOS features that should not enable 'chws'/'vchw'.
+TEST_P(FontFeaturesByOrientationTest,
+ EastAsianContextualSpacingOffByFeatureSettings) {
+ constexpr hb_tag_t chws = HB_TAG('c', 'h', 'w', 's');
+ constexpr hb_tag_t vchw = HB_TAG('v', 'c', 'h', 'w');
+ const hb_tag_t tags[] = {
+ IsHorizontal() ? HB_TAG('h', 'a', 'l', 't') : HB_TAG('v', 'h', 'a', 'l'),
+ IsHorizontal() ? HB_TAG('p', 'a', 'l', 't') : HB_TAG('v', 'p', 'a', 'l'),
+ };
+ for (const hb_tag_t tag : tags) {
+ scoped_refptr<FontFeatureSettings> settings = FontFeatureSettings::Create();
+ settings->Append({tag, 1});
+ FontDescription font_description;
+ font_description.SetOrientation(GetOrientation());
+ font_description.SetFeatureSettings(settings);
+ FontFeatures features;
+ features.Initialize(font_description);
+ EXPECT_EQ(features.FindValueForTesting(chws), base::nullopt);
+ EXPECT_EQ(features.FindValueForTesting(vchw), base::nullopt);
+ }
+}
+
+// Test the current behavior when multiple glyph-width GPOS features are set via
+// `FontFeatureSettings`. Current |FontFeatures| does not resolve conflicts,
+// just pass them all as specified to HarfBuzz.
+TEST_P(FontFeaturesByOrientationTest, MultipleGlyphWidthGPOS) {
+ const hb_tag_t tags[] = {
+ HB_TAG('c', 'h', 'w', 's'), HB_TAG('v', 'c', 'h', 'w'),
+ HB_TAG('h', 'a', 'l', 't'), HB_TAG('v', 'h', 'a', 'l'),
+ HB_TAG('p', 'a', 'l', 't'), HB_TAG('v', 'p', 'a', 'l'),
+ };
+ scoped_refptr<FontFeatureSettings> settings = FontFeatureSettings::Create();
+ for (const hb_tag_t tag : tags)
+ settings->Append({tag, 1});
+ FontDescription font_description;
+ font_description.SetOrientation(GetOrientation());
+ font_description.SetFeatureSettings(settings);
+ FontFeatures features;
+ features.Initialize(font_description);
+ // Check all features are enabled.
+ for (const hb_tag_t tag : tags)
+ EXPECT_EQ(features.FindValueForTesting(tag), 1u);
+}
+
+} // namespace
+
+} // namespace blink