255 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			255 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2021 OceanBase
 | |
|  * OceanBase CE is licensed under Mulan PubL v2.
 | |
|  * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | |
|  * You may obtain a copy of Mulan PubL v2 at:
 | |
|  *          http://license.coscl.org.cn/MulanPubL-2.0
 | |
|  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | |
|  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | |
|  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | |
|  * See the Mulan PubL v2 for more details.
 | |
|  */
 | |
| 
 | |
| #include <gtest/gtest.h>
 | |
| #include "lib/utility/ob_test_util.h"
 | |
| #include "lib/container/ob_array.h"
 | |
| #include "lib/container/ob_se_array.h"
 | |
| using namespace oceanbase::common;
 | |
| 
 | |
| class TestObj
 | |
| {
 | |
| public:
 | |
|   TestObj(int64_t val) : value_(val) {
 | |
|   }
 | |
| 
 | |
|   TestObj() : value_(0) {
 | |
|     std::cout << "construct obj " << value_  << std::endl;
 | |
|   }
 | |
|   ~TestObj() {
 | |
|     std::cout << "destruct obj " << value_ << std::endl;
 | |
|   }
 | |
|   TestObj &operator=(const TestObj &obj) {
 | |
|     std::cout << "assign obj " << obj.value_ << std::endl;
 | |
|     value_ = obj.value_;
 | |
|     return *this;
 | |
|   }
 | |
|   void print() {
 | |
|     std::cout << "print64_t obj " << value_ << std::endl;
 | |
|   }
 | |
| 
 | |
|   const int64_t get() const {
 | |
|     return value_;
 | |
|   }
 | |
| 
 | |
|   void set(int64_t val) {
 | |
|     value_ = val;
 | |
|   }
 | |
|   TO_STRING_KV("value", value_);
 | |
| private:
 | |
|   int64_t value_;
 | |
| };
 | |
| 
 | |
| class TestSEArray: public ::testing::Test
 | |
| {
 | |
| public:
 | |
|   TestSEArray();
 | |
|   virtual ~TestSEArray();
 | |
|   virtual void SetUp();
 | |
|   virtual void TearDown();
 | |
| private:
 | |
|   // disallow copy
 | |
|   DISALLOW_COPY_AND_ASSIGN(TestSEArray);
 | |
| protected:
 | |
|   // function members
 | |
|   void setup(int64_t N, ObIArray<int64_t> &arr);
 | |
|   void verify(int64_t N, const ObIArray<int64_t> &arr);
 | |
|   void verify(int64_t N, const ObIArray<TestObj> &arr);
 | |
|   void extend_to(int64_t N, ObIArray<int64_t> &arr);
 | |
| protected:
 | |
|   // data members
 | |
| };
 | |
| 
 | |
| TestSEArray::TestSEArray()
 | |
| {
 | |
| }
 | |
| 
 | |
| TestSEArray::~TestSEArray()
 | |
| {
 | |
| }
 | |
| 
 | |
| void TestSEArray::SetUp()
 | |
| {
 | |
| }
 | |
| 
 | |
| void TestSEArray::TearDown()
 | |
| {
 | |
| }
 | |
| 
 | |
| void TestSEArray::setup(int64_t N, ObIArray<int64_t> &arr)
 | |
| {
 | |
|   arr.reset();
 | |
|   for (int64_t i = 0;i < N; ++i) {
 | |
|     OK(arr.push_back(i));
 | |
|   } // end for
 | |
| }
 | |
| 
 | |
| void TestSEArray::extend_to(int64_t N, ObIArray<int64_t> &arr)
 | |
| {
 | |
|   ASSERT_TRUE(arr.count() <= N);
 | |
|   for (int64_t i = arr.count(); i < N; ++i) {
 | |
|     OK(arr.push_back(i));
 | |
|   } // end for
 | |
|   ASSERT_EQ(N, arr.count());
 | |
| }
 | |
| 
 | |
| void TestSEArray::verify(int64_t N, const ObIArray<TestObj> &arr)
 | |
| {
 | |
|   ASSERT_EQ(N, arr.count());
 | |
|   for (int64_t i = 0; i < N; ++i) {
 | |
|     ASSERT_EQ(i, arr.at(i).get());
 | |
|   }
 | |
| }
 | |
| 
 | |
| void TestSEArray::verify(int64_t N, const ObIArray<int64_t> &arr)
 | |
