1/*
2 * Copyright 2011 Google Inc. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <stdio.h>
18
19#include "gtest/gtest.h"
20#include "sfntly/port/file_input_stream.h"
21#include "sfntly/data/font_input_stream.h"
22#include "test/test_data.h"
23
24namespace sfntly {
25
26bool TestFileInputStream() {
27  FILE* file_handle = NULL;
28#if defined (WIN32)
29  fopen_s(&file_handle, SAMPLE_TTF_FILE, "rb");
30#else
31  file_handle = fopen(SAMPLE_TTF_FILE, "rb");
32#endif
33  if (file_handle == NULL) {
34    return false;
35  }
36  fseek(file_handle, 0, SEEK_END);
37  size_t length = ftell(file_handle);
38  fseek(file_handle, 0, SEEK_SET);
39  ByteVector b1;
40  b1.resize(length);
41  size_t bytes_read = fread(&(b1[0]), 1, length, file_handle);
42  EXPECT_EQ(bytes_read, length);
43  fclose(file_handle);
44
45  // Full file reading test
46  FileInputStream is;
47  is.Open(SAMPLE_TTF_FILE);
48  EXPECT_EQ(length, (size_t)is.Available());
49  ByteVector b2;
50  is.Read(&b2, 0, length);
51  is.Close();
52  EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), length), 0);
53  b2.clear();
54
55  // Partial reading test
56  is.Open(SAMPLE_TTF_FILE);
57  is.Skip(89);
58  is.Read(&b2, 0, 100);
59  EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0);
60  b2.clear();
61
62  // Skip test
63  is.Skip(-89);
64  is.Read(&b2, 0, 100);
65  EXPECT_EQ(memcmp(&(b1[100]), &(b2[0]), 100), 0);
66  b2.clear();
67  is.Skip(100);
68  is.Read(&b2, 0, 100);
69  EXPECT_EQ(memcmp(&(b1[300]), &(b2[0]), 100), 0);
70  is.Skip(-400);
71  b2.clear();
72
73  // Offset test
74  is.Read(&b2, 0, 100);
75  is.Read(&b2, 100, 100);
76  EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), 200), 0);
77
78  // Unread test
79  ByteVector b3;
80  b3.resize(200);
81  is.Unread(&b3);
82  EXPECT_EQ(memcmp(&(b3[0]), &(b2[0]), 200), 0);
83
84  return true;
85}
86
87bool TestFontInputStreamBasic() {
88  FILE* file_handle = NULL;
89#if defined (WIN32)
90  fopen_s(&file_handle, SAMPLE_TTF_FILE, "rb");
91#else
92  file_handle = fopen(SAMPLE_TTF_FILE, "rb");
93#endif
94  if (file_handle == NULL) {
95    return false;
96  }
97  fseek(file_handle, 0, SEEK_END);
98  size_t length = ftell(file_handle);
99  fseek(file_handle, 0, SEEK_SET);
100  ByteVector b1;
101  b1.resize(length);
102  size_t bytes_read = fread(&(b1[0]), 1, length, file_handle);
103  EXPECT_EQ(bytes_read, length);
104  fclose(file_handle);
105
106  FileInputStream is;
107  is.Open(SAMPLE_TTF_FILE);
108  FontInputStream font_is1(&is);
109  EXPECT_EQ((size_t)font_is1.Available(), length);
110
111  ByteVector b2;
112  font_is1.Read(&b2, 0, length);
113  font_is1.Close();
114  EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), length), 0);
115  b2.clear();
116
117  is.Open(SAMPLE_TTF_FILE);
118  is.Skip(89);
119  FontInputStream font_is2(&is, 200);
120  font_is2.Read(&b2, 0, 100);
121  EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0);
122  font_is2.Read(&b2, 100, 100);
123  EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 200), 0);
124  b2.clear();
125  font_is2.Skip(-200);
126  font_is2.Read(&b2, 0, 100);
127  EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0);
128
129  return true;
130}
131
132bool TestFontInputStreamTableLoading() {
133  FileInputStream is;
134  is.Open(SAMPLE_TTF_FILE);
135  FontInputStream font_is(&is);
136
137  font_is.Skip(TTF_OFFSET[SAMPLE_TTF_FEAT]);
138  FontInputStream gdef_is(&font_is, TTF_LENGTH[SAMPLE_TTF_FEAT]);
139  ByteVector feat_data;
140  gdef_is.Read(&feat_data, 0, TTF_LENGTH[SAMPLE_TTF_FEAT]);
141  EXPECT_EQ(memcmp(&(feat_data[0]), TTF_FEAT_DATA,
142                   TTF_LENGTH[SAMPLE_TTF_FEAT]), 0);
143
144  return true;
145}
146
147}  // namespace sfntly
148
149TEST(FileIO, All) {
150  ASSERT_TRUE(sfntly::TestFileInputStream());
151  ASSERT_TRUE(sfntly::TestFontInputStreamBasic());
152  ASSERT_TRUE(sfntly::TestFontInputStreamTableLoading());
153}
154