void NodeIdRangeTests::TestSubtractRanges(NodeIdRange const & range, vector<NodeIdRange> const & excludes) { vector<NodeIdRange> result; range.Subtract(excludes, result); Trace.WriteInfo(TraceRangeTest, "Range {0} exclude {1} returned {2}", range, excludes, result); LargeInteger overlapSize = LargeInteger::Zero; for (size_t i = 0; i < result.size(); i++) { VERIFY_IS_TRUE(!result[i].IsEmpty); VERIFY_IS_TRUE(range.Contains(result[i])); for (size_t j = 0; j < excludes.size(); j++) { VERIFY_IS_TRUE(result[i].Disjoint(excludes[j])); } overlapSize = overlapSize + GetOverlapSize(range, result[i]); } for (size_t i = 0; i + 1 < result.size(); i++) { for (size_t j = i + 1; j < result.size(); j++) { VERIFY_IS_TRUE(result[i].Disjoint(result[j])); } } for (size_t i = 0; i < excludes.size(); i++) { overlapSize = overlapSize + GetOverlapSize(range, excludes[i]); } VERIFY_IS_TRUE(GetRangeSize(range) == overlapSize); }
void NodeIdRangeTests::TestSubtract(NodeIdRange const & range, NodeIdRange const & exclude) { NodeIdRange range1, range2; range.Subtract(exclude, range1, range2); Trace.WriteInfo(TraceRangeTest, "Range {0} exclude {1} returned {2} and {3}", range, exclude, range1, range2); if (!range1.IsEmpty) { VERIFY_IS_TRUE(range.Contains(range1) && exclude.Disjoint(range1)); if (!range2.IsEmpty) { VERIFY_IS_TRUE(range1.Disjoint(range2) && !range1.IsSuccAdjacent(range2) && !range1.IsPredAdjacent(range2)); } } if (!range2.IsEmpty) { VERIFY_IS_TRUE((range2.IsEmpty || range.Contains(range2)) && exclude.Disjoint(range2)); } VERIFY_IS_TRUE(GetRangeSize(range) == GetOverlapSize(range, exclude) + GetRangeSize(range1) + GetRangeSize(range2)); }