diff options
Diffstat (limited to 'test/name_editing_test.cc')
-rw-r--r-- | test/name_editing_test.cc | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/test/name_editing_test.cc b/test/name_editing_test.cc new file mode 100644 index 0000000..260d9d4 --- /dev/null +++ b/test/name_editing_test.cc @@ -0,0 +1,242 @@ +/* + * 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. + */ + +// Must include this before ICU to avoid stdint redefinition issue. +#include "sfntly/port/type.h" + +#include <unicode/ustring.h> +#include <unicode/unistr.h> + +#include "gtest/gtest.h" +#include "sfntly/data/memory_byte_array.h" +#include "sfntly/font.h" +#include "sfntly/font_factory.h" +#include "sfntly/port/memory_input_stream.h" +#include "sfntly/port/memory_output_stream.h" +#include "sfntly/table/core/name_table.h" +#include "sfntly/tag.h" +#include "test/test_data.h" +#include "test/test_font_utils.h" + +namespace sfntly { + +static ByteVector input_buffer; + +void LoadTestFile(FontFactory* factory, FontBuilderArray* font_builders) { + assert(factory); + assert(font_builders); + if (input_buffer.empty()) { + LoadFile(SAMPLE_TTF_FILE, &input_buffer); + } + factory->LoadFontsForBuilding(&input_buffer, font_builders); +} + +bool TestChangeOneName() { + FontFactoryPtr factory; + factory.Attach(FontFactory::GetInstance()); + FontBuilderArray font_builder_array; + LoadTestFile(factory, &font_builder_array); + FontBuilderPtr font_builder = font_builder_array[0]; + + NameTableBuilderPtr name_builder = down_cast<NameTable::Builder*>( + font_builder->GetTableBuilder(Tag::name)); + + // Change the font name. + NameEntryBuilderPtr neb = + name_builder->NameBuilder(PlatformId::kWindows, + WindowsEncodingId::kUnicodeUCS2, + WindowsLanguageId::kEnglish_UnitedStates, + NameId::kFontFamilyName); + U_STRING_DECL(new_name, "Timothy", 7); + neb->SetName(new_name); + + // Build the font. + FontPtr font; + font.Attach(font_builder->Build()); + + // Serialize and reload the serialized font. + MemoryOutputStream os; + factory->SerializeFont(font, &os); + MemoryInputStream is; + is.Attach(os.Get(), os.Size()); + FontArray font_array; + factory->LoadFonts(&is, &font_array); + FontPtr new_font = font_array[0]; + + // Check the font name. + NameTablePtr name_table = down_cast<NameTable*>(font->GetTable(Tag::name)); + UChar* name = name_table->Name(PlatformId::kWindows, + WindowsEncodingId::kUnicodeUCS2, + WindowsLanguageId::kEnglish_UnitedStates, + NameId::kFontFamilyName); + EXPECT_TRUE(name != NULL); + EXPECT_EQ(u_strcmp(name, new_name), 0); + delete[] name; + return true; +} + +bool TestModifyNameTableAndRevert() { + FontFactoryPtr factory; + factory.Attach(FontFactory::GetInstance()); + FontBuilderArray font_builder_array; + LoadTestFile(factory, &font_builder_array); + FontBuilderPtr font_builder = font_builder_array[0]; + + NameTableBuilderPtr name_builder = down_cast<NameTable::Builder*>( + font_builder->GetTableBuilder(Tag::name)); + + // Change the font name. + NameEntryBuilderPtr neb = + name_builder->NameBuilder(PlatformId::kWindows, + WindowsEncodingId::kUnicodeUCS2, + WindowsLanguageId::kEnglish_UnitedStates, + NameId::kFontFamilyName); + NameTable::NameEntry* neb_entry = neb->name_entry(); + UChar* original_name = neb_entry->Name(); + EXPECT_TRUE(original_name != NULL); + + U_STRING_DECL(new_name, "Timothy", 7); + neb->SetName(new_name); + name_builder->RevertNames(); + + // Build the font. + FontPtr font; + font.Attach(font_builder->Build()); + + // Serialize and reload the serialized font. + MemoryOutputStream os; + factory->SerializeFont(font, &os); + MemoryInputStream is; + is.Attach(os.Get(), os.Size()); + FontArray font_array; + factory->LoadFonts(&is, &font_array); + FontPtr new_font = font_array[0]; + + // Check the font name. + NameTablePtr name_table = down_cast<NameTable*>(font->GetTable(Tag::name)); + UChar* name = name_table->Name(PlatformId::kWindows, + WindowsEncodingId::kUnicodeUCS2, + WindowsLanguageId::kEnglish_UnitedStates, + NameId::kFontFamilyName); + + EXPECT_EQ(u_strcmp(name, original_name), 0); + delete[] name; + delete[] original_name; + + return true; +} + +bool TestRemoveOneName() { + FontFactoryPtr factory; + factory.Attach(FontFactory::GetInstance()); + FontBuilderArray font_builder_array; + LoadTestFile(factory, &font_builder_array); + FontBuilderPtr font_builder = font_builder_array[0]; + + NameTableBuilderPtr name_builder = down_cast<NameTable::Builder*>( + font_builder->GetTableBuilder(Tag::name)); + + EXPECT_TRUE(name_builder->Has(PlatformId::kWindows, + WindowsEncodingId::kUnicodeUCS2, + WindowsLanguageId::kEnglish_UnitedStates, + NameId::kFontFamilyName)); + EXPECT_TRUE(name_builder->Remove(PlatformId::kWindows, + WindowsEncodingId::kUnicodeUCS2, + WindowsLanguageId::kEnglish_UnitedStates, + NameId::kFontFamilyName)); + + // Build the font. + FontPtr font; + font.Attach(font_builder->Build()); + + // Serialize and reload the serialized font. + MemoryOutputStream os; + factory->SerializeFont(font, &os); + MemoryInputStream is; + is.Attach(os.Get(), os.Size()); + FontArray font_array; + factory->LoadFonts(&is, &font_array); + FontPtr new_font = font_array[0]; + + // Check the font name. + NameTablePtr name_table = down_cast<NameTable*>(font->GetTable(Tag::name)); + UChar* name = name_table->Name(PlatformId::kWindows, + WindowsEncodingId::kUnicodeUCS2, + WindowsLanguageId::kEnglish_UnitedStates, + NameId::kFontFamilyName); + EXPECT_TRUE(name == NULL); + + return true; +} + +// Note: Function is not implemented but the test case is built. Uncomment +// when NameTable::clear() is implemented. +/* +bool TestClearAllNamesAndSetOne() { + FontFactoryPtr factory; + factory.Attach(FontFactory::GetInstance()); + FontBuilderArray font_builder_array; + LoadTestFile(factory, &font_builder_array); + FontBuilderPtr font_builder = font_builder_array[0]; + + NameTableBuilderPtr name_builder = down_cast<NameTable::Builder*>( + font_builder->GetTableBuilder(Tag::name)); + + EXPECT_GT(name_builder->builderCount(), 0); + name_builder->clear(); + EXPECT_EQ(name_builder->builderCount(), 0); + + // Change the font name. + NameEntryBuilderPtr neb = + name_builder->NameBuilder(PlatformId::kWindows, + WindowsEncodingId::kUnicodeUCS2, + WindowsLanguageId::kEnglish_UnitedStates, + NameId::kFontFamilyName); + U_STRING_DECL(new_name, "Fred", 4); + neb->SetName(new_name); + + // Build the font. + FontPtr font = font_builder->Build(); + + // Serialize and reload the serialized font. + MemoryOutputStream os; + factory->SerializeFont(font, &os); + FontArray font_array; + ByteArrayPtr new_ba = new MemoryByteArray(os.Get(), os.Size()); + factory->LoadFonts(new_ba, &font_array); + FontPtr new_font = font_array[0]; + + // Check the font name. + NameTablePtr name_table = down_cast<NameTable*>(font->table(Tag::name)); + UChar* name = name_table->Name(PlatformId::kWindows, + WindowsEncodingId::kUnicodeUCS2, + WindowsLanguageId::kEnglish_UnitedStates, + NameId::kFontFamilyName); + EXPECT_EQ(name_table->NameCount(), 1); + EXPECT_EQ(u_strcmp(name, new_name), 0); + + delete[] name; + return true; +} +*/ + +} // namespace sfntly + +TEST(NameEditing, All) { + EXPECT_TRUE(sfntly::TestChangeOneName()); + EXPECT_TRUE(sfntly::TestModifyNameTableAndRevert()); + EXPECT_TRUE(sfntly::TestRemoveOneName()); +} |