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 <algorithm>
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "gtest/gtest.h"
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/memory_input_stream.h"
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/memory_output_stream.h"
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/type.h"
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace {
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  const char* kTestData =
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun"01234567890123456789012345678901234567890123456789"  // 50
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx"  // 100
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun"yz";                                                 // 102
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  const size_t kTestBufferLen = 102;
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TestMemoryInputStream() {
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector test_buffer;
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  test_buffer.resize(kTestBufferLen);
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  std::copy(kTestData, kTestData + kTestBufferLen, test_buffer.begin());
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  MemoryInputStream is;
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Attach(&(test_buffer[0]), kTestBufferLen);
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Available(), (int32_t)kTestBufferLen);
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Read one byte
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Read(), '0');  // position 1
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Read(), '1');  // position 2
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Read(), '2');  // position 3
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Read byte vector
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector b;
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b.resize(7);
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Read(&b), 7);  // position 10
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + 3, 7), 0);
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b.resize(17);
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Read(&b, 7, 10), 10);  // position 20
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + 3, 17), 0);
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Test skip
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b.clear();
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b.resize(10);
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Skip(30), 30);  // position 50
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Read(&b), 10);  // position 60
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + 50, 10), 0);
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b.clear();
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b.resize(10);
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Skip(-20), -20);  // position 40
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Read(&b), 10);  // position 50
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + 40, 10), 0);
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Available(), (int32_t)kTestBufferLen - 50);
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Skip(-60), -50);  // Out of bound, position 0
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(is.Skip(kTestBufferLen + 10), (int32_t)kTestBufferLen);
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b.clear();
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b.resize(10);
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Unread(&b);
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(&(b[0]), &(test_buffer[0]) + kTestBufferLen - 10, 10), 0);
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return true;
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TestMemoryOutputStream() {
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector test_buffer;
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  test_buffer.resize(kTestBufferLen);
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  std::copy(kTestData, kTestData + kTestBufferLen, test_buffer.begin());
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  MemoryOutputStream os;
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  os.Write(&(test_buffer[0]), (int32_t)50, (int32_t)(kTestBufferLen - 50));
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(os.Size(), kTestBufferLen - 50);
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(os.Get(), &(test_buffer[0]) + 50, kTestBufferLen - 50), 0);
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return true;
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTEST(MemoryIO, All) {
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_TRUE(sfntly::TestMemoryInputStream());
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_TRUE(sfntly::TestMemoryOutputStream());
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
103