mathieu@150: /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ mathieu@9: /* mathieu@9: * Copyright (c) 2005,2006 INRIA mathieu@9: * mathieu@9: * This program is free software; you can redistribute it and/or modify mathieu@9: * it under the terms of the GNU General Public License version 2 as mathieu@9: * published by the Free Software Foundation; mathieu@9: * mathieu@9: * This program is distributed in the hope that it will be useful, mathieu@9: * but WITHOUT ANY WARRANTY; without even the implied warranty of mathieu@9: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the mathieu@9: * GNU General Public License for more details. mathieu@9: * mathieu@9: * You should have received a copy of the GNU General Public License mathieu@9: * along with this program; if not, write to the Free Software mathieu@9: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA mathieu@9: * mathieu@9: * Author: Mathieu Lacage mathieu@9: */ mathieu@9: mathieu@9: #include "test.h" mathieu@9: #include "callback.h" mathieu@9: #include mathieu@9: mathieu@9: #ifdef RUN_SELF_TESTS mathieu@9: mathieu@16: namespace ns3 { mathieu@9: mathieu@53: static bool gTest5 = false; mathieu@53: static bool gTest6 = false; mathieu@53: static bool gTest7 = false; mathieu@9: mathieu@122: void Test5 (void) mathieu@9: { mathieu@150: gTest5 = true; mathieu@9: } mathieu@9: mathieu@122: void Test6 (int) mathieu@9: { mathieu@150: gTest6 = true; mathieu@9: } mathieu@9: mathieu@122: int Test7 (int a) mathieu@9: { mathieu@150: gTest7 = true; mathieu@150: return a; mathieu@9: } mathieu@9: tomh@345: void *Test9 (bool *a) tomh@345: { tomh@345: return a; tomh@345: } tomh@345: tomh@345: void *Test10 (bool *a, int const & b) tomh@345: { tomh@345: return a; tomh@345: } tomh@345: mathieu@1417: void TestFZero (void) {} mathieu@1417: void TestFOne (int) {} mathieu@1417: void TestFTwo (int, int) {} mathieu@1417: void TestFThree (int, int, int) {} mathieu@1417: void TestFFour (int, int, int, int) {} mathieu@1417: void TestFFive (int, int, int, int, int) {} mathieu@1417: void TestFSix (int, int, int, int, int, int) {} mathieu@1417: mathieu@1418: void TestFROne (int &) {} mathieu@1418: void TestFRTwo (int &, int &) {} mathieu@1418: void TestFRThree (int &, int &, int &) {} mathieu@1418: void TestFRFour (int &, int &, int &, int &) {} mathieu@1418: void TestFRFive (int &, int &, int &, int &, int &) {} mathieu@1418: void TestFRSix (int &, int &, int &, int &, int &, int &) {} mathieu@1418: mathieu@1963: class X : public ns3::Test mathieu@1963: { mathieu@1963: public: mathieu@1963: X () : Test ("Callback") {} mathieu@1963: void PublicParent (void) {} mathieu@1963: protected: mathieu@1963: static void StaticProtectedParent (void) {} mathieu@1963: void ProtectedParent (void) {} mathieu@1963: private: mathieu@1963: void PrivateParent (void) {} mathieu@1963: }; mathieu@1963: mathieu@1963: class CallbackTest : public X mathieu@1963: { mathieu@9: private: mathieu@150: bool m_test1; mathieu@150: bool m_test2; mathieu@150: bool m_test3; mathieu@150: bool m_test4; mathieu@9: public: mathieu@150: CallbackTest (); mathieu@150: virtual bool RunTests (void); mathieu@150: void Reset (void); mathieu@150: bool IsWrong (void); mathieu@150: void Test1 (void); mathieu@150: int Test2 (void); mathieu@150: void Test3 (double a); mathieu@150: int Test4 (double a, int b); mathieu@150: void Test8 (Callback callback); mathieu@1417: mathieu@1417: void TestZero (void) {} mathieu@1417: void TestOne (int) {} mathieu@1417: void TestTwo (int, int) {} mathieu@1417: void TestThree (int, int, int) {} mathieu@1417: void TestFour (int, int, int, int) {} mathieu@1417: void TestFive (int, int, int, int, int) {} mathieu@1417: void TestSix (int, int, int, int, int, int) {} mathieu@1417: mathieu@1417: void TestCZero (void) const {} mathieu@1417: void TestCOne (int) const {} mathieu@1417: void TestCTwo (int, int) const {} mathieu@1417: void TestCThree (int, int, int) const {} mathieu@1417: void TestCFour (int, int, int, int) const {} mathieu@1417: void TestCFive (int, int, int, int, int) const {} mathieu@1417: void TestCSix (int, int, int, int, int, int) const {} mathieu@9: }; mathieu@9: mathieu@9: CallbackTest::CallbackTest () mathieu@1963: : m_test1 (false), mathieu@150: m_test2 (false), mathieu@150: m_test3 (false), mathieu@150: m_test4 (false) mathieu@9: {} mathieu@9: mathieu@9: void mathieu@122: CallbackTest::Test1 (void) mathieu@9: { mathieu@150: m_test1 = true; mathieu@9: } mathieu@9: int mathieu@122: CallbackTest::Test2 (void) mathieu@9: { mathieu@150: m_test2 = true; mathieu@150: return 2; mathieu@9: } mathieu@9: void mathieu@122: CallbackTest::Test3 (double a) mathieu@9: { mathieu@150: m_test3 = true; mathieu@9: } mathieu@9: int mathieu@122: CallbackTest::Test4 (double a, int b) mathieu@9: { mathieu@150: m_test4 = true; mathieu@150: return 4; mathieu@9: } mathieu@9: void mathieu@122: CallbackTest::Test8 (Callback callback) mathieu@9: { mathieu@150: callback (3); mathieu@9: } mathieu@1417: mathieu@9: bool mathieu@122: CallbackTest::IsWrong (void) mathieu@9: { mathieu@150: if (!m_test1 || mathieu@150: !m_test2 || mathieu@150: !m_test3 || mathieu@150: !m_test4 || mathieu@150: !gTest5 || mathieu@150: !gTest6 || mathieu@150: !gTest7) mathieu@150: { mathieu@150: return true; mathieu@150: } mathieu@150: return false; mathieu@9: } mathieu@9: mathieu@9: void mathieu@122: CallbackTest::Reset (void) mathieu@9: { mathieu@150: m_test1 = false; mathieu@150: m_test2 = false; mathieu@150: m_test3 = false; mathieu@150: m_test4 = false; mathieu@150: gTest5 = false; mathieu@150: gTest6 = false; mathieu@150: gTest7 = false; mathieu@9: } mathieu@9: mathieu@9: mathieu@9: bool mathieu@122: CallbackTest::RunTests (void) mathieu@9: { mathieu@150: bool ok = true; mathieu@9: mathieu@150: typedef ns3::Callback A; mathieu@150: typedef ns3::Callback B; mathieu@150: typedef ns3::Callback C; mathieu@150: typedef ns3::Callback D; mathieu@150: typedef ns3::Callback E; mathieu@150: typedef ns3::Callback F; mathieu@150: typedef ns3::Callback G; mathieu@150: mathieu@150: A a0 (this, &CallbackTest::Test1); mathieu@150: B b0; mathieu@150: b0 = B (this, &CallbackTest::Test2); mathieu@150: C c0 = C (this, &CallbackTest::Test3); mathieu@150: D d0 = D (this, &CallbackTest::Test4); tomh@345: E e0 = E (&Test5, true, true); tomh@345: F f0 = F (&Test6, true, true); tomh@345: G g0 = G (&Test7, true, true); mathieu@9: mathieu@150: a0 (); mathieu@150: b0 (); mathieu@150: c0 (0.0); mathieu@150: d0 (0.0, 1); mathieu@150: e0 (); mathieu@150: f0 (1); mathieu@150: g0 (1); mathieu@9: mathieu@150: if (IsWrong ()) mathieu@150: { mathieu@150: ok = false; mathieu@150: } mathieu@9: mathieu@150: Reset (); mathieu@9: mathieu@150: A a1 = ns3::MakeCallback (&CallbackTest::Test1, this); mathieu@150: B b1 = ns3::MakeCallback (&CallbackTest::Test2, this); mathieu@150: C c1 = ns3::MakeCallback (&CallbackTest::Test3, this); mathieu@150: D d1 = ns3::MakeCallback (&CallbackTest::Test4, this); mathieu@150: E e1 = ns3::MakeCallback (&Test5); mathieu@150: F f1 = ns3::MakeCallback (&Test6); mathieu@150: G g1 = ns3::MakeCallback (&Test7); mathieu@150: mathieu@150: a1 (); mathieu@150: b1 (); mathieu@150: c1 (0.0); mathieu@150: d1 (0.0, 1); mathieu@150: e1 (); mathieu@150: f1 (1); mathieu@150: g1 (2); mathieu@9: mathieu@686: a1.Nullify (); mathieu@686: b1.Nullify (); mathieu@686: c1.Nullify (); mathieu@686: d1.Nullify (); mathieu@686: e1.Nullify (); mathieu@686: g1.Nullify (); mathieu@686: mathieu@150: Test8 (f1); mathieu@9: mathieu@686: f1.Nullify (); mathieu@686: mathieu@150: Callback a2; mathieu@9: mathieu@150: if (IsWrong ()) mathieu@150: { mathieu@150: ok = false; mathieu@150: } tomh@345: tomh@345: tomh@345: MakeBoundCallback (&Test7, 0); tomh@345: bool v; tomh@345: MakeBoundCallback (&Test9, &v); tomh@345: MakeBoundCallback (&Test10, &v); tomh@345: mathieu@1417: mathieu@1417: MakeCallback (&CallbackTest::TestZero, this); mathieu@1417: MakeCallback (&CallbackTest::TestOne, this); mathieu@1417: MakeCallback (&CallbackTest::TestTwo, this); mathieu@1417: MakeCallback (&CallbackTest::TestThree, this); mathieu@1417: MakeCallback (&CallbackTest::TestFour, this); mathieu@1417: MakeCallback (&CallbackTest::TestFive, this); mathieu@1417: MakeCallback (&CallbackTest::TestSix, this); mathieu@1417: mathieu@1417: MakeCallback (&CallbackTest::TestCZero, this); mathieu@1417: MakeCallback (&CallbackTest::TestCOne, this); mathieu@1417: MakeCallback (&CallbackTest::TestCTwo, this); mathieu@1417: MakeCallback (&CallbackTest::TestCThree, this); mathieu@1417: MakeCallback (&CallbackTest::TestCFour, this); mathieu@1417: MakeCallback (&CallbackTest::TestCFive, this); mathieu@1417: MakeCallback (&CallbackTest::TestCSix, this); mathieu@1417: mathieu@1417: MakeCallback (&TestFZero); mathieu@1417: MakeCallback (&TestFOne); mathieu@1417: MakeCallback (&TestFTwo); mathieu@1417: MakeCallback (&TestFThree); mathieu@1417: MakeCallback (&TestFFour); mathieu@1417: MakeCallback (&TestFFive); mathieu@1417: MakeCallback (&TestFSix); mathieu@1417: mathieu@1418: MakeCallback (&TestFROne); mathieu@1418: MakeCallback (&TestFRTwo); mathieu@1418: MakeCallback (&TestFRThree); mathieu@1418: MakeCallback (&TestFRFour); mathieu@1418: MakeCallback (&TestFRFive); mathieu@1418: MakeCallback (&TestFRSix); mathieu@1418: mathieu@1418: mathieu@1418: MakeBoundCallback (&TestFOne, 1); mathieu@1418: MakeBoundCallback (&TestFTwo, 1); mathieu@1418: MakeBoundCallback (&TestFThree, 1); mathieu@1418: MakeBoundCallback (&TestFFour, 1); mathieu@1418: MakeBoundCallback (&TestFFive, 1); mathieu@1418: mathieu@1418: MakeBoundCallback (&TestFROne, 1); mathieu@1418: MakeBoundCallback (&TestFRTwo, 1); mathieu@1418: MakeBoundCallback (&TestFRThree, 1); mathieu@1418: MakeBoundCallback (&TestFRFour, 1); mathieu@1418: MakeBoundCallback (&TestFRFive, 1); mathieu@1418: mathieu@1418: mathieu@1963: MakeCallback (&X::StaticProtectedParent); mathieu@1963: MakeCallback (&X::PublicParent, this); mathieu@1963: MakeCallback (&CallbackTest::ProtectedParent, this); mathieu@1963: // as expected, fails. mathieu@1963: //MakeCallback (&X::PrivateParent, this); mathieu@1963: // unexpected, but fails too. mathieu@1963: // It does fumble me. mathieu@1963: //MakeCallback (&X::ProtectedParent, this); mathieu@1418: mathieu@150: return ok; mathieu@9: } mathieu@9: mathieu@53: static CallbackTest gCallbackTest; mathieu@9: mathieu@9: }; // namespace mathieu@9: mathieu@9: #endif /* RUN_SELF_TESTS */