• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <algorithm>
20 
21 #include "gtest/gtest.h"
22 #include "sfntly/port/memory_input_stream.h"
23 #include "sfntly/port/memory_output_stream.h"
24 #include "sfntly/port/type.h"
25 
26 namespace {
27   const char* kTestData =
28 "01234567890123456789012345678901234567890123456789"  // 50
29 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx"  // 100
30 "yz";                                                 // 102
31   const size_t kTestBufferLen = 102;
32 }
33 
34 namespace sfntly {
35 
TestMemoryInputStream()36 bool TestMemoryInputStream() {
37   ByteVector test_buffer;
38   test_buffer.resize(kTestBufferLen);
39   std::copy(kTestData, kTestData + kTestBufferLen, test_buffer.begin());
40 
41   MemoryInputStream is;
42   is.Attach(&(test_buffer[0]), kTestBufferLen);
43   EXPECT_EQ(is.Available(), (int32_t)kTestBufferLen);
44 
45   // Read one byte
46   EXPECT_EQ(is.Read(), '0');  // position 1
47   EXPECT_EQ(is.Read(), '1');  // position 2
48   EXPECT_EQ(is.Read(), '2');  // position 3
49 
50   // Read byte vector
51   ByteVector b;
52   b.resize(7);
53   EXPECT_EQ(is.Read(&b), 7);  // position 10
54   EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + 3, 7), 0);
55 
56   b.resize(17);
57   EXPECT_EQ(is.Read(&b, 7, 10), 10);  // position 20
58   EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + 3, 17), 0);
59 
60   // Test skip
61   b.clear();
62   b.resize(10);
63   EXPECT_EQ(is.Skip(30), 30);  // position 50
64   EXPECT_EQ(is.Read(&b), 10);  // position 60
65   EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + 50, 10), 0);
66   b.clear();
67   b.resize(10);
68   EXPECT_EQ(is.Skip(-20), -20);  // position 40
69   EXPECT_EQ(is.Read(&b), 10);  // position 50
70   EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + 40, 10), 0);
71 
72   EXPECT_EQ(is.Available(), (int32_t)kTestBufferLen - 50);
73   EXPECT_EQ(is.Skip(-60), -50);  // Out of bound, position 0
74   EXPECT_EQ(is.Skip(kTestBufferLen + 10), (int32_t)kTestBufferLen);
75 
76   b.clear();
77   b.resize(10);
78   is.Unread(&b);
79   EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + kTestBufferLen - 10, 10), 0);
80 
81   return true;
82 }
83 
TestMemoryOutputStream()84 bool TestMemoryOutputStream() {
85   ByteVector test_buffer;
86   test_buffer.resize(kTestBufferLen);
87   std::copy(kTestData, kTestData + kTestBufferLen, test_buffer.begin());
88 
89   MemoryOutputStream os;
90   os.Write(&(test_buffer[0]), (int32_t)50, (int32_t)(kTestBufferLen - 50));
91   EXPECT_EQ(os.Size(), kTestBufferLen - 50);
92   EXPECT_EQ(memcmp(os.Get(), &(test_buffer[0]) + 50, kTestBufferLen - 50), 0);
93 
94   return true;
95 }
96 
97 }  // namespace sfntly
98 
TEST(MemoryIO,All)99 TEST(MemoryIO, All) {
100   ASSERT_TRUE(sfntly::TestMemoryInputStream());
101   ASSERT_TRUE(sfntly::TestMemoryOutputStream());
102 }
103