130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved.
330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License");
530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License.
630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at
730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *      http://www.apache.org/licenses/LICENSE-2.0
930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software
1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS,
1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and
1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License.
1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */
1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdio.h>
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "gtest/gtest.h"
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/file_input_stream.h"
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/font_input_stream.h"
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "test/test_data.h"
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TestFileInputStream() {
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FILE* file_handle = NULL;
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (WIN32)
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fopen_s(&file_handle, SAMPLE_TTF_FILE, "rb");
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  file_handle = fopen(SAMPLE_TTF_FILE, "rb");
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  if (file_handle == NULL) {
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    return false;
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fseek(file_handle, 0, SEEK_END);
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  size_t length = ftell(file_handle);
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fseek(file_handle, 0, SEEK_SET);
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector b1;
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b1.resize(length);
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  size_t bytes_read = fread(&(b1[0]), 1, length, file_handle);
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(bytes_read, length);
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fclose(file_handle);
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Full file reading test
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FileInputStream is;
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Open(SAMPLE_TTF_FILE);
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(length, (size_t)is.Available());
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector b2;
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Read(&b2, 0, length);
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Close();
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), length), 0);
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b2.clear();
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Partial reading test
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Open(SAMPLE_TTF_FILE);
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Skip(89);
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Read(&b2, 0, 100);
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0);
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b2.clear();
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Skip test
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Skip(-89);
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Read(&b2, 0, 100);
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b1[100]), &(b2[0]), 100), 0);
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b2.clear();
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Skip(100);
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Read(&b2, 0, 100);
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b1[300]), &(b2[0]), 100), 0);
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Skip(-400);
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b2.clear();
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Offset test
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Read(&b2, 0, 100);
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Read(&b2, 100, 100);
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), 200), 0);
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Unread test
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector b3;
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b3.resize(200);
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Unread(&b3);
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b3[0]), &(b2[0]), 200), 0);
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return true;
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TestFontInputStreamBasic() {
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FILE* file_handle = NULL;
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (WIN32)
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fopen_s(&file_handle, SAMPLE_TTF_FILE, "rb");
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  file_handle = fopen(SAMPLE_TTF_FILE, "rb");
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  if (file_handle == NULL) {
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    return false;
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fseek(file_handle, 0, SEEK_END);
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  size_t length = ftell(file_handle);
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fseek(file_handle, 0, SEEK_SET);
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector b1;
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b1.resize(length);
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  size_t bytes_read = fread(&(b1[0]), 1, length, file_handle);
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(bytes_read, length);
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fclose(file_handle);
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FileInputStream is;
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Open(SAMPLE_TTF_FILE);
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FontInputStream font_is1(&is);
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ((size_t)font_is1.Available(), length);
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector b2;
11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  font_is1.Read(&b2, 0, length);
11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  font_is1.Close();
11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), length), 0);
11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b2.clear();
11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Open(SAMPLE_TTF_FILE);
11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Skip(89);
11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FontInputStream font_is2(&is, 200);
12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  font_is2.Read(&b2, 0, 100);
12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0);
12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  font_is2.Read(&b2, 100, 100);
12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 200), 0);
12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b2.clear();
12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  font_is2.Skip(-200);
12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  font_is2.Read(&b2, 0, 100);
12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0);
12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return true;
13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TestFontInputStreamTableLoading() {
13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FileInputStream is;
13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Open(SAMPLE_TTF_FILE);
13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FontInputStream font_is(&is);
13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  font_is.Skip(TTF_OFFSET[SAMPLE_TTF_FEAT]);
13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FontInputStream gdef_is(&font_is, TTF_LENGTH[SAMPLE_TTF_FEAT]);
13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector feat_data;
14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  gdef_is.Read(&feat_data, 0, TTF_LENGTH[SAMPLE_TTF_FEAT]);
14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(feat_data[0]), TTF_FEAT_DATA,
14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                   TTF_LENGTH[SAMPLE_TTF_FEAT]), 0);
14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return true;
14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTEST(FileIO, All) {
15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_TRUE(sfntly::TestFileInputStream());
15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_TRUE(sfntly::TestFontInputStreamBasic());
15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_TRUE(sfntly::TestFontInputStreamTableLoading());
15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
154