| /* |
| * 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. |
| */ |
| |
| #include <string.h> |
| |
| #include <vector> |
| #include <string> |
| #include <algorithm> |
| |
| #include "sfntly/font.h" |
| #include "sfntly/font_factory.h" |
| #include "sfntly/table/core/cmap_table.h" |
| #include "sfntly/tag.h" |
| #include "sfntly/port/type.h" |
| #include "sfntly/port/refcount.h" |
| #include "test/test_data.h" |
| #include "test/test_font_utils.h" |
| |
| #include "gtest/gtest.h" |
| |
| #if GTEST_HAS_PARAM_TEST |
| |
| namespace sfntly { |
| using ::testing::TestWithParam; |
| using ::testing::Values; |
| |
| typedef std::vector<bool> BitSet; |
| |
| class CMapIteratorTestCase { |
| public: |
| CMapIteratorTestCase(int32_t platform_id, int32_t encoding_id, |
| const char* file_name) |
| : platform_id_(platform_id), |
| encoding_id_(encoding_id), |
| file_name_(file_name) { |
| } |
| ~CMapIteratorTestCase() {} |
| int32_t platform_id() const { return platform_id_; } |
| int32_t encoding_id() const { return encoding_id_; } |
| const char* file_name() const { return file_name_; } |
| |
| private: |
| int32_t platform_id_; |
| int32_t encoding_id_; |
| const char* file_name_; |
| }; |
| |
| class CMapIteratorTests |
| : public ::testing::TestWithParam<CMapIteratorTestCase> { |
| public: |
| virtual void SetUp(); |
| virtual void TearDown() {} |
| |
| BitSet* GenerateCMapEntries(int32_t start, int32_t count); |
| int32_t CompareCMapIterAndBitSet(CMapTable::CMap::CharacterIterator* |
| character_iterator, |
| BitSet* bit_set); |
| |
| Ptr<CMapTable::CMap> cmap_; |
| }; |
| |
| void CMapIteratorTests::SetUp() { |
| FontArray fonts; |
| Ptr<FontFactory> font_factory; |
| const char* file_name = GetParam().file_name(); |
| LoadFont(file_name, font_factory, &fonts); |
| Ptr<Font> font; |
| font.Attach(fonts[0].Detach()); |
| Ptr<CMapTable> cmap_table = down_cast<CMapTable*>(font->GetTable(Tag::cmap)); |
| ASSERT_FALSE(cmap_table == NULL); |
| cmap_.Attach(cmap_table->GetCMap(GetParam().platform_id(), |
| GetParam().encoding_id())); |
| ASSERT_FALSE(cmap_ == NULL); |
| } |
| |
| BitSet* CMapIteratorTests::GenerateCMapEntries(int32_t start, int32_t count) { |
| BitSet* entries = new BitSet(count); |
| for (int32_t c = start; c < start + count; ++c) { |
| int32_t g = cmap_->GlyphId(c); |
| if (g != CMapTable::NOTDEF) |
| (*entries)[c] = true; |
| } |
| return entries; |
| } |
| |
| int32_t |
| CMapIteratorTests:: |
| CompareCMapIterAndBitSet(CMapTable::CMap::CharacterIterator* character_iterator, |
| BitSet* bit_set) { |
| int32_t iterator_not_bitset_count = 0; |
| BitSet::iterator end = bit_set->end(), |
| beginning = bit_set->begin(), |
| init_beginning = beginning, |
| current = std::find(beginning, end, true); |
| for (int32_t next_bit = current - beginning; |
| character_iterator->HasNext() && current != end; |
| next_bit = current - init_beginning) { |
| int32_t c = character_iterator->Next(); |
| EXPECT_TRUE(c <= next_bit || current == end); |
| if (!(c <= next_bit || current == end)) |
| return -1; |
| if (c == next_bit) { |
| beginning = current + 1; |
| current = std::find(beginning, end, true); |
| } else { |
| iterator_not_bitset_count++; |
| } |
| } |
| EXPECT_EQ(end, current); |
| #if defined (SFNTLY_DEBUG_CMAP) |
| fprintf(stderr, "%s %d: Differences between iterator and bitset: %d\n", |
| cmap_->format(), GetParam().file_name(), iterator_not_bitset_count); |
| #endif |
| return iterator_not_bitset_count; |
| } |
| |
| TEST_P(CMapIteratorTests, IteratorTest) { |
| BitSet* bit_set = GenerateCMapEntries(0, 0x10ffff); |
| CMapTable::CMap::CharacterIterator* character_iterator = NULL; |
| character_iterator = cmap_->Iterator(); |
| EXPECT_NE(character_iterator, |
| reinterpret_cast<CMapTable::CMap::CharacterIterator*>(NULL)); |
| CompareCMapIterAndBitSet(character_iterator, bit_set); |
| delete character_iterator; |
| delete bit_set; |
| } |
| |
| CMapIteratorTestCase kCMapIteratorTestsTestCases[] = { |
| CMapIteratorTestCase(CMapTable::WINDOWS_BMP.platform_id, |
| CMapTable::WINDOWS_BMP.encoding_id, |
| SAMPLE_TTF_FILE) |
| }; |
| |
| INSTANTIATE_TEST_CASE_P(CMapIteratorTests, |
| CMapIteratorTests, |
| ::testing::ValuesIn(kCMapIteratorTestsTestCases)); |
| } |
| |
| #else |
| |
| TEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {} |
| |
| #endif // GTEST_HAS_PARAM |