1d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi/* 2d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * Copyright (C) 2014 The Android Open Source Project 3d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * 4d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License"); 5d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * you may not use this file except in compliance with the License. 6d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * You may obtain a copy of the License at 7d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * 8d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * http://www.apache.org/licenses/LICENSE-2.0 9d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * 10d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software 11d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS, 12d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * See the License for the specific language governing permissions and 14d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi * limitations under the License. 15d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi */ 16d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi 1788bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/utils/buffer_with_extendable_buffer.h" 18d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi 19d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi#include <gtest/gtest.h> 20d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi 21d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanaginamespace latinime { 22d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanaginamespace { 23d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi 24d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagiconst int DEFAULT_MAX_BUFFER_SIZE = 1024; 25d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi 26d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke KuroyanagiTEST(BufferWithExtendablebufferTest, TestWriteAndRead) { 27d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi BufferWithExtendableBuffer buffer(DEFAULT_MAX_BUFFER_SIZE); 28d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi int pos = 0; 29d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi // 1 byte 30d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi const uint32_t data_1 = 0xFF; 31d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(buffer.writeUint(data_1, 1 /* size */, pos)); 32d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_EQ(data_1, buffer.readUint(1, pos)); 33d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi pos += 1; 34d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi // 2 byte 35d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi const uint32_t data_2 = 0xFFFF; 36d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(buffer.writeUint(data_2, 2 /* size */, pos)); 37d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_EQ(data_2, buffer.readUint(2, pos)); 38d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi pos += 2; 39d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi // 3 byte 40d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi const uint32_t data_3 = 0xFFFFFF; 41d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(buffer.writeUint(data_3, 3 /* size */, pos)); 42d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_EQ(data_3, buffer.readUint(3, pos)); 43d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi pos += 3; 44d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi // 4 byte 45d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi const uint32_t data_4 = 0xFFFFFFFF; 46d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(buffer.writeUint(data_4, 4 /* size */, pos)); 47d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_EQ(data_4, buffer.readUint(4, pos)); 48d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi} 49d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi 50d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke KuroyanagiTEST(BufferWithExtendablebufferTest, TestExtend) { 51d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi BufferWithExtendableBuffer buffer(DEFAULT_MAX_BUFFER_SIZE); 52d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_EQ(0, buffer.getTailPosition()); 53d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(buffer.writeUint(0xFF /* data */, 4 /* size */, 0 /* pos */)); 54d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_EQ(4, buffer.getTailPosition()); 55d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(buffer.extend(8 /* size */)); 56d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_EQ(12, buffer.getTailPosition()); 57d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(buffer.writeUint(0xFFFF /* data */, 4 /* size */, 8 /* pos */)); 58d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(buffer.writeUint(0xFF /* data */, 4 /* size */, 0 /* pos */)); 59d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi} 60d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi 61d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke KuroyanagiTEST(BufferWithExtendablebufferTest, TestCopy) { 62d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi BufferWithExtendableBuffer buffer(DEFAULT_MAX_BUFFER_SIZE); 63d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(buffer.writeUint(0xFF /* data */, 4 /* size */, 0 /* pos */)); 64d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(buffer.writeUint(0xFFFF /* data */, 4 /* size */, 4 /* pos */)); 65d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi BufferWithExtendableBuffer targetBuffer(DEFAULT_MAX_BUFFER_SIZE); 66d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(targetBuffer.copy(&buffer)); 67d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_EQ(0xFFu, targetBuffer.readUint(4 /* size */, 0 /* pos */)); 68d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_EQ(0xFFFFu, targetBuffer.readUint(4 /* size */, 4 /* pos */)); 69d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi} 70d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi 71d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke KuroyanagiTEST(BufferWithExtendablebufferTest, TestSizeLimit) { 72d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi BufferWithExtendableBuffer emptyBuffer(0 /* maxAdditionalBufferSize */); 73d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_FALSE(emptyBuffer.writeUint(0 /* data */, 1 /* size */, 0 /* pos */)); 74d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_FALSE(emptyBuffer.extend(1 /* size */)); 75d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi 76d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi BufferWithExtendableBuffer smallBuffer(4 /* maxAdditionalBufferSize */); 77d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(smallBuffer.writeUint(0 /* data */, 4 /* size */, 0 /* pos */)); 78d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_FALSE(smallBuffer.writeUint(0 /* data */, 1 /* size */, 4 /* pos */)); 79d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi 80d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(smallBuffer.copy(&emptyBuffer)); 81d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_FALSE(emptyBuffer.copy(&smallBuffer)); 82d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi 83d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi BufferWithExtendableBuffer buffer(DEFAULT_MAX_BUFFER_SIZE); 84d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_FALSE(buffer.isNearSizeLimit()); 85d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi int pos = 0; 86d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi while (!buffer.isNearSizeLimit()) { 87d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_TRUE(buffer.writeUintAndAdvancePosition(0 /* data */, 4 /* size */, &pos)); 88d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi } 89d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_GT(pos, 0); 90d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi EXPECT_LE(pos, DEFAULT_MAX_BUFFER_SIZE); 91d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi} 92d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi 93d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi} // namespace 94d4c9d50ef07494ed96d448a1e26df637a64232ddKeisuke Kuroyanagi} // namespace latinime 95