This commit also update CS interface (find should return shared_ptr<Data>, CS entry is internal to CS, the design diagrams are corrected too). Change-Id: Ib6377b6d9b8478640ac35d3cfb6c9180cc57c4fe
232 lines
4.3 KiB
C++
232 lines
4.3 KiB
C++
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
|
/**
|
|
* Copyright (C) 2014 Named Data Networking Project
|
|
* See COPYING for copyright and distribution information.
|
|
*/
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
#include "util/event-emitter.hpp"
|
|
|
|
namespace ndn {
|
|
|
|
class EventEmitterTester : noncopyable
|
|
{
|
|
public:
|
|
EventEmitterTester();
|
|
|
|
int m_hit;
|
|
int m_a1;
|
|
int m_a2;
|
|
int m_a3;
|
|
int m_a4;
|
|
|
|
void
|
|
clear();
|
|
|
|
void
|
|
f0();
|
|
|
|
void
|
|
f1(int a1);
|
|
|
|
void
|
|
f2(int a1, int a2);
|
|
|
|
void
|
|
f3(int a1, int a2, int a3);
|
|
|
|
void
|
|
f4(int a1, int a2, int a3, int a4);
|
|
};
|
|
|
|
EventEmitterTester::EventEmitterTester()
|
|
{
|
|
this->clear();
|
|
}
|
|
|
|
void
|
|
EventEmitterTester::clear()
|
|
{
|
|
m_hit = 0;
|
|
m_a1 = 0;
|
|
m_a2 = 0;
|
|
m_a3 = 0;
|
|
m_a4 = 0;
|
|
}
|
|
|
|
void
|
|
EventEmitterTester::f0()
|
|
{
|
|
++m_hit;
|
|
}
|
|
|
|
void
|
|
EventEmitterTester::f1(int a1)
|
|
{
|
|
++m_hit;
|
|
m_a1 = a1;
|
|
}
|
|
|
|
void
|
|
EventEmitterTester::f2(int a1, int a2)
|
|
{
|
|
++m_hit;
|
|
m_a1 = a1;
|
|
m_a2 = a2;
|
|
}
|
|
|
|
void
|
|
EventEmitterTester::f3(int a1, int a2, int a3)
|
|
{
|
|
++m_hit;
|
|
m_a1 = a1;
|
|
m_a2 = a2;
|
|
m_a3 = a3;
|
|
}
|
|
|
|
void
|
|
EventEmitterTester::f4(int a1, int a2, int a3, int a4)
|
|
{
|
|
++m_hit;
|
|
m_a1 = a1;
|
|
m_a2 = a2;
|
|
m_a3 = a3;
|
|
m_a4 = a4;
|
|
}
|
|
|
|
static int g_EventEmitterTest_RefObject_copyCount;
|
|
|
|
class EventEmitterTest_RefObject
|
|
{
|
|
public:
|
|
EventEmitterTest_RefObject() {}
|
|
|
|
EventEmitterTest_RefObject(const EventEmitterTest_RefObject& other);
|
|
};
|
|
|
|
EventEmitterTest_RefObject::EventEmitterTest_RefObject(const EventEmitterTest_RefObject& other)
|
|
{
|
|
++g_EventEmitterTest_RefObject_copyCount;
|
|
}
|
|
|
|
void
|
|
EventEmitterTest_RefObject_byVal(EventEmitterTest_RefObject a1) {}
|
|
|
|
void
|
|
EventEmitterTest_RefObject_byRef(const EventEmitterTest_RefObject& a1) {}
|
|
|
|
|
|
BOOST_AUTO_TEST_SUITE(UtilEventEmitter)
|
|
|
|
BOOST_AUTO_TEST_CASE(ZeroListener)
|
|
{
|
|
EventEmitter<> ee;
|
|
BOOST_CHECK_NO_THROW(ee());
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(TwoListeners)
|
|
{
|
|
EventEmitterTester eet1;
|
|
EventEmitterTester eet2;
|
|
EventEmitter<> ee;
|
|
ee += bind(&EventEmitterTester::f0, &eet1);
|
|
ee += bind(&EventEmitterTester::f0, &eet2);
|
|
ee();
|
|
|
|
BOOST_CHECK_EQUAL(eet1.m_hit, 1);
|
|
BOOST_CHECK_EQUAL(eet2.m_hit, 1);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(ZeroArgument)
|
|
{
|
|
EventEmitterTester eet;
|
|
EventEmitter<> ee;
|
|
ee += bind(&EventEmitterTester::f0, &eet);
|
|
ee();
|
|
|
|
BOOST_CHECK_EQUAL(eet.m_hit, 1);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(OneArgument)
|
|
{
|
|
EventEmitterTester eet;
|
|
EventEmitter<int> ee;
|
|
ee += bind(&EventEmitterTester::f1, &eet, _1);
|
|
ee(11);
|
|
|
|
BOOST_CHECK_EQUAL(eet.m_hit, 1);
|
|
BOOST_CHECK_EQUAL(eet.m_a1, 11);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(TwoArguments)
|
|
{
|
|
EventEmitterTester eet;
|
|
EventEmitter<int,int> ee;
|
|
ee += bind(&EventEmitterTester::f2, &eet, _1, _2);
|
|
ee(21, 22);
|
|
|
|
BOOST_CHECK_EQUAL(eet.m_hit, 1);
|
|
BOOST_CHECK_EQUAL(eet.m_a1, 21);
|
|
BOOST_CHECK_EQUAL(eet.m_a2, 22);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(ThreeArguments)
|
|
{
|
|
EventEmitterTester eet;
|
|
EventEmitter<int,int,int> ee;
|
|
ee += bind(&EventEmitterTester::f3, &eet, _1, _2, _3);
|
|
ee(31, 32, 33);
|
|
|
|
BOOST_CHECK_EQUAL(eet.m_hit, 1);
|
|
BOOST_CHECK_EQUAL(eet.m_a1, 31);
|
|
BOOST_CHECK_EQUAL(eet.m_a2, 32);
|
|
BOOST_CHECK_EQUAL(eet.m_a3, 33);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(FourArguments)
|
|
{
|
|
EventEmitterTester eet;
|
|
EventEmitter<int,int,int,int> ee;
|
|
ee += bind(&EventEmitterTester::f4, &eet, _1, _2, _3, _4);
|
|
ee(41, 42, 43, 44);
|
|
|
|
BOOST_CHECK_EQUAL(eet.m_hit, 1);
|
|
BOOST_CHECK_EQUAL(eet.m_a1, 41);
|
|
BOOST_CHECK_EQUAL(eet.m_a2, 42);
|
|
BOOST_CHECK_EQUAL(eet.m_a3, 43);
|
|
BOOST_CHECK_EQUAL(eet.m_a4, 44);
|
|
}
|
|
|
|
// EventEmitter passes arguments by reference,
|
|
// but it also allows a handler that accept arguments by value
|
|
BOOST_AUTO_TEST_CASE(HandlerByVal)
|
|
{
|
|
EventEmitterTest_RefObject refObject;
|
|
g_EventEmitterTest_RefObject_copyCount = 0;
|
|
|
|
EventEmitter<EventEmitterTest_RefObject> ee;
|
|
ee += &EventEmitterTest_RefObject_byVal;
|
|
ee(refObject);
|
|
|
|
BOOST_CHECK_EQUAL(g_EventEmitterTest_RefObject_copyCount, 1);
|
|
}
|
|
|
|
// EventEmitter passes arguments by reference, and no copying
|
|
// is necessary when handler accepts arguments by reference
|
|
BOOST_AUTO_TEST_CASE(HandlerByRef)
|
|
{
|
|
EventEmitterTest_RefObject refObject;
|
|
g_EventEmitterTest_RefObject_copyCount = 0;
|
|
|
|
EventEmitter<EventEmitterTest_RefObject> ee;
|
|
ee += &EventEmitterTest_RefObject_byRef;
|
|
ee(refObject);
|
|
|
|
BOOST_CHECK_EQUAL(g_EventEmitterTest_RefObject_copyCount, 0);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|
|
|
|
} // namespace ndn
|