| {
 | |
|   ASSERT_EQ(N, arr.count());
 | |
|   for (int64_t i = 0; i < N; ++i) {
 | |
|     ASSERT_EQ(i, arr.at(i));
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| TEST_F(TestSEArray, array_push_pop)
 | |
| {
 | |
|   const int N = 10;
 | |
|   ObSEArray<int64_t, N> arr;
 | |
|   for (int64_t i = 0; i < 2; ++i) {
 | |
|     setup(N, arr);
 | |
|     verify(N, arr);
 | |
|   }
 | |
| 
 | |
|   extend_to(N+9, arr);
 | |
|   verify(N+9, arr);
 | |
| }
 | |
| 
 | |
| TEST_F(TestSEArray, obj_push_assign)
 | |
| {
 | |
|   ObSEArray<TestObj, 30> arr;
 | |
|   {
 | |
|     TestObj obj[10];
 | |
|     for (int64_t i = 0; i < 10; ++i) {
 | |
|       obj[i].set(i);
 | |
|       arr.push_back(obj[i]);
 | |
|     }
 | |
|   }
 | |
|   std::cout << " begin destruct arr" << std::endl;
 | |
| 
 | |
|   ObSEArray<TestObj, 30> arr2;
 | |
|   ObSEArray<TestObj, 3> arr3;
 | |
| 
 | |
|   arr2 = arr;
 | |
|   verify(10, arr2);
 | |
| 
 | |
|   arr3 = arr;
 | |
|   verify(10, arr3);
 | |
| 
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, arr2.assign(arr));
 | |
|   verify(10, arr2);
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, arr3.assign(arr));
 | |
|   verify(10, arr3);
 | |
| }
 | |
| 
 | |
| TEST_F(TestSEArray, place_holder_1)
 | |
| {
 | |
|   ObSEArray<TestObj, 30> arr;
 | |
| 
 | |
|   // test count_ == valid_count_
 | |
|   TestObj *holder = arr.alloc_place_holder();
 | |
|   holder->set(1024);
 | |
|   TestObj elem(3);
 | |
|   ASSERT_EQ(OB_SUCCESS, arr.pop_back(elem));
 | |
|   ASSERT_EQ(1024, elem.get());
 | |
| }
 | |
| 
 | |
| TEST_F(TestSEArray, place_holder_2)
 | |
| {
 | |
|   ObSEArray<TestObj, 10> arr;
 | |
| 
 | |
|   // test count_ < valid_count_
 | |
|   TestObj obj;
 | |
|   for (int64_t i = 0; i < 10; ++i) {
 | |
|     obj.set(i);
 | |
|     arr.push_back(obj);
 | |
|     ASSERT_EQ(arr.for_test_only_valid_count(), arr.count());
 | |
|   }
 | |
| 
 | |
|   arr.alloc_place_holder();
 | |
|   ASSERT_EQ(11, arr.count());
 | |
|   ASSERT_EQ(10, arr.for_test_only_valid_count());
 | |
| 
 | |
|   for (int64_t i = 0; i < 6; ++i) {
 | |
|     arr.pop_back();
 | |
|   }
 | |
|   arr.alloc_place_holder();
 | |
|   ASSERT_EQ(6, arr.count());
 | |
|   ASSERT_EQ(10, arr.for_test_only_valid_count());
 | |
| }
 | |
| 
 | |
| TEST_F(TestSEArray, prepare_alloc)
 | |
| {
 | |
|   // prealloc some objects and do nothing if it exists.
 | |
|   ObSEArray<TestObj, 10> arr;
 | |
|   arr.prepare_allocate(3);
 | |
|   ASSERT_EQ(3, arr.for_test_only_valid_count());
 | |
|   arr.prepare_allocate(8);
 | |
|   ASSERT_EQ(8, arr.for_test_only_valid_count());
 | |
|   arr.prepare_allocate(3);
 | |
|   ASSERT_EQ(8, arr.for_test_only_valid_count());
 | |
|   arr.prepare_allocate(11);
 | |
|   ASSERT_EQ(8, arr.for_test_only_valid_count());
 | |
|   arr.prepare_allocate(9);
 | |
|   ASSERT_EQ(9, arr.for_test_only_valid_count());
 | |
|   arr.prepare_allocate(10);
 | |
|   ASSERT_EQ(10, arr.for_test_only_valid_count());
 | |
|   arr.prepare_allocate(12);
 | |
|   ASSERT_EQ(10, arr.for_test_only_valid_count());
 | |
| }
 | |
| 
 | |
| TEST_F(TestSEArray, copy_construct)
 | |
| {
 | |
|   ObSEArray<int64_t, 10> arr;
 | |
|   setup(10, arr);
 | |
| 
 | |
|   // test copy construct function
 | |
|   ObSEArray<int64_t, 10> copy1 = arr;
 | |
|   verify(10, copy1);
 | |
| }
 | |
| 
 | |
| TEST_F(TestSEArray, remove_core_dump)
 | |
| {
 | |
|   typedef ObArray<int> Item;
 | |
| 
 | |
|   Item item;
 | |
| 
 | |
|   ObSEArray<Item, 2> a;
 | |
| 
 | |
|   ObArray<Item> b;
 | |
|   b.push_back(item);
 | |
|   b.push_back(item);
 | |
|   b.push_back(item);
 | |
| 
 | |
|   a = b;
 | |
|   a.remove(0);
 | |
|   a.remove(0);
 | |
| }
 | |
| 
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   ::testing::InitGoogleTest(&argc,argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 | 
