/* * 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 <stdio.h> #include "gtest/gtest.h" #include "sfntly/port/file_input_stream.h" #include "sfntly/data/font_input_stream.h" #include "test/test_data.h" namespace sfntly { bool TestFileInputStream() { FILE* file_handle = NULL; #if defined (WIN32) fopen_s(&file_handle, SAMPLE_TTF_FILE, "rb"); #else file_handle = fopen(SAMPLE_TTF_FILE, "rb"); #endif if (file_handle == NULL) { return false; } fseek(file_handle, 0, SEEK_END); size_t length = ftell(file_handle); fseek(file_handle, 0, SEEK_SET); ByteVector b1; b1.resize(length); size_t bytes_read = fread(&(b1[0]), 1, length, file_handle); EXPECT_EQ(bytes_read, length); fclose(file_handle); // Full file reading test FileInputStream is; is.Open(SAMPLE_TTF_FILE); EXPECT_EQ(length, (size_t)is.Available()); ByteVector b2; is.Read(&b2, 0, length); is.Close(); EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), length), 0); b2.clear(); // Partial reading test is.Open(SAMPLE_TTF_FILE); is.Skip(89); is.Read(&b2, 0, 100); EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0); b2.clear(); // Skip test is.Skip(-89); is.Read(&b2, 0, 100); EXPECT_EQ(memcmp(&(b1[100]), &(b2[0]), 100), 0); b2.clear(); is.Skip(100); is.Read(&b2, 0, 100); EXPECT_EQ(memcmp(&(b1[300]), &(b2[0]), 100), 0); is.Skip(-400); b2.clear(); // Offset test is.Read(&b2, 0, 100); is.Read(&b2, 100, 100); EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), 200), 0); // Unread test ByteVector b3; b3.resize(200); is.Unread(&b3); EXPECT_EQ(memcmp(&(b3[0]), &(b2[0]), 200), 0); return true; } bool TestFontInputStreamBasic() { FILE* file_handle = NULL; #if defined (WIN32) fopen_s(&file_handle, SAMPLE_TTF_FILE, "rb"); #else file_handle = fopen(SAMPLE_TTF_FILE, "rb"); #endif if (file_handle == NULL) { return false; } fseek(file_handle, 0, SEEK_END); size_t length = ftell(file_handle); fseek(file_handle, 0, SEEK_SET); ByteVector b1; b1.resize(length); size_t bytes_read = fread(&(b1[0]), 1, length, file_handle); EXPECT_EQ(bytes_read, length); fclose(file_handle); FileInputStream is; is.Open(SAMPLE_TTF_FILE); FontInputStream font_is1(&is); EXPECT_EQ((size_t)font_is1.Available(), length); ByteVector b2; font_is1.Read(&b2, 0, length); font_is1.Close(); EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), length), 0); b2.clear(); is.Open(SAMPLE_TTF_FILE); is.Skip(89); FontInputStream font_is2(&is, 200); font_is2.Read(&b2, 0, 100); EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0); font_is2.Read(&b2, 100, 100); EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 200), 0); b2.clear(); font_is2.Skip(-200); font_is2.Read(&b2, 0, 100); EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0); return true; } bool TestFontInputStreamTableLoading() { FileInputStream is; is.Open(SAMPLE_TTF_FILE); FontInputStream font_is(&is); font_is.Skip(TTF_OFFSET[SAMPLE_TTF_FEAT]); FontInputStream gdef_is(&font_is, TTF_LENGTH[SAMPLE_TTF_FEAT]); ByteVector feat_data; gdef_is.Read(&feat_data, 0, TTF_LENGTH[SAMPLE_TTF_FEAT]); EXPECT_EQ(memcmp(&(feat_data[0]), TTF_FEAT_DATA, TTF_LENGTH[SAMPLE_TTF_FEAT]), 0); return true; } } // namespace sfntly TEST(FileIO, All) { ASSERT_TRUE(sfntly::TestFileInputStream()); ASSERT_TRUE(sfntly::TestFontInputStreamBasic()); ASSERT_TRUE(sfntly::TestFontInputStreamTableLoading()); }