19196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka/*
29196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * Copyright (C) 2017 The Android Open Source Project
39196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka *
49196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License");
59196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * you may not use this file except in compliance with the License.
69196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * You may obtain a copy of the License at
79196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka *
89196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka *      http://www.apache.org/licenses/LICENSE-2.0
99196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka *
109196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * Unless required by applicable law or agreed to in writing, software
119196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS,
129196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * See the License for the specific language governing permissions and
149196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka * limitations under the License.
159196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka */
169196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka
179196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include <gtest/gtest.h>
189196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka
199196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include "../util/FontTestUtils.h"
209196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include "../util/MinikinFontForTest.h"
219196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include "HbFontCache.h"
229196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include "MinikinInternal.h"
239196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include "minikin/FontCollection.h"
249196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka#include "minikin/Layout.h"
259196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka
269196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonakanamespace minikin {
279196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka
289196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonakatypedef std::pair<std::string, int> TestParam;
299196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka
309196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonakaclass FontFamilyHarfBuzzCompatibilityTest : public ::testing::TestWithParam<TestParam> {};
319196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka
329196194d76e4325c5bb0c23f22a5787a717067edSeigo NonakaTEST_P(FontFamilyHarfBuzzCompatibilityTest, CoverageTest) {
339196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka    const std::string& fontPath = GetParam().first;
349196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka    int ttcIndex = GetParam().second;
359196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka
369196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka    std::shared_ptr<MinikinFont> font(new MinikinFontForTest(fontPath, ttcIndex));
379196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka    std::shared_ptr<FontFamily> family =
389196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka            std::make_shared<FontFamily>(std::vector<Font>({Font(font, FontStyle())}));
399196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka
409196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka    android::AutoMutex _l(gMinikinLock);
419196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka    hb_font_t* hbFont = getHbFontLocked(font.get());
429196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka
439196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka    for (uint32_t codePoint = 0; codePoint < MAX_UNICODE_CODE_POINT; ++codePoint) {
449196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka        uint32_t unusedGlyph;
459196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka        EXPECT_EQ(family->hasGlyph(codePoint, 0 /* variation selector */),
469196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka                static_cast<bool>(hb_font_get_glyph(hbFont, codePoint, 0 /* variation selector */,
479196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka                        &unusedGlyph)));
489196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka    }
499196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka
509196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka    for (uint32_t vs = VS1; vs < VS256; ++vs) {
519196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka        // Move to variation selectors supplements after variation selectors.
529196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka        if (vs == VS16 + 1) {
539196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka            vs = VS17;
549196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka        }
559196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka        for (uint32_t codePoint = 0; codePoint < MAX_UNICODE_CODE_POINT; ++codePoint) {
569196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka            uint32_t unusedGlyph;
579196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka            ASSERT_EQ(family->hasGlyph(codePoint, vs),
589196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka                    static_cast<bool>(hb_font_get_glyph(hbFont, codePoint, vs, &unusedGlyph)))
599196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka                << "Inconsistent Result: " << fontPath << "#" << ttcIndex
609196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka                << ": U+" << std::hex << codePoint << " U+" << std::hex << vs
619196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka                << " Minikin: " << family->hasGlyph(codePoint, vs)
629196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka                << " HarfBuzz: "
639196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka                << static_cast<bool>(hb_font_get_glyph(hbFont, codePoint, vs, &unusedGlyph));
649196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka
659196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka        }
669196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka    }
679196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka    hb_font_destroy(hbFont);
689196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka}
699196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka
709196194d76e4325c5bb0c23f22a5787a717067edSeigo NonakaINSTANTIATE_TEST_CASE_P(FontFamilyTest,
719196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka        FontFamilyHarfBuzzCompatibilityTest,
729196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka        ::testing::Values(
739196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka                TestParam("/system/fonts/NotoSansCJK-Regular.ttc", 0),
749196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka                TestParam("/system/fonts/NotoColorEmoji.ttf", 0)));
759196194d76e4325c5bb0c23f22a5787a717067edSeigo Nonaka}  // namespace minikin
76