| /* |
| * 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 <algorithm> |
| |
| #include "gtest/gtest.h" |
| #include "sfntly/port/memory_input_stream.h" |
| #include "sfntly/port/memory_output_stream.h" |
| #include "sfntly/port/type.h" |
| |
| namespace { |
| const char* kTestData = |
| "01234567890123456789012345678901234567890123456789" // 50 |
| "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx" // 100 |
| "yz"; // 102 |
| const size_t kTestBufferLen = 102; |
| } |
| |
| namespace sfntly { |
| |
| bool TestMemoryInputStream() { |
| ByteVector test_buffer; |
| test_buffer.resize(kTestBufferLen); |
| std::copy(kTestData, kTestData + kTestBufferLen, test_buffer.begin()); |
| |
| MemoryInputStream is; |
| is.Attach(&(test_buffer[0]), kTestBufferLen); |
| EXPECT_EQ(is.Available(), (int32_t)kTestBufferLen); |
| |
| // Read one byte |
| EXPECT_EQ(is.Read(), '0'); // position 1 |
| EXPECT_EQ(is.Read(), '1'); // position 2 |
| EXPECT_EQ(is.Read(), '2'); // position 3 |
| |
| // Read byte vector |
| ByteVector b; |
| b.resize(7); |
| EXPECT_EQ(is.Read(&b), 7); // position 10 |
| EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + 3, 7), 0); |
| |
| b.resize(17); |
| EXPECT_EQ(is.Read(&b, 7, 10), 10); // position 20 |
| EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + 3, 17), 0); |
| |
| // Test skip |
| b.clear(); |
| b.resize(10); |
| EXPECT_EQ(is.Skip(30), 30); // position 50 |
| EXPECT_EQ(is.Read(&b), 10); // position 60 |
| EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + 50, 10), 0); |
| b.clear(); |
| b.resize(10); |
| EXPECT_EQ(is.Skip(-20), -20); // position 40 |
| EXPECT_EQ(is.Read(&b), 10); // position 50 |
| EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + 40, 10), 0); |
| |
| EXPECT_EQ(is.Available(), (int32_t)kTestBufferLen - 50); |
| EXPECT_EQ(is.Skip(-60), -50); // Out of bound, position 0 |
| EXPECT_EQ(is.Skip(kTestBufferLen + 10), (int32_t)kTestBufferLen); |
| |
| b.clear(); |
| b.resize(10); |
| is.Unread(&b); |
| EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + kTestBufferLen - 10, 10), 0); |
| |
| return true; |
| } |
| |
| bool TestMemoryOutputStream() { |
| ByteVector test_buffer; |
| test_buffer.resize(kTestBufferLen); |
| std::copy(kTestData, kTestData + kTestBufferLen, test_buffer.begin()); |
| |
| MemoryOutputStream os; |
| os.Write(&(test_buffer[0]), (int32_t)50, (int32_t)(kTestBufferLen - 50)); |
| EXPECT_EQ(os.Size(), kTestBufferLen - 50); |
| EXPECT_EQ(memcmp(os.Get(), &(test_buffer[0]) + 50, kTestBufferLen - 50), 0); |
| |
| return true; |
| } |
| |
| } // namespace sfntly |
| |
| TEST(MemoryIO, All) { |
| ASSERT_TRUE(sfntly::TestMemoryInputStream()); |
| ASSERT_TRUE(sfntly::TestMemoryOutputStream()); |
| } |