130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved.
330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License");
530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License.
630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at
730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *      http://www.apache.org/licenses/LICENSE-2.0
930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software
1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS,
1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and
1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License.
1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */
1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/type.h"
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <assert.h>
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <unicode/ucnv.h>
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <string>
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <iostream>
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "gtest/gtest.h"
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/font.h"
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/font_factory.h"
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/core/cmap_table.h"
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/memory_byte_array.h"
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/core/font_header_table.h"
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/tag.h"
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "test/test_utils.h"
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "test/test_font_utils.h"
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "test/test_data.h"
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if GTEST_HAS_PARAM_TEST
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunusing ::testing::TestWithParam;
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunusing ::testing::Values;
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass CMapTestCase {
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CMapTestCase(const char* font_name,
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               int32_t first_platform_id,
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               int32_t first_encoding_id,
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               const char* first_charset_name,
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               int32_t second_platform_id,
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               int32_t second_encoding_id,
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               const char* second_charset_name,
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               int32_t low_char,
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               int32_t high_char)
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      : font_name_(font_name),
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        first_platform_id_(first_platform_id),
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        first_encoding_id_(first_encoding_id),
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        first_charset_name_(first_charset_name),
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        second_platform_id_(second_platform_id),
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        second_encoding_id_(second_encoding_id),
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        second_charset_name_(second_charset_name),
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        low_char_(low_char),
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        high_char_(high_char) {
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  const char* font_name() const { return font_name_; }
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t first_platform_id() const { return first_platform_id_; }
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t first_encoding_id() const { return first_encoding_id_; }
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  const char* first_charset_name() const { return first_charset_name_; }
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t second_platform_id() const { return second_platform_id_; }
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t second_encoding_id() const { return second_encoding_id_; }
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  const char* second_charset_name() const { return second_charset_name_; }
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t low_char() const { return low_char_; }
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t high_char() const { return high_char_; }
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private:
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  const char* font_name_;
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t first_platform_id_;
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t first_encoding_id_;
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  const char* first_charset_name_;
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t second_platform_id_;
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t second_encoding_id_;
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  const char* second_charset_name_;
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t low_char_;
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t high_char_;
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass CMapTests : public :: testing::TestWithParam<CMapTestCase> {
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CMapTests() : encoder1_(NULL), encoder2_(NULL), successful_setup_(false) {
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual void SetUp() {}
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual void TearDown();
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  void CommonSetUp(FontArray* font_array);
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  void CompareCMaps();
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  Ptr<CMapTable::CMap> cmap1_;
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  Ptr<CMapTable::CMap> cmap2_;
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  UConverter* encoder1_;
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  UConverter* encoder2_;
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  bool successful_setup_;
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun::std::ostream& operator<<(::std::ostream& os, const CMapTestCase *test_case) {
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return os << "("
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            << test_case->font_name() << ", "
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            << test_case->first_platform_id() << ", "
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            << test_case->first_encoding_id() << ", "
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            << test_case->first_charset_name() << ", "
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            << test_case->second_platform_id() << ", "
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            << test_case->second_encoding_id() << ", "
11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            << test_case->second_charset_name() << ", "
11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            << test_case->low_char() << ", "
11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            << test_case->high_char() << ")";
11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CMapTests::CommonSetUp(FontArray* font_array) {
11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_NE(font_array, reinterpret_cast<FontArray*>(NULL));
11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_FALSE(font_array->empty());
12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  Ptr<Font> font;
12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  font = font_array->at(0);
12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_NE(font, reinterpret_cast<Font*>(NULL));
12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  Ptr<CMapTable> cmap_table =
12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      down_cast<CMapTable*>(font->GetTable(Tag::cmap));
12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  cmap1_.Attach(cmap_table->GetCMap(GetParam().first_platform_id(),
12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                    GetParam().first_encoding_id()));
12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_NE((cmap1_), reinterpret_cast<CMapTable::CMap*>(NULL));
12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  cmap2_.Attach(cmap_table->GetCMap(GetParam().second_platform_id(),
12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                    GetParam().second_encoding_id()));
13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_NE((cmap2_), reinterpret_cast<CMapTable::CMap*>(NULL));
13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  encoder1_ = TestUtils::GetEncoder(GetParam().first_charset_name());
13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  encoder2_ = TestUtils::GetEncoder(GetParam().second_charset_name());
13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  successful_setup_ = true;
13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CMapTests::TearDown() {
13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  if (encoder1_)
13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    ucnv_close(encoder1_);
13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  if (encoder2_)
14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    ucnv_close(encoder2_);
14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid CMapTests::CompareCMaps() {
14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_TRUE(successful_setup_);
14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  for (int32_t uchar = GetParam().low_char();
14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun       uchar <= GetParam().high_char(); ++uchar) {
14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t c1 = uchar;
14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    if (encoder1_ != NULL)
14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      c1 = TestUtils::EncodeOneChar(encoder1_, (int16_t)uchar);
15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t c2 = uchar;
15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    if (encoder2_ != NULL)
15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      c2 = TestUtils::EncodeOneChar(encoder2_, (int16_t)uchar);
15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t glyph_id1 = cmap1_->GlyphId(c1);
15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int32_t glyph_id2 = cmap2_->GlyphId(c2);
15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef SFNTLY_DEBUG_CMAP
15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    if (glyph_id1 != glyph_id2)
15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      fprintf(stderr, "%x: g1=%x, %x: g2=%x\n", c1, glyph_id1, c2, glyph_id2);
15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    ASSERT_EQ(glyph_id1, glyph_id2);
16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef SFNTLY_SFNTLY_DEBUG_CMAPCMAP
16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fprintf(stderr, "\n");
16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTEST_P(CMapTests, GlyphsBetweenCMapsFingerprint) {
16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  Ptr<FontFactory> font_factory;
16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  font_factory.Attach(FontFactory::GetInstance());
16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  font_factory->FingerprintFont(true);
17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FontArray font_array;
17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  LoadFont(GetParam().font_name(), font_factory, &font_array);
17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CommonSetUp(&font_array);
17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CompareCMaps();
17430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
17530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
17630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTEST_P(CMapTests, GlyphsBetweenCMapsNoFingerprint) {
17730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  Ptr<FontFactory> font_factory;
17830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  font_factory.Attach(FontFactory::GetInstance());
17930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FontArray font_array;
18030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  LoadFont(GetParam().font_name(), font_factory, &font_array);
18130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CommonSetUp(&font_array);
18230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CompareCMaps();
18330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
18430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
18530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTEST_P(CMapTests, GlyphsBetweenCMapsUsingByteVector) {
18630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FontArray font_array;
18730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  LoadFontUsingByteVector(GetParam().font_name(), true, &font_array);
18830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CommonSetUp(&font_array);
18930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CompareCMaps();
19030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
19130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
19230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunCMapTestCase kCMapTestsTestCases[] = {
19330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CMapTestCase(SAMPLE_TTF_FILE,
19430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               PlatformId::kWindows,
19530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               WindowsEncodingId::kUnicodeUCS2,
19630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               NULL,
19730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               PlatformId::kUnicode,
19830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               UnicodeEncodingId::kUnicode2_0_BMP,
19930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               NULL,
20030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               (int32_t)0x20,
20130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun               (int32_t)0x7f),
20230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
20330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
20430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunINSTANTIATE_TEST_CASE_P(CMapTests,
20530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                        CMapTests,
20630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                        ::testing::ValuesIn(kCMapTestsTestCases));
20730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
20830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
20930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else
21030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
21130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {}
21230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
21330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif  // GTEST_HAS_PARAM
214