/* * Copyright 2011 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // type.h needs to be included first because of building issues on Windows // Type aliases we delcare are defined in other headers and make the build // fail otherwise. #include "sfntly/port/type.h" #include <assert.h> #include <stdio.h> #include <unicode/ucnv.h> #include <iostream> #include <string> #include "gtest/gtest.h" #include "sfntly/data/memory_byte_array.h" #include "sfntly/font.h" #include "sfntly/font_factory.h" #include "sfntly/table/core/cmap_table.h" #include "sfntly/table/core/font_header_table.h" #include "sfntly/tag.h" #include "test/autogenerated/cmap_test_data.h" #include "test/test_font_utils.h" #include "test/test_utils.h" #include "test/test_xml_utils.h" namespace sfntly { #if GTEST_HAS_PARAM_TEST using ::testing::TestWithParam; using ::testing::Values; class CMapBasicTests : public :: testing::TestWithParam<const char*> { public: CMapBasicTests() {} virtual void SetUp(); virtual void TearDown() {} Ptr<CMapTable> cmap_table_; TiXmlDocument document_; }; void CMapBasicTests::SetUp() { // Loading the font Ptr<FontFactory> font_factory; font_factory.Attach(FontFactory::GetInstance()); FontArray font_array; std::string font_name = "../../"; #if defined (WIN32) font_name += "../"; #endif font_name += std::string(GetParam()); LoadFont(font_name.c_str(), font_factory, &font_array); ASSERT_FALSE(font_array.empty()); Ptr<Font> font = font_array.at(0); ASSERT_NE(font, reinterpret_cast<Font*>(NULL)); cmap_table_ = down_cast<CMapTable*>(font->GetTable(Tag::cmap)); if (!cmap_table_) fprintf(stderr, "No CMap: %s\n", font_name.c_str()); ASSERT_NE(cmap_table_, reinterpret_cast<CMapTable*>(NULL)); // Loading the XML file document_ = TiXmlDocument((font_name + ".xml").c_str()); ASSERT_TRUE(document_.LoadFile()); } TEST_P(CMapBasicTests, BasicTest) { TiXmlNodeVector* cmap_table = GetNodesWithName(&document_, "cmap_table"); // A font can only have one CMap table ASSERT_EQ(cmap_table->size(), (size_t)1); TiXmlNodeVector* cmaps = GetNodesWithName(cmap_table->at(0), "cmap"); const TiXmlAttribute* num_cmaps_attr = GetAttribute(cmap_table->at(0), "num_cmaps"); ASSERT_NE(num_cmaps_attr, reinterpret_cast<TiXmlAttribute*>(NULL)); // But there may be more than one CMap in this table ASSERT_LE(cmaps->size(), (size_t)num_cmaps_attr->IntValue()); for (TiXmlNodeVector::iterator it = cmaps->begin(); it != cmaps->end(); ++it) { int32_t platform_id = GetAttribute(*it, "platform_id")->IntValue(); int32_t encoding_id = GetAttribute(*it, "encoding_id")->IntValue(); Ptr<CMapTable::CMap> cmap; cmap.Attach(cmap_table_->GetCMap(platform_id, encoding_id)); if (!cmap) { fprintf(stderr, "Cannot test unsupported CMapFormat%d\n", GetAttribute(*it, "format")->IntValue()); continue; } ASSERT_EQ(cmap->platform_id(), platform_id); ASSERT_EQ(cmap->encoding_id(), encoding_id); TiXmlNodeVector* maps = GetNodesWithName(*it, "map"); for (TiXmlNodeVector::iterator jt = maps->begin(); jt != maps->end(); ++jt) { int32_t character; #if defined (WIN32) sscanf_s(GetAttribute(*jt, "char")->Value(), "%x", &character); #else sscanf(GetAttribute(*jt, "char")->Value(), "%x", &character); #endif int32_t glyph_id = GetAttribute(*jt, "gid")->IntValue(); ASSERT_EQ(cmap->GlyphId(character), glyph_id); } delete maps; } delete cmaps; delete cmap_table; } INSTANTIATE_TEST_CASE_P(CMapBasicTests, CMapBasicTests, ::testing::ValuesIn(cmap_test_data::kAllTests)); #else TEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {} #endif // GTEST_HAS_PARAM }