2013-01-13 16:49:20 +01:00
|
|
|
/*
|
|
|
|
|
UtilCollection(Test) - helpers and shortcuts for working with collections
|
|
|
|
|
|
|
|
|
|
Copyright (C) Lumiera.org
|
|
|
|
|
2012, Hermann Vosseler <Ichthyostega@web.de>
|
|
|
|
|
|
|
|
|
|
This program 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 2 of
|
|
|
|
|
the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
|
|
This program 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 this program; if not, write to the Free Software
|
|
|
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
|
|
|
|
|
* *****************************************************/
|
|
|
|
|
|
2017-02-22 01:54:20 +01:00
|
|
|
/** @file util-collection-test.cpp
|
2017-02-22 03:17:18 +01:00
|
|
|
** unit test \ref UtilCollection_test
|
2016-11-03 18:20:10 +01:00
|
|
|
*/
|
|
|
|
|
|
2013-01-13 16:49:20 +01:00
|
|
|
|
|
|
|
|
#include "lib/test/run.hpp"
|
|
|
|
|
#include "lib/itertools.hpp"
|
|
|
|
|
#include "lib/util-coll.hpp"
|
|
|
|
|
#include "lib/iter-adapter.hpp"
|
|
|
|
|
#include "lib/meta/trait.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <boost/lexical_cast.hpp>
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using ::Test;
|
|
|
|
|
|
|
|
|
|
using util::first;
|
|
|
|
|
using util::last;
|
|
|
|
|
|
|
|
|
|
using lib::meta::can_STL_ForEach;
|
|
|
|
|
using lib::meta::can_IterForEach;
|
|
|
|
|
using lib::meta::can_STL_backIteration;
|
|
|
|
|
|
|
|
|
|
using boost::lexical_cast;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace util {
|
|
|
|
|
namespace test {
|
|
|
|
|
|
|
|
|
|
typedef std::vector<uint> VecI;
|
|
|
|
|
typedef lib::RangeIter<VecI::iterator> RangeI;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace{ // Test data and operations
|
|
|
|
|
|
|
|
|
|
VecI
|
|
|
|
|
someNumberz (uint count)
|
|
|
|
|
{
|
|
|
|
|
VecI numbers;
|
|
|
|
|
numbers.reserve(count);
|
|
|
|
|
while (count)
|
|
|
|
|
numbers.push_back(count--);
|
|
|
|
|
|
|
|
|
|
return numbers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // (End) test data and operations
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-10-24 23:06:36 +02:00
|
|
|
/*****************************************************************//**
|
2013-01-13 16:49:20 +01:00
|
|
|
* @test verify some convenience shortcuts and helpers dealing
|
|
|
|
|
* with Collections and sequences (Iterators).
|
|
|
|
|
* - metafunctions to distinguish STL containers and Lumiera Iterators
|
|
|
|
|
* - get the first element
|
|
|
|
|
* - get the last element
|
|
|
|
|
*/
|
|
|
|
|
class UtilCollection_test : public Test
|
|
|
|
|
{
|
2024-11-15 19:02:48 +01:00
|
|
|
virtual void
|
2013-01-13 16:49:20 +01:00
|
|
|
run (Arg arg)
|
|
|
|
|
{
|
|
|
|
|
verify_typeDetectors();
|
|
|
|
|
|
2024-11-15 19:02:48 +01:00
|
|
|
uint NUM_ELMS = firstVal (arg, 20);
|
2013-01-13 16:49:20 +01:00
|
|
|
VecI container = someNumberz (NUM_ELMS);
|
|
|
|
|
RangeI iterator(container.begin(), container.end());
|
|
|
|
|
|
|
|
|
|
verify_accessFirstLast (container, NUM_ELMS);
|
|
|
|
|
verify_accessFirstLast (iterator, NUM_ELMS);
|
2020-03-08 02:05:39 +01:00
|
|
|
|
|
|
|
|
verify_Min_Max (container, NUM_ELMS);
|
|
|
|
|
verify_Min_Max (iterator, NUM_ELMS);
|
2013-01-13 16:49:20 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<class COL>
|
|
|
|
|
void
|
|
|
|
|
verify_accessFirstLast (COL const& col, uint lim)
|
|
|
|
|
{
|
|
|
|
|
uint theFirst = lim;
|
|
|
|
|
uint theLast = 1;
|
|
|
|
|
|
|
|
|
|
CHECK (first(col) == theFirst);
|
|
|
|
|
CHECK (last(col) == theLast);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-03-08 02:05:39 +01:00
|
|
|
template<class COL>
|
|
|
|
|
void
|
|
|
|
|
verify_Min_Max (COL const& col, uint lim)
|
|
|
|
|
{
|
|
|
|
|
uint expectedMax = lim;
|
|
|
|
|
uint expectedMin = 1;
|
|
|
|
|
|
|
|
|
|
CHECK (max (col) == expectedMax);
|
|
|
|
|
CHECK (min (col) == expectedMin);
|
|
|
|
|
|
|
|
|
|
COL empty;
|
|
|
|
|
|
|
|
|
|
using Val = typename COL::value_type;
|
|
|
|
|
|
|
|
|
|
CHECK (max (empty) == std::numeric_limits<Val>::min());
|
|
|
|
|
CHECK (min (empty) == std::numeric_limits<Val>::max());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2013-01-13 16:49:20 +01:00
|
|
|
void
|
|
|
|
|
verify_typeDetectors()
|
|
|
|
|
{
|
|
|
|
|
CHECK ( can_STL_ForEach<VecI>::value);
|
|
|
|
|
CHECK ( can_STL_backIteration<VecI>::value);
|
|
|
|
|
|
|
|
|
|
CHECK (!can_STL_ForEach<RangeI>::value);
|
|
|
|
|
CHECK (!can_STL_backIteration<RangeI>::value);
|
|
|
|
|
|
|
|
|
|
CHECK (!can_IterForEach<VecI>::value);
|
|
|
|
|
CHECK ( can_IterForEach<RangeI>::value);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LAUNCHER (UtilCollection_test, "unit common");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}} // namespace util::test
|
|
|
|
|
|