| 482 | } |
| 483 | |
| 484 | void TestRandomAccess(Random* rnd, const std::vector<std::string>& keys, |
| 485 | const KVMap& data) { |
| 486 | static const bool kVerbose = false; |
| 487 | Iterator* iter = constructor_->NewIterator(); |
| 488 | ASSERT_TRUE(!iter->Valid()); |
| 489 | KVMap::const_iterator model_iter = data.begin(); |
| 490 | if (kVerbose) fprintf(stderr, "---\n"); |
| 491 | for (int i = 0; i < 200; i++) { |
| 492 | const int toss = rnd->Uniform(5); |
| 493 | switch (toss) { |
| 494 | case 0: { |
| 495 | if (iter->Valid()) { |
| 496 | if (kVerbose) fprintf(stderr, "Next\n"); |
| 497 | iter->Next(); |
| 498 | ++model_iter; |
| 499 | ASSERT_EQ(ToString(data, model_iter), ToString(iter)); |
| 500 | } |
| 501 | break; |
| 502 | } |
| 503 | |
| 504 | case 1: { |
| 505 | if (kVerbose) fprintf(stderr, "SeekToFirst\n"); |
| 506 | iter->SeekToFirst(); |
| 507 | model_iter = data.begin(); |
| 508 | ASSERT_EQ(ToString(data, model_iter), ToString(iter)); |
| 509 | break; |
| 510 | } |
| 511 | |
| 512 | case 2: { |
| 513 | std::string key = PickRandomKey(rnd, keys); |
| 514 | model_iter = data.lower_bound(key); |
| 515 | if (kVerbose) |
| 516 | fprintf(stderr, "Seek '%s'\n", EscapeString(key).c_str()); |
| 517 | iter->Seek(Slice(key)); |
| 518 | ASSERT_EQ(ToString(data, model_iter), ToString(iter)); |
| 519 | break; |
| 520 | } |
| 521 | |
| 522 | case 3: { |
| 523 | if (iter->Valid()) { |
| 524 | if (kVerbose) fprintf(stderr, "Prev\n"); |
| 525 | iter->Prev(); |
| 526 | if (model_iter == data.begin()) { |
| 527 | model_iter = data.end(); // Wrap around to invalid value |
| 528 | } else { |
| 529 | --model_iter; |
| 530 | } |
| 531 | ASSERT_EQ(ToString(data, model_iter), ToString(iter)); |
| 532 | } |
| 533 | break; |
| 534 | } |
| 535 | |
| 536 | case 4: { |
| 537 | if (kVerbose) fprintf(stderr, "SeekToLast\n"); |
| 538 | iter->SeekToLast(); |
| 539 | if (keys.empty()) { |
| 540 | model_iter = data.end(); |
| 541 | } else { |
nothing calls this directly
no test coverage detected