| /* |
| * 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 |
| } |