Home | History | Annotate | Download | only in test
      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 
     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 
     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 
     99 TEST(MemoryIO, All) {
    100   ASSERT_TRUE(sfntly::TestMemoryInputStream());
    101   ASSERT_TRUE(sfntly::TestMemoryOutputStream());
    102 }
    103