Ignore:
Timestamp:
Dec 13, 2011, 12:02:21 PM (14 years ago)
Author:
Frederik Heber <heber@…>
Children:
3324cf
Parents:
d85532
git-author:
Frederik Heber <heber@…> (12/02/11 13:13:44)
git-committer:
Frederik Heber <heber@…> (12/13/11 12:02:21)
Message:

Relay can now also relay notifications.

  • NOTE: We do not yet notify the Observables, whose update() we combine, when the Relay is destroyed. They have to signOff before by themselves (or by some other means, e.g. be destroyed before.).
Location:
src/Patterns/Observer/unittests
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/Patterns/Observer/unittests/ObserverUnitTest.cpp

    rd85532 rb760ac5  
    7171  RelayObservable = new RelayTest;
    7272  RelayObserver = new RelayCountObserver(RelayObservable);
     73
     74  RelayNotifier = new RelayNotification;
     75  RelayNotified = new RelayNotificationObserver(RelayObservable);
    7376}
    7477
     
    8487  delete RelayObservable;
    8588  delete RelayObserver;
     89  delete RelayNotifier;
     90  delete RelayNotified;
    8691
    8792  delete observer1;
     
    276281}
    277282
     283void ObserverTest::relayNotificationTest()
     284{
     285  observerLog().enableLogging();
     286
     287  // sign on some observables to the relay
     288  notificationObservable->signOn(RelayNotifier, NotificationObservable::Operation1Notify);
     289  notificationObservable->signOn(RelayNotifier, NotificationObservable::Operation2Notify);
     290  notificationObservable->signOn(notificationObserver1, NotificationObservable::Operation1Notify);
     291
     292  RelayNotifier->signOn(RelayNotified, NotificationObservable::Operation1Notify);
     293
     294  // operation1
     295  notificationObservable->operation1();
     296  CPPUNIT_ASSERT(RelayNotified->wasNotified);
     297  CPPUNIT_ASSERT(notificationObserver1->wasNotified);
     298
     299  RelayNotified->wasNotified=false;
     300
     301  // operation2
     302  notificationObservable->operation2();
     303  CPPUNIT_ASSERT(!RelayNotified->wasNotified);
     304  CPPUNIT_ASSERT(notificationObserver1->wasNotified);
     305
     306  // signOff relay from 1 and operation1
     307  notificationObserver1->wasNotified=false;
     308  notificationObservable->signOff(RelayNotifier, NotificationObservable::Operation1Notify);
     309
     310  notificationObservable->operation1();
     311  CPPUNIT_ASSERT(!RelayNotified->wasNotified);
     312  CPPUNIT_ASSERT(notificationObserver1->wasNotified);
     313
     314  // test kill subject
     315  delete RelayNotified;
     316  RelayNotified = NULL; // delete in tearDown is allowed for NULL
     317  notificationObservable->operation1();
     318  delete notificationObservable;
     319  notificationObservable = NULL; // delete in tearDown is allowed for NULL
     320
     321  observerLog().disableLogging();
     322}
     323
    278324void ObserverTest::CircleDetectionTest() {
    279325  std::cout << std::endl << "Warning: the next test involved methods that can produce infinite loops." << std::endl;
  • src/Patterns/Observer/unittests/ObserverUnitTest.hpp

    rd85532 rb760ac5  
    2828class NotificationObservable;
    2929class RelayCountObserver;
     30class RelayNotification;
     31class RelayNotificationObserver;
    3032
    3133class ObserverTest :  public CppUnit::TestFixture
     
    4042  CPPUNIT_TEST ( iteratorTest );
    4143  CPPUNIT_TEST ( relayTest );
     44  CPPUNIT_TEST ( relayNotificationTest );
    4245  CPPUNIT_TEST ( CircleDetectionTest );
    4346  CPPUNIT_TEST_SUITE_END();
     
    5558  void iteratorTest();
    5659  void relayTest();
     60  void relayNotificationTest();
    5761  void CircleDetectionTest();
    5862
     
    7680  RelayTest *RelayObservable;
    7781  RelayCountObserver *RelayObserver;
     82  RelayNotification *RelayNotifier;
     83  RelayNotificationObserver *RelayNotified;
    7884};
    7985
  • src/Patterns/Observer/unittests/stubs/ObserverStub.cpp

    rd85532 rb760ac5  
    239239{}
    240240
     241/************ RelayNotification ***************/
     242
     243RelayNotification::RelayNotification() :
     244    Relay(std::string("RelayTest"))
     245{
     246  Channels *OurChannel = new Channels();
     247  NotificationChannels.insert( std::make_pair(this, OurChannel) );
     248  OurChannel->addChannel(NotificationObservable::Operation1Notify);
     249  OurChannel->addChannel(NotificationObservable::Operation2Notify);
     250}
     251
     252RelayNotification::~RelayNotification()
     253{}
     254
    241255/************ RelayCountObserver ***************/
    242256
     
    259273}
    260274
     275/********* RelayNotificationObserver ***********/
     276
     277RelayNotificationObserver::RelayNotificationObserver(const Observable * const _relay) :
     278  Observer("RelayNotificationObserver"),
     279  wasNotified(false),
     280  relay(_relay)
     281{}
     282
     283RelayNotificationObserver::~RelayNotificationObserver()
     284{}
     285
     286void RelayNotificationObserver::update(Observable*){}
     287void RelayNotificationObserver::subjectKilled(Observable*){}
     288void RelayNotificationObserver::recieveNotification(Observable *publisher, Notification_ptr notification){
     289  // check that we are not called by the relay itself
     290  CPPUNIT_ASSERT(publisher != relay);
     291  wasNotified = true;
     292}
     293
  • src/Patterns/Observer/unittests/stubs/ObserverStub.hpp

    rd85532 rb760ac5  
    148148};
    149149
     150class RelayNotification : public Relay
     151{
     152public:
     153  RelayNotification();
     154  ~RelayNotification();
     155private:
     156};
     157
     158class RelayNotificationObserver : public Observer {
     159public:
     160  RelayNotificationObserver(const Observable * const _relay);
     161  virtual ~RelayNotificationObserver();
     162
     163  void update(Observable*);
     164  void subjectKilled(Observable*);
     165  void recieveNotification(Observable *publisher, Notification_ptr notification);
     166
     167  bool wasNotified;
     168private:
     169  const Observable * const relay;
     170};
     171
    150172#endif /* OBSERVERSTUB_HPP_ */
Note: See TracChangeset for help on using the changeset viewer.