#include #include "leveldb/db.h" #include "leveldb/options.h" #include "gtest/gtest.h" class RangeQueryTest : public ::testing::Test { protected: leveldb::DB* db; leveldb::Options options; std::string db_path = "/tmp/range_testdb"; void SetUp() override { options.create_if_missing = true; leveldb::Status status = leveldb::DB::Open(options, db_path, &db); ASSERT_TRUE(status.ok()) << "Failed to open DB: " << status.ToString(); } void TearDown() override { delete db; } }; TEST_F(RangeQueryTest, TestRangeQuery) { // 插入一组键值对 std::vector> data = { {"a_key1", "value1"}, {"a_key2", "value2"}, {"b_key3", "value3"}, {"b_key4", "value4"}, {"c_key5", "value5"} }; for (const auto& pair : data) { const std::string& key = pair.first; const std::string& value = pair.second; leveldb::Status status = db->Put(leveldb::WriteOptions(), key, value); ASSERT_TRUE(status.ok()) << "Failed to put data: " << status.ToString(); } // 查询范围内的键值对 std::string range_start = "a_key1"; std::string range_end = "b_key4"; std::vector> expected_data = { {"a_key1", "value1"}, {"a_key2", "value2"}, {"b_key3", "value3"}, {"b_key4", "value4"} }; leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions()); it->Seek(range_start); // 从范围起始位置开始 std::vector> actual_data; while (it->Valid() && it->key().ToString() <= range_end) { actual_data.emplace_back(it->key().ToString(), it->value().ToString()); it->Next(); } delete it; // 验证范围查询结果是否符合预期 ASSERT_EQ(actual_data.size(), expected_data.size()) << "Range query results size mismatch."; for (size_t i = 0; i < actual_data.size(); ++i) { EXPECT_EQ(actual_data[i].first, expected_data[i].first) << "Key mismatch at index " << i; EXPECT_EQ(actual_data[i].second, expected_data[i].second) << "Value mismatch at index " << i; } // 输出范围查询结果 for (const auto& pair : actual_data) { const std::string& key = pair.first; const std::string& value = pair.second; std::cout << "Key: " << key << ", Value: " << value << std::endl; } } int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }