1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-24 04:01:07 +03:00
Files
mvfst/quic/common/test/IntervalSetTest.cpp
Luca Niccolini cf842aab47 cleanup some unused includes and using
Reviewed By: yangchi

Differential Revision: D16976466

fbshipit-source-id: c1fc2ee0795997f498ac7431542bbfbf1f0d2fb2
2019-08-24 02:03:39 -07:00

305 lines
7.4 KiB
C++

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
#include <quic/common/IntervalSet.h>
#include <gtest/gtest.h>
using namespace std;
using namespace quic;
TEST(IntervalSet, empty) {
IntervalSet<int> set;
auto originalVersion = set.insertVersion();
set.insert(1, 2);
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 2));
EXPECT_GT(set.insertVersion(), originalVersion);
}
TEST(IntervalSet, insertAtFront) {
IntervalSet<int> set;
auto version1 = set.insertVersion();
set.insert(4, 5);
auto version2 = set.insertVersion();
set.insert(1, 2);
auto version3 = set.insertVersion();
auto interval = set.front();
EXPECT_EQ(interval, Interval<int>(1, 2));
set.pop_front();
interval = set.front();
EXPECT_EQ(interval, Interval<int>(4, 5));
set.pop_front();
EXPECT_TRUE(set.empty());
EXPECT_GT(version2, version1);
EXPECT_GT(version3, version2);
}
TEST(IntervalSet, insertAtBack) {
IntervalSet<int> set;
set.insert(1, 2);
set.insert(4, 4);
auto interval = set.back();
EXPECT_EQ(interval, Interval<int>(4, 4));
set.pop_back();
interval = set.back();
EXPECT_EQ(interval, Interval<int>(1, 2));
set.pop_back();
EXPECT_TRUE(set.empty());
}
TEST(IntervalSet, insertInTheMiddle) {
IntervalSet<int> set;
set.insert(1, 2);
set.insert(7, 8);
auto version1 = set.insertVersion();
// Insert at the front but should be merged with first element
set.insert(4, 5);
auto version2 = set.insertVersion();
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 2));
EXPECT_EQ(*++itr, Interval<int>(4, 5));
EXPECT_EQ(*++itr, Interval<int>(7, 8));
EXPECT_TRUE(++itr == set.cend());
EXPECT_GT(version2, version1);
}
TEST(IntervalSet, insertAtFrontWithMerge) {
IntervalSet<int> set;
set.insert(3, 5);
set.insert(7, 8);
auto version1 = set.insertVersion();
// Insert at the front but should be merged with first element
set.insert(1, 4);
auto version2 = set.insertVersion();
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 5));
EXPECT_EQ(*++itr, Interval<int>(7, 8));
EXPECT_TRUE(++itr == set.cend());
EXPECT_GT(version2, version1);
}
TEST(IntervalSet, insertAtBackWithMerge) {
IntervalSet<int> set;
set.insert(1, 2);
set.insert(5, 8);
// Insert at the front but should be merged with first element
set.insert(6, 9);
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 2));
EXPECT_EQ(*++itr, Interval<int>(5, 9));
EXPECT_TRUE(++itr == set.cend());
}
TEST(IntervalSet, insertInTheMiddleWithMerge) {
IntervalSet<int> set;
set.insert(1, 2);
set.insert(5, 6);
set.insert(8, 9);
auto version1 = set.insertVersion();
set.insert(4, 6);
auto version2 = set.insertVersion();
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 2));
EXPECT_EQ(*++itr, Interval<int>(4, 6));
EXPECT_EQ(*++itr, Interval<int>(8, 9));
EXPECT_TRUE(++itr == set.cend());
EXPECT_GT(version2, version1);
}
TEST(IntervalSet, insertWithMultipleMerge) {
IntervalSet<int> set;
set.insert(1, 2);
set.insert(4, 5);
set.insert(7, 8);
set.insert(10, 12);
set.insert(14, 15);
// Insert with merge
set.insert(4, 9);
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 2));
EXPECT_EQ(*++itr, Interval<int>(4, 12));
EXPECT_EQ(*++itr, Interval<int>(14, 15));
EXPECT_TRUE(++itr == set.cend());
}
TEST(IntervalSet, insertWithMergeAtEdge) {
IntervalSet<int> set;
set.insert(1, 2);
set.insert(4, 7);
// Merge at edge
set.insert(3, 3);
auto interval = set.front();
EXPECT_EQ(interval, Interval<int>(1, 7));
set.pop_front();
EXPECT_TRUE(set.empty());
}
TEST(IntervalSet, insertBoundTooLarge) {
IntervalSet<uint32_t, 10> set;
EXPECT_THROW(
set.insert(0, std::numeric_limits<uint32_t>::max() - 9),
std::invalid_argument);
set.insert(0, std::numeric_limits<uint32_t>::max() - 10);
}
TEST(IntervalSet, insertVersionDoesNotChange) {
IntervalSet<int> set;
set.insert(1, 4);
set.insert(6, 8);
set.insert(9, 10);
auto version1 = set.insertVersion();
// Merge at edge
set.insert(3, 4);
auto version2 = set.insertVersion();
EXPECT_EQ(version2, version1);
}
TEST(IntervalSet, withdrawBeforeFront) {
IntervalSet<int> set;
set.insert(4, 5);
set.withdraw({1, 2});
EXPECT_EQ(1, set.size());
auto interval = set.front();
EXPECT_EQ(interval, Interval<int>(4, 5));
}
TEST(IntervalSet, withdrawAfterBack) {
IntervalSet<int> set;
set.insert(1, 2);
set.withdraw({4, 5});
EXPECT_EQ(1, set.size());
auto interval = set.front();
EXPECT_EQ(interval, Interval<int>(1, 2));
}
TEST(IntervalSet, withdrawMiddleNoIntersection) {
IntervalSet<int> set;
set.insert(1, 2);
set.insert(7, 8);
set.withdraw({4, 5});
EXPECT_EQ(2, set.size());
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 2));
EXPECT_EQ(*++itr, Interval<int>(7, 8));
}
TEST(IntervalSet, withdrawMiddleLeftIntersection1) {
IntervalSet<int> set;
set.insert(1, 3);
set.insert(7, 8);
set.withdraw({3, 5});
EXPECT_EQ(2, set.size());
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 2));
EXPECT_EQ(*++itr, Interval<int>(7, 8));
}
TEST(IntervalSet, withdrawMiddleLeftIntersection2) {
IntervalSet<int> set;
set.insert(2, 3);
set.insert(7, 8);
set.withdraw({1, 5});
EXPECT_EQ(1, set.size());
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(7, 8));
}
TEST(IntervalSet, withdrawMiddleRightIntersection1) {
IntervalSet<int> set;
set.insert(1, 2);
set.insert(5, 8);
set.withdraw({4, 6});
EXPECT_EQ(2, set.size());
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 2));
EXPECT_EQ(*++itr, Interval<int>(7, 8));
}
TEST(IntervalSet, withdrawMiddleRightIntersection2) {
IntervalSet<int> set;
set.insert(1, 2);
set.insert(5, 6);
set.withdraw({4, 6});
EXPECT_EQ(1, set.size());
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 2));
}
TEST(IntervalSet, withdrawMiddleBothIntersection1) {
IntervalSet<int> set;
set.insert(1, 3);
set.insert(5, 8);
set.withdraw({3, 6});
EXPECT_EQ(2, set.size());
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 2));
EXPECT_EQ(*++itr, Interval<int>(7, 8));
}
TEST(IntervalSet, withdrawMiddleBothIntersection2) {
IntervalSet<int> set;
set.insert(1, 3);
set.insert(5, 8);
set.withdraw({1, 10});
EXPECT_EQ(0, set.size());
}
TEST(IntervalSet, withdrawMultipleIntersection) {
IntervalSet<int> set;
set.insert(1, 3);
set.insert(7, 8);
set.insert(10, 12);
set.insert(14, 18);
set.withdraw({3, 18});
EXPECT_EQ(1, set.size());
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 2));
}
TEST(IntervalSet, withdrawSubinterval) {
IntervalSet<int> set;
set.insert(1, 5);
set.withdraw({2, 2});
EXPECT_EQ(2, set.size());
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(1, 1));
EXPECT_EQ(*++itr, Interval<int>(3, 5));
}
TEST(IntervalSet, withdrawSubintervalOnEdge) {
IntervalSet<int> set;
set.insert(1, 5);
set.withdraw({1, 1});
EXPECT_EQ(1, set.size());
auto itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(2, 5));
set.withdraw({4, 5});
EXPECT_EQ(1, set.size());
itr = set.cbegin();
EXPECT_EQ(*itr, Interval<int>(2, 3));
}
TEST(IntervalSet, withdrawWithOverflow) {
IntervalSet<int> set;
set.insert(0, 5);
set.withdraw({0, 2});
EXPECT_EQ(1, set.size());
auto interval = set.front();
EXPECT_EQ(interval, Interval<int>(3, 5));
}