| 736 | } |
| 737 | |
| 738 | void insertRandomTest(bool fixed_records, size_t record_size) { |
| 739 | DuplicateTable dt(ldb(), fixed_records && record_size <= 8, |
| 740 | record_size <= 8 ? record_size : UPS_RECORD_SIZE_UNLIMITED); |
| 741 | |
| 742 | const int num_records = 100; |
| 743 | |
| 744 | // create an empty table |
| 745 | dt.create(context.get(), 0, 0); |
| 746 | REQUIRE(dt.record_count() == 0); |
| 747 | REQUIRE(dt.record_capacity() == 0); |
| 748 | |
| 749 | // the model stores the records that we inserted |
| 750 | std::vector<std::vector<uint8_t> > model; |
| 751 | |
| 752 | // fill it |
| 753 | ups_record_t record = {0}; |
| 754 | uint8_t buf[1024] = {0}; |
| 755 | record.data = &buf[0]; |
| 756 | record.size = (uint32_t)record_size; |
| 757 | for (int i = 0; i < num_records; i++) { |
| 758 | *(size_t *)&buf[0] = i; |
| 759 | if (i == 0) { |
| 760 | dt.set_record(context.get(), i, &record, UPS_DUPLICATE_INSERT_FIRST, 0); |
| 761 | model.push_back(std::vector<uint8_t>(&buf[0], &buf[record_size])); |
| 762 | } |
| 763 | else { |
| 764 | size_t position = rand() % i; |
| 765 | dt.set_record(context.get(), position, &record, |
| 766 | UPS_DUPLICATE_INSERT_BEFORE, 0); |
| 767 | model.insert(model.begin() + position, |
| 768 | std::vector<uint8_t>(&buf[0], &buf[record_size])); |
| 769 | } |
| 770 | } |
| 771 | |
| 772 | REQUIRE(dt.record_count() == num_records); |
| 773 | |
| 774 | ByteArray arena(1024); |
| 775 | record.data = arena.data(); |
| 776 | |
| 777 | for (int i = 0; i < num_records; i++) { |
| 778 | dt.record(context.get(), &arena, &record, 0, i); |
| 779 | REQUIRE(record.size == record_size); |
| 780 | if (record_size > 0) |
| 781 | REQUIRE(0 == ::memcmp(record.data, &(model[i][0]), record_size)); |
| 782 | } |
| 783 | |
| 784 | // clean up |
| 785 | dt.erase_record(context.get(), 0, true); |
| 786 | } |
| 787 | |
| 788 | void insertEraseAscendingTest(bool fixed_records, size_t record_size) { |
| 789 | DuplicateTable dt(ldb(), fixed_records && record_size <= 8, |
no test coverage detected