diff options
Diffstat (limited to 'test/cmap_iterator_test.cc')
-rw-r--r-- | test/cmap_iterator_test.cc | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/test/cmap_iterator_test.cc b/test/cmap_iterator_test.cc new file mode 100644 index 0000000..2e8e6fe --- /dev/null +++ b/test/cmap_iterator_test.cc @@ -0,0 +1,156 @@ +/* + * 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 |