chriseth
10 years ago
7 changed files with 239 additions and 60 deletions
@ -0,0 +1,148 @@ |
|||||
|
/*
|
||||
|
This file is part of cpp-ethereum. |
||||
|
|
||||
|
cpp-ethereum is free software: you can redistribute it and/or modify |
||||
|
it under the terms of the GNU General Public License as published by |
||||
|
the Free Software Foundation, either version 3 of the License, or |
||||
|
(at your option) any later version. |
||||
|
|
||||
|
cpp-ethereum is distributed in the hope that it will be useful, |
||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
GNU General Public License for more details. |
||||
|
|
||||
|
You should have received a copy of the GNU General Public License |
||||
|
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
*/ |
||||
|
/** @file RangeMask.cpp
|
||||
|
* @author Christian <c@ethdev.com> |
||||
|
* @date 2015 |
||||
|
*/ |
||||
|
|
||||
|
#include <libdevcore/RangeMask.h> |
||||
|
#include "../TestHelper.h" |
||||
|
|
||||
|
using namespace std; |
||||
|
using namespace dev; |
||||
|
|
||||
|
namespace dev |
||||
|
{ |
||||
|
namespace test |
||||
|
{ |
||||
|
|
||||
|
BOOST_AUTO_TEST_SUITE(RangeMaskTest) |
||||
|
|
||||
|
BOOST_AUTO_TEST_CASE(constructor) |
||||
|
{ |
||||
|
using RM = RangeMask<unsigned>; |
||||
|
using Range = pair<unsigned, unsigned>; |
||||
|
for (RM r: {RM(), RM(1, 10), RM(Range(2, 10))}) |
||||
|
{ |
||||
|
BOOST_CHECK(r.empty()); |
||||
|
BOOST_CHECK(!r.contains(0)); |
||||
|
BOOST_CHECK(!r.contains(1)); |
||||
|
BOOST_CHECK_EQUAL(0, r.size()); |
||||
|
} |
||||
|
BOOST_CHECK(RM().full()); |
||||
|
BOOST_CHECK(!RM(1, 10).full()); |
||||
|
BOOST_CHECK(!RM(Range(2, 10)).full()); |
||||
|
} |
||||
|
|
||||
|
BOOST_AUTO_TEST_CASE(simple_unions) |
||||
|
{ |
||||
|
using RM = RangeMask<unsigned>; |
||||
|
using Range = pair<unsigned, unsigned>; |
||||
|
RM m(Range(0, 2000)); |
||||
|
m.unionWith(Range(1, 2)); |
||||
|
BOOST_CHECK_EQUAL(m.size(), 1); |
||||
|
m.unionWith(Range(50, 250)); |
||||
|
BOOST_CHECK_EQUAL(m.size(), 201); |
||||
|
m.unionWith(Range(10, 16)); |
||||
|
BOOST_CHECK_EQUAL(m.size(), 207); |
||||
|
BOOST_CHECK(m.contains(1)); |
||||
|
BOOST_CHECK(m.contains(11)); |
||||
|
BOOST_CHECK(m.contains(51)); |
||||
|
BOOST_CHECK(m.contains(200)); |
||||
|
BOOST_CHECK(!m.contains(2)); |
||||
|
BOOST_CHECK(!m.contains(7)); |
||||
|
BOOST_CHECK(!m.contains(17)); |
||||
|
BOOST_CHECK(!m.contains(258)); |
||||
|
} |
||||
|
|
||||
|
BOOST_AUTO_TEST_CASE(empty_union) |
||||
|
{ |
||||
|
using RM = RangeMask<unsigned>; |
||||
|
using Range = pair<unsigned, unsigned>; |
||||
|
RM m(Range(0, 2000)); |
||||
|
m.unionWith(Range(3, 6)); |
||||
|
BOOST_CHECK_EQUAL(m.size(), 3); |
||||
|
m.unionWith(Range(50, 50)); |
||||
|
BOOST_CHECK_EQUAL(m.size(), 3); |
||||
|
m.unionWith(Range(0, 0)); |
||||
|
BOOST_CHECK_EQUAL(m.size(), 3); |
||||
|
m.unionWith(Range(1, 1)); |
||||
|
BOOST_CHECK_EQUAL(m.size(), 3); |
||||
|
m.unionWith(Range(2, 2)); |
||||
|
BOOST_CHECK_EQUAL(m.size(), 3); |
||||
|
m.unionWith(Range(3, 3)); |
||||
|
BOOST_CHECK_EQUAL(m.size(), 3); |
||||
|
} |
||||
|
|
||||
|
BOOST_AUTO_TEST_CASE(overlapping_unions) |
||||
|
{ |
||||
|
using RM = RangeMask<unsigned>; |
||||
|
using Range = pair<unsigned, unsigned>; |
||||
|
RM m(Range(0, 2000)); |
||||
|
m.unionWith(Range(10, 20)); |
||||
|
BOOST_CHECK_EQUAL(10, m.size()); |
||||
|
m.unionWith(Range(30, 40)); |
||||
|
BOOST_CHECK_EQUAL(20, m.size()); |
||||
|
m.unionWith(Range(15, 30)); |
||||
|
BOOST_CHECK_EQUAL(40 - 10, m.size()); |
||||
|
m.unionWith(Range(50, 60)); |
||||
|
m.unionWith(Range(45, 55)); |
||||
|
// [40, 45) still missing here
|
||||
|
BOOST_CHECK_EQUAL(60 - 10 - 5, m.size()); |
||||
|
m.unionWith(Range(15, 56)); |
||||
|
BOOST_CHECK_EQUAL(60 - 10, m.size()); |
||||
|
m.unionWith(Range(15, 65)); |
||||
|
BOOST_CHECK_EQUAL(65 - 10, m.size()); |
||||
|
m.unionWith(Range(5, 70)); |
||||
|
BOOST_CHECK_EQUAL(70 - 5, m.size()); |
||||
|
} |
||||
|
|
||||
|
BOOST_AUTO_TEST_CASE(complement) |
||||
|
{ |
||||
|
using RM = RangeMask<unsigned>; |
||||
|
using Range = pair<unsigned, unsigned>; |
||||
|
RM m(Range(0, 2000)); |
||||
|
m.unionWith(7).unionWith(9); |
||||
|
m = ~m; |
||||
|
m.unionWith(7).unionWith(9); |
||||
|
m = ~m; |
||||
|
BOOST_CHECK(m.empty()); |
||||
|
|
||||
|
m += Range(0, 10); |
||||
|
m += Range(1000, 2000); |
||||
|
m.invert(); |
||||
|
BOOST_CHECK_EQUAL(m.size(), 1000 - 10); |
||||
|
} |
||||
|
|
||||
|
BOOST_AUTO_TEST_CASE(iterator) |
||||
|
{ |
||||
|
using RM = RangeMask<unsigned>; |
||||
|
using Range = pair<unsigned, unsigned>; |
||||
|
RM m(Range(0, 2000)); |
||||
|
m.unionWith(Range(7, 9)); |
||||
|
m.unionWith(11); |
||||
|
m.unionWith(Range(200, 205)); |
||||
|
|
||||
|
vector<unsigned> elements; |
||||
|
copy(m.begin(), m.end(), back_inserter(elements)); |
||||
|
BOOST_CHECK(elements == (vector<unsigned>{7, 8, 11, 200, 201, 202, 203, 204})); |
||||
|
} |
||||
|
|
||||
|
BOOST_AUTO_TEST_SUITE_END() |
||||
|
|
||||
|
} |
||||
|
} |
Loading…
Reference in new issue