LUMIERA.clone/tests/lib/item-wrapper-test.cpp
Ichthyostega 83eb6976cd draft an universal val/ref wrapper, needed by TransformIter.
Seemingly I've hit a nasty problem here, because PlacementIndex
should return an Placement&, but this is being fetched
after-the fact from within the iterator.
2009-12-20 04:33:24 +01:00

183 lines
4.8 KiB
C++

/*
ItemWrapper(Test) - wrapping and holding arbitrary values, pointers and references
Copyright (C) Lumiera.org
2009, 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.
* *****************************************************/
#include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"
#include "lib/util.hpp"
#include "lib/wrapper.hpp"
//#include <boost/lexical_cast.hpp>
//#include <iostream>
//#include <vector>
#include <cstdlib>
#include <string>
namespace lib {
namespace test{
using ::Test;
// using boost::lexical_cast;
using util::isSameObject;
// using util::for_each;
// using util::isnil;
// using std::vector;
using std::string;
// using std::cout;
// using std::endl;
namespace { // Test data
///////////TODO
} // (END) Test data
/*******************************************************************************
* @test use the ItemWrapper to define inline-storage holding values,
* pointers and references. Verify correct behaviour in each case,
* including assignment, empty check, invalid dereferentiation.
*
*/
class ItemWrapper_test : public Test
{
virtual void
run (Arg)
{
UNIMPLEMENTED ("check ItemWrapper");
ulong ll (rand() % 1000);
string ss (randStr(50));
const char* cp (ss.c_str());
Tracker tt;
verifyWrapper (ItemWrapper<ulong> (ll), ll, -123);
verifyWrapper (ItemWrapper<ulong&> (ll), ll, 45678 );
verifyWrapper (ItemWrapper<ulong const&> (ll), ll, 0 );
verifyWrapper (ItemWrapper<ulong*> (&ll), &ll, (ulong*) 0 );
verifyWrapper (ItemWrapper<string> (ss), ss, "Lumiera");
verifyWrapper (ItemWrapper<string&> (ss), ssl, string() );
verifyWrapper (ItemWrapper<string*> (&ss), &ss, randStr(12));
verifyWrapper (ItemWrapper<Tracker> (tt), tt, Tracker());
verifyWrapper (ItemWrapper<Tracker&> (tt), tt, Tracker());
verifyWrapper (ItemWrapper<Tracker*> (&tt), &tt, (Tracker*) 0 );
verifyWrapper (ItemWrapper<const char*> (cp), cp, "Lumiera");
verifyWrappedRef ();
}
template<typename X>
void
verifyWrapper (ItemWrapper<X> const& wrap, X const& val, X const& otherVal)
{
ASSERT (wrap);
ItemWrapper<X> copy1 (wrap);
ItemWrapper<X> copy2;
ItemWrapper<X> empty;
ASSERT (copy1);
ASSERT (!copy2);
ASSERT (false == bool(empty));
ASSERT (wrap == copy1);
ASSERT (wrap != copy2);
ASSERT (wrap != empty);
copy2 = copy1;
ASSERT (copy2);
ASSERT (wrap == copy2);
ASSERT (wrap != empty);
copy2 = otherVal;
ASSERT (copy2);
ASSERT (wrap != copy2);
ASSERT (wrap != empty);
ASSERT (val == *wrap);
ASSERT (val == *copy1);
ASSERT (val != *copy2);
VERIFY_ERROR (BOTTOM_VALUE, *empty );
ASSERT (otherVal == *copy2);
copy1 = copy2;
ASSERT (otherVal == *copy1);
ASSERT (otherVal == *copy2);
ASSERT (wrap != copy1);
ASSERT (wrap != copy2);
copy1.clear();
ASSERT (!copy1);
ASSERT (empty == copy1);
ASSERT (copy2 != copy1);
VERIFY_ERROR (BOTTOM_VALUE, *copy1 );
};
void
verifyWrappedRef ()
{
int x = 5;
ItemWrapper<int&> refWrap;
ASSERT (!refWrap);
refWrap = x;
ASSERT (refWrap);
ASSERT (5 == *refWrap);
ASSERT (x == *refWrap);
*refWrap += 5;
ASSERT (x == 10);
ItemWrapper<int*> ptrWrap (& *refWrap);
ASSERT (isSameObject (*ptrWrap, x));
**ptrWrap += 13;
ASSERT (x == 23);
}
};
LAUNCHER (ItemWrapper_test, "unit common");
}} // namespace lib::test