git-svn-id: https://leveldb.googlecode.com/svn/trunk@33 62dab493-f737-651d-591e-8d6aee1b9529main
parent
ccf0fcd5c2
commit
e0cbd242cb
@ -0,0 +1,115 @@ |
||||
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
||||
|
||||
#include "db/version_set.h" |
||||
#include "util/logging.h" |
||||
#include "util/testharness.h" |
||||
#include "util/testutil.h" |
||||
|
||||
namespace leveldb { |
||||
|
||||
class FindFileTest { |
||||
public: |
||||
std::vector<FileMetaData*> files_; |
||||
|
||||
~FindFileTest() { |
||||
for (int i = 0; i < files_.size(); i++) { |
||||
delete files_[i]; |
||||
} |
||||
} |
||||
|
||||
void Add(const char* smallest, const char* largest) { |
||||
FileMetaData* f = new FileMetaData; |
||||
f->number = files_.size() + 1; |
||||
f->smallest = InternalKey(smallest, 100, kTypeValue); |
||||
f->largest = InternalKey(largest, 100, kTypeValue); |
||||
files_.push_back(f); |
||||
} |
||||
|
||||
int Find(const char* key) { |
||||
InternalKey target(key, 100, kTypeValue); |
||||
InternalKeyComparator cmp(BytewiseComparator()); |
||||
return FindFile(cmp, files_, target.Encode()); |
||||
} |
||||
|
||||
bool Overlaps(const char* smallest, const char* largest) { |
||||
InternalKey s(smallest, 100, kTypeValue); |
||||
InternalKey l(largest, 100, kTypeValue); |
||||
InternalKeyComparator cmp(BytewiseComparator()); |
||||
return SomeFileOverlapsRange(cmp, files_, s, l); |
||||
} |
||||
}; |
||||
|
||||
TEST(FindFileTest, Empty) { |
||||
ASSERT_EQ(0, Find("foo")); |
||||
ASSERT_TRUE(! Overlaps("a", "z")); |
||||
} |
||||
|
||||
TEST(FindFileTest, Single) { |
||||
Add("p", "q"); |
||||
ASSERT_EQ(0, Find("a")); |
||||
ASSERT_EQ(0, Find("p")); |
||||
ASSERT_EQ(0, Find("p1")); |
||||
ASSERT_EQ(0, Find("q")); |
||||
ASSERT_EQ(1, Find("q1")); |
||||
ASSERT_EQ(1, Find("z")); |
||||
|
||||
ASSERT_TRUE(! Overlaps("a", "b")); |
||||
ASSERT_TRUE(! Overlaps("z1", "z2")); |
||||
ASSERT_TRUE(Overlaps("a", "p")); |
||||
ASSERT_TRUE(Overlaps("a", "q")); |
||||
ASSERT_TRUE(Overlaps("a", "z")); |
||||
ASSERT_TRUE(Overlaps("p", "p1")); |
||||
ASSERT_TRUE(Overlaps("p", "q")); |
||||
ASSERT_TRUE(Overlaps("p", "z")); |
||||
ASSERT_TRUE(Overlaps("p1", "p2")); |
||||
ASSERT_TRUE(Overlaps("p1", "z")); |
||||
ASSERT_TRUE(Overlaps("q", "q")); |
||||
ASSERT_TRUE(Overlaps("q", "q1")); |
||||
} |
||||
|
||||
|
||||
TEST(FindFileTest, Multiple) { |
||||
Add("150", "200"); |
||||
Add("200", "250"); |
||||
Add("300", "350"); |
||||
Add("400", "450"); |
||||
ASSERT_EQ(0, Find("100")); |
||||
ASSERT_EQ(0, Find("150")); |
||||
ASSERT_EQ(0, Find("151")); |
||||
ASSERT_EQ(0, Find("199")); |
||||
ASSERT_EQ(0, Find("200")); |
||||
ASSERT_EQ(1, Find("201")); |
||||
ASSERT_EQ(1, Find("249")); |
||||
ASSERT_EQ(1, Find("250")); |
||||
ASSERT_EQ(2, Find("251")); |
||||
ASSERT_EQ(2, Find("299")); |
||||
ASSERT_EQ(2, Find("300")); |
||||
ASSERT_EQ(2, Find("349")); |
||||
ASSERT_EQ(2, Find("350")); |
||||
ASSERT_EQ(3, Find("351")); |
||||
ASSERT_EQ(3, Find("400")); |
||||
ASSERT_EQ(3, Find("450")); |
||||
ASSERT_EQ(4, Find("451")); |
||||
|
||||
ASSERT_TRUE(! Overlaps("100", "149")); |
||||
ASSERT_TRUE(! Overlaps("251", "299")); |
||||
ASSERT_TRUE(! Overlaps("451", "500")); |
||||
ASSERT_TRUE(! Overlaps("351", "399")); |
||||
|
||||
ASSERT_TRUE(Overlaps("100", "150")); |
||||
ASSERT_TRUE(Overlaps("100", "200")); |
||||
ASSERT_TRUE(Overlaps("100", "300")); |
||||
ASSERT_TRUE(Overlaps("100", "400")); |
||||
ASSERT_TRUE(Overlaps("100", "500")); |
||||
ASSERT_TRUE(Overlaps("375", "400")); |
||||
ASSERT_TRUE(Overlaps("450", "450")); |
||||
ASSERT_TRUE(Overlaps("450", "500")); |
||||
} |
||||
|
||||
} |
||||
|
||||
int main(int argc, char** argv) { |
||||
return leveldb::test::RunAllTests(); |
||||
} |
Loading…
Reference in new issue