X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FUtils%2Fsingleton.test.cc;fp=senf%2FUtils%2Fsingleton.test.cc;h=348605a5368b4a316ec1a040491e2604475b659a;hb=601d1f509f5bb24df167a4dd5a20da67a0af9af8;hp=0000000000000000000000000000000000000000;hpb=164fe477094d42463722584e527a02379ab5d985;p=senf.git diff --git a/senf/Utils/singleton.test.cc b/senf/Utils/singleton.test.cc new file mode 100644 index 0000000..348605a --- /dev/null +++ b/senf/Utils/singleton.test.cc @@ -0,0 +1,141 @@ +// $Id$ +// +// Copyright (C) 2007 +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Stefan Bund +// +// 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., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +/** \file + \brief singleton unit tests */ + +//#include "singleton.test.hh" +//#include "singleton.test.ih" + +// Custom includes +#include +#include "singleton.hh" + +#include "../Utils/auto_unit_test.hh" +#include + +#define prefix_ +///////////////////////////////cc.p//////////////////////////////////////// + +namespace { + + class Test : public senf::singleton + { + friend class senf::singleton; + + Test() : foo_(1234) {} + + int foo_; + + public: + using senf::singleton::instance; + using senf::singleton::alive; + + int foo() { return foo_; } + }; +} + +BOOST_AUTO_UNIT_TEST(sInGlEtOn) +{ + BOOST_CHECK_EQUAL( Test::instance().foo(), 1234 ); + BOOST_CHECK( Test::alive() ); +} + +namespace { + + bool test1Dead (false); + bool test2Dead (false); + + bool test1Alive (false); + bool test2Alive (false); + + struct AliveTest1 : public senf::singleton + { + friend class senf::singleton; + using senf::singleton::alive; + using senf::singleton::instance; + AliveTest1(); + ~AliveTest1(); + }; + + struct AliveTest2 : public senf::singleton + { + friend class senf::singleton; + using senf::singleton::alive; + using senf::singleton::instance; + AliveTest2(); + ~AliveTest2(); + }; + + AliveTest1::AliveTest1() + { + test2Alive = AliveTest2::alive(); + } + + AliveTest1::~AliveTest1() + { + if (test2Dead) { + assert( ! AliveTest2::alive() ); + std::cerr << "singleton alive test ok\n"; + } + test1Dead = true; + } + + AliveTest2::AliveTest2() + { + test1Alive = AliveTest1::alive(); + } + + AliveTest2::~AliveTest2() + { + if (test1Dead) { + assert( ! AliveTest1::alive() ); + std::cerr << "singleton alive test ok\n"; + } + test2Dead = true; + } + +} + +BOOST_AUTO_UNIT_TEST(singletonAlive) +{ + (void) AliveTest1::instance(); + (void) AliveTest2::instance(); + + BOOST_CHECK( (test1Alive && !test2Alive) || (!test1Alive && test2Alive) ); + BOOST_CHECK( AliveTest1::alive() ); + BOOST_CHECK( AliveTest2::alive() ); +} + +///////////////////////////////cc.e//////////////////////////////////////// +#undef prefix_ + + +// Local Variables: +// mode: c++ +// fill-column: 100 +// comment-column: 40 +// c-file-style: "senf" +// indent-tabs-mode: nil +// ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// End: