wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

592 lines
18 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>
#define private public
#include "lib/container/ob_bit_set.h"
#include "lib/utility/ob_test_util.h"
#include "lib/container/ob_array.h"
using namespace oceanbase::common;
class TestBitSet: public ::testing::Test
{
public:
TestBitSet();
virtual ~TestBitSet();
virtual void SetUp();
virtual void TearDown();
private:
// disallow copy
DISALLOW_COPY_AND_ASSIGN(TestBitSet);
protected:
// function members
protected:
// data members
};
TestBitSet::TestBitSet()
{
}
TestBitSet::~TestBitSet()
{
}
void TestBitSet::SetUp()
{
}
void TestBitSet::TearDown()
{
}
TEST_F(TestBitSet, add_and_del_number)
{
ObBitSet<16> bs;
ASSERT_TRUE(OB_SUCCESS != bs.add_member(-1));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
ASSERT_TRUE(!bs.has_member(-1));
ASSERT_TRUE(!bs.has_member(1));
ASSERT_TRUE(bs.has_member(5));
ASSERT_TRUE(bs.has_member(50));
ASSERT_FALSE(OB_SUCCESS == bs.del_member(-1));
ASSERT_TRUE(OB_SUCCESS == bs.del_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.del_member(500));
ASSERT_TRUE(!bs.has_member(1));
ASSERT_TRUE(!bs.has_member(5));
ASSERT_TRUE(bs.has_member(50));
}
TEST_F(TestBitSet, get_bitset_word)
{
ObBitSet<16> bs;
ASSERT_EQ(0, bs.get_bitset_word(-1));
ASSERT_EQ(0, bs.get_bitset_word(1));
ASSERT_EQ(0, bs.get_bitset_word(2));
ASSERT_EQ(0, bs.get_bitset_word(3));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(90));
ASSERT_EQ(32, bs.get_bitset_word(0));
ASSERT_EQ(262144, bs.get_bitset_word(1));
ASSERT_EQ(67108864, bs.get_bitset_word(2));
}
TEST_F(TestBitSet, add_and_del_members)
{
ObBitSet<16> bs;
ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
ObBitSet<16> bs2;
ASSERT_TRUE(OB_SUCCESS == bs2.add_member(15));
ASSERT_TRUE(OB_SUCCESS == bs2.add_member(50));
ASSERT_TRUE(OB_SUCCESS == bs2.add_member(100));
ASSERT_TRUE(OB_SUCCESS == bs2.add_member(200));
bs.del_members(bs2);
ASSERT_TRUE(bs.has_member(5));
ASSERT_TRUE(!bs.has_member(50));
ASSERT_TRUE(!bs.has_member(100));
ASSERT_TRUE(bs.has_member(111));
ASSERT_TRUE(OB_SUCCESS == bs.add_members(bs2));
ASSERT_TRUE(OB_SUCCESS == bs2.add_member(200));
ASSERT_TRUE(bs.has_member(50));
ASSERT_TRUE(bs.has_member(100));
ASSERT_TRUE(bs.has_member(200));
ASSERT_TRUE(bs.has_member(15));
ASSERT_EQ(6, bs.num_members());
}
TEST_F(TestBitSet, do_mask)
{
ObBitSet<16> bs;
ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
ASSERT_TRUE(OB_SUCCESS == bs.do_mask(6,101));
ASSERT_TRUE(bs.has_member(50));
ASSERT_TRUE(bs.has_member(100));
ASSERT_TRUE(!bs.has_member(5));
ASSERT_TRUE(!bs.has_member(111));
ASSERT_TRUE(!bs.has_member(121));
}
TEST_F(TestBitSet, to_string)
{
ObBitSet<16> bs;
ASSERT_TRUE(bs.is_empty());
OB_LOG(INFO, "TO_STRING", K(bs));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
ASSERT_FALSE(bs.is_empty());
OB_LOG(INFO, "TO_STRING", K(bs));
}
TEST_F(TestBitSet, set_operation)
{
ObBitSet<16> bs;
ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
ASSERT_TRUE(OB_SUCCESS == bs.do_mask(5,101));
//is_superset && is_subset
ObBitSet<16> bs1;
ASSERT_TRUE(bs.is_superset(bs1));
ASSERT_TRUE(bs1.is_subset(bs));
ASSERT_FALSE(bs1.is_superset(bs));
ASSERT_FALSE(bs.is_subset(bs1));
ASSERT_TRUE(OB_SUCCESS == bs1.add_member(5));
ASSERT_FALSE(bs1.is_superset(bs));
ASSERT_FALSE(bs.is_subset(bs1));
ASSERT_TRUE(OB_SUCCESS == bs1.add_member(50));
ASSERT_TRUE(OB_SUCCESS == bs1.add_member(100));
ASSERT_TRUE(bs.is_superset(bs1));
ASSERT_TRUE(bs1.is_subset(bs));
}
TEST_F(TestBitSet, overlap)
{
ObBitSet<16> bs;
ObBitSet<16> bs1;
ASSERT_FALSE(bs.overlap(bs1));
ASSERT_FALSE(bs1.overlap(bs));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
ASSERT_TRUE(OB_SUCCESS == bs1.add_member(51));
ASSERT_TRUE(OB_SUCCESS == bs1.add_member(101));
ASSERT_FALSE(bs.overlap(bs1));
ASSERT_FALSE(bs1.overlap(bs));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(101));
ASSERT_TRUE(bs.overlap(bs1));
ASSERT_TRUE(bs1.overlap(bs));
}
TEST_F(TestBitSet, number_and_clear)
{
ObBitSet<128> bs;
ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
ASSERT_EQ(4, bs.num_members());
ObArenaAllocator allocator("BitSet");
//test case with allocator
ObBitSet<16, ObIAllocator&> bs1(allocator);
ASSERT_EQ(0, bs1.bitset_word_count());
ASSERT_TRUE(OB_SUCCESS == bs1.add_member(5));
ASSERT_EQ(1, bs1.bitset_word_count());
ASSERT_TRUE(OB_SUCCESS == bs1.add_member(50));
ASSERT_EQ(2, bs1.bitset_word_count());
ASSERT_TRUE(OB_SUCCESS == bs1.add_member(100));
ASSERT_EQ(4, bs1.bitset_word_count());
ASSERT_TRUE(OB_SUCCESS == bs1.add_member(111));
ASSERT_EQ(4, bs1.bitset_word_count());
ASSERT_EQ(4, bs1.num_members());
ASSERT_EQ(4, bs1.bitset_word_count());
ASSERT_TRUE(bs1.has_member(5));
ASSERT_TRUE(bs1.has_member(50));
ASSERT_TRUE(bs1.has_member(100));
ASSERT_TRUE(bs1.has_member(111));
bs1.reuse();
ASSERT_EQ(0, bs1.bitset_word_count());
ASSERT_TRUE(bs1.is_empty());
ASSERT_FALSE(bs1.has_member(5));
ASSERT_FALSE(bs1.has_member(50));
ASSERT_FALSE(bs1.has_member(100));
ASSERT_FALSE(bs1.has_member(101));
}
TEST_F(TestBitSet, to_array)
{
ObBitSet<128> bs;
ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
ObArray<int64_t> arr;
OK(bs.to_array(arr));
ASSERT_EQ(4, arr.count());
ASSERT_EQ(5, arr.at(0));
ASSERT_EQ(50, arr.at(1));
ASSERT_EQ(100, arr.at(2));
ASSERT_EQ(111, arr.at(3));
}
TEST_F(TestBitSet, construct)
{
ObBitSet<16> bs;
ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
ObBitSet<16> bs1(bs);
ASSERT_TRUE(bs == bs1);
ASSERT_TRUE(bs1.has_member(5));
ASSERT_TRUE(bs1.has_member(50));
ASSERT_TRUE(bs1.has_member(100));
ASSERT_TRUE(bs1.has_member(111));
ASSERT_FALSE(bs1.has_member(101));
ASSERT_TRUE(OB_SUCCESS == bs1.del_member(5));
ASSERT_FALSE(bs == bs1);
ASSERT_TRUE(OB_SUCCESS == bs.del_member(5));
ASSERT_TRUE(OB_SUCCESS == bs1.add_member(10));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(10));
ASSERT_TRUE(bs == bs1);
ASSERT_TRUE(bs.equal(bs1));
}
TEST_F(TestBitSet, get_first_peculiar_bit)
{
ObBitSet<16> bs;
ObBitSet<16> bs1;
ASSERT_EQ(-1, bs.get_first_peculiar_bit(bs1));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(10));
ASSERT_TRUE(OB_SUCCESS == bs1.add_member(10));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
ASSERT_EQ(5, bs.get_first_peculiar_bit(bs1));
ASSERT_TRUE(OB_SUCCESS == bs1.add_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
ASSERT_EQ(50, bs.get_first_peculiar_bit(bs1));
}
TEST_F(TestBitSet, serialize)
{
ObBitSet<128> bs;
ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
const int64_t BUF_LEN = 1024;
char buf[1024];
int64_t pos = 0;
int64_t pos1 = 0;
ASSERT_EQ(OB_SUCCESS, bs.serialize(buf, BUF_LEN, pos));
ObBitSet<128> bs1;
ASSERT_EQ(OB_SUCCESS, bs1.deserialize(buf, BUF_LEN, pos1));
ASSERT_TRUE(bs.equal(bs1));
ASSERT_EQ(bs.get_serialize_size(), bs.get_serialize_size());
}
TEST_F(TestBitSet, find_and_clear)
{
ObBitSet<128> bs;
// test find next
ASSERT_EQ(OB_SUCCESS, bs.add_member(0));
ASSERT_EQ(OB_SUCCESS, bs.add_member(5));
ASSERT_EQ(OB_SUCCESS, bs.add_member(31));
ASSERT_EQ(OB_SUCCESS, bs.add_member(32));
ASSERT_EQ(OB_SUCCESS, bs.add_member(52));
ASSERT_EQ(OB_SUCCESS, bs.add_member(63));
ASSERT_EQ(OB_SUCCESS, bs.add_member(64));
ASSERT_EQ(OB_SUCCESS, bs.add_member(121));
int64_t pos = 0;
ASSERT_EQ(OB_INVALID_ARGUMENT, bs.find_next(-2, pos));
ASSERT_EQ(OB_SUCCESS, bs.find_next(-1, pos));
ASSERT_EQ(0, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_first(pos));
ASSERT_EQ(0, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(5, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(31, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(32, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(52, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(63, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(64, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(121, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(128, pos));
ASSERT_EQ(-1, pos);
// test clear all
bs.clear_all();
ASSERT_EQ(OB_SUCCESS, bs.find_first(pos));
ASSERT_EQ(-1, pos);
// test find prev
ASSERT_EQ(OB_SUCCESS, bs.find_prev(150, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(128, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(129, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, bs.find_prev(-1, pos));
ASSERT_EQ(OB_INVALID_ARGUMENT, bs.find_prev(-10, pos));
ASSERT_EQ(OB_SUCCESS, bs.find_prev(0, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(28, pos));
ASSERT_EQ(-1, pos);
bs.reset();
ASSERT_EQ(OB_SUCCESS, bs.add_member(90));
bs.clear_all();
ASSERT_EQ(OB_SUCCESS, bs.add_member(59));
ASSERT_EQ(OB_SUCCESS, bs.find_prev(75, pos));
ASSERT_EQ(59, pos);
bs.reset();
ASSERT_EQ(OB_SUCCESS, bs.add_member(31));
ASSERT_EQ(OB_SUCCESS, bs.find_prev(100, pos));
ASSERT_EQ(1, bs.bitset_word_count());
ASSERT_EQ(31, pos);
bs.clear_all();
ASSERT_EQ(OB_SUCCESS, bs.add_member(0));
ASSERT_EQ(OB_SUCCESS, bs.add_member(121));
ASSERT_EQ(OB_SUCCESS, bs.find_prev(120, pos));
ASSERT_EQ(0, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(127, pos));
ASSERT_EQ(121, pos);
ASSERT_EQ(OB_SUCCESS, bs.add_member(5));
ASSERT_EQ(OB_SUCCESS, bs.add_member(31));
ASSERT_EQ(OB_SUCCESS, bs.add_member(32));
ASSERT_EQ(OB_SUCCESS, bs.add_member(52));
ASSERT_EQ(OB_SUCCESS, bs.add_member(63));
ASSERT_EQ(OB_SUCCESS, bs.add_member(96));
ASSERT_EQ(OB_SUCCESS, bs.find_prev(120, pos));
ASSERT_EQ(96, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
ASSERT_EQ(63, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
ASSERT_EQ(52, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
ASSERT_EQ(32, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
ASSERT_EQ(31, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
ASSERT_EQ(5, pos);
}
TEST_F(TestBitSet, find_and_clear_for_fix_bit_set)
{
ObFixedBitSet<128> bs;
// test find next
ASSERT_EQ(OB_SUCCESS, bs.add_member(0));
ASSERT_EQ(OB_SUCCESS, bs.add_member(5));
ASSERT_EQ(OB_SUCCESS, bs.add_member(31));
ASSERT_EQ(OB_SUCCESS, bs.add_member(32));
ASSERT_EQ(OB_SUCCESS, bs.add_member(52));
ASSERT_EQ(OB_SUCCESS, bs.add_member(63));
ASSERT_EQ(OB_SUCCESS, bs.add_member(64));
ASSERT_EQ(OB_SUCCESS, bs.add_member(121));
int64_t pos = 0;
ASSERT_EQ(OB_INVALID_ARGUMENT, bs.find_next(-2, pos));
ASSERT_EQ(OB_SUCCESS, bs.find_next(-1, pos));
ASSERT_EQ(0, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_first(pos));
ASSERT_EQ(0, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(5, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(31, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(32, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(52, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(63, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(64, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(121, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_next(128, pos));
ASSERT_EQ(-1, pos);
// test clear all
bs.clear_all();
ASSERT_EQ(OB_SUCCESS, bs.find_first(pos));
ASSERT_EQ(-1, pos);
// test find prev
ASSERT_EQ(OB_SUCCESS, bs.find_prev(150, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(128, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(129, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, bs.find_prev(-1, pos));
ASSERT_EQ(OB_INVALID_ARGUMENT, bs.find_prev(-10, pos));
ASSERT_EQ(OB_SUCCESS, bs.find_prev(0, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(28, pos));
ASSERT_EQ(-1, pos);
bs.reset();
ASSERT_EQ(OB_SUCCESS, bs.add_member(90));
bs.clear_all();
ASSERT_EQ(OB_SUCCESS, bs.add_member(59));
ASSERT_EQ(OB_SUCCESS, bs.find_prev(75, pos));
ASSERT_EQ(59, pos);
bs.reset();
ASSERT_EQ(OB_SUCCESS, bs.add_member(31));
ASSERT_EQ(OB_SUCCESS, bs.find_prev(100, pos));
ASSERT_EQ(31, pos);
bs.clear_all();
ASSERT_EQ(OB_SUCCESS, bs.add_member(0));
ASSERT_EQ(OB_SUCCESS, bs.add_member(121));
ASSERT_EQ(OB_SUCCESS, bs.find_prev(120, pos));
ASSERT_EQ(0, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(127, pos));
ASSERT_EQ(121, pos);
ASSERT_EQ(OB_SUCCESS, bs.add_member(5));
ASSERT_EQ(OB_SUCCESS, bs.add_member(31));
ASSERT_EQ(OB_SUCCESS, bs.add_member(32));
ASSERT_EQ(OB_SUCCESS, bs.add_member(52));
ASSERT_EQ(OB_SUCCESS, bs.add_member(63));
ASSERT_EQ(OB_SUCCESS, bs.add_member(96));
ASSERT_EQ(OB_SUCCESS, bs.find_prev(120, pos));
ASSERT_EQ(96, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
ASSERT_EQ(63, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
ASSERT_EQ(52, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
ASSERT_EQ(32, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
ASSERT_EQ(31, pos);
ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
ASSERT_EQ(5, pos);
ObFixedBitSet<126> bs2;
// test find next
ASSERT_EQ(OB_SUCCESS, bs2.add_member(0));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(5));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(31));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(32));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(52));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(63));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(64));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(121));
pos = 0;
ASSERT_EQ(OB_INVALID_ARGUMENT, bs2.find_next(-2, pos));
ASSERT_EQ(OB_SUCCESS, bs2.find_next(-1, pos));
ASSERT_EQ(0, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_first(pos));
ASSERT_EQ(0, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
ASSERT_EQ(5, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
ASSERT_EQ(31, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
ASSERT_EQ(32, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
ASSERT_EQ(52, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
ASSERT_EQ(63, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
ASSERT_EQ(64, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
ASSERT_EQ(121, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_next(126, pos));
ASSERT_EQ(-1, pos);
// test clear all
bs2.clear_all();
ASSERT_EQ(OB_SUCCESS, bs2.find_first(pos));
ASSERT_EQ(-1, pos);
// test find prev
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(150, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(126, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(127, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_INVALID_ARGUMENT, bs2.find_prev(-1, pos));
ASSERT_EQ(OB_INVALID_ARGUMENT, bs2.find_prev(-10, pos));
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(0, pos));
ASSERT_EQ(-1, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(28, pos));
ASSERT_EQ(-1, pos);
bs2.reset();
ASSERT_EQ(OB_SUCCESS, bs2.add_member(90));
bs2.clear_all();
ASSERT_EQ(OB_SUCCESS, bs2.add_member(59));
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(75, pos));
ASSERT_EQ(59, pos);
bs2.reset();
ASSERT_EQ(OB_SUCCESS, bs2.add_member(31));
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(100, pos));
ASSERT_EQ(31, pos);
bs2.clear_all();
ASSERT_EQ(OB_SUCCESS, bs2.add_member(0));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(121));
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(120, pos));
ASSERT_EQ(0, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(125, pos));
ASSERT_EQ(121, pos);
ASSERT_EQ(OB_SUCCESS, bs2.add_member(5));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(31));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(32));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(52));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(63));
ASSERT_EQ(OB_SUCCESS, bs2.add_member(96));
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(120, pos));
ASSERT_EQ(96, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(pos, pos));
ASSERT_EQ(63, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(pos, pos));
ASSERT_EQ(52, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(pos, pos));
ASSERT_EQ(32, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(pos, pos));
ASSERT_EQ(31, pos);
ASSERT_EQ(OB_SUCCESS, bs2.find_prev(pos, pos));
ASSERT_EQ(5, pos);
}
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}