%description: basic positive check for cArray's add(cObject *), get(...), operator[](...), exist(...), ownership mgmt, size(), remove(...) not tested here: 'holes' in array, clear(), addAt(..), set(..), remove-add-remove cycles %activity: #define CHECK(cond) if (!(cond)) {throw cRuntimeError("BUG at line %d, failed condition %s", __LINE__, #cond);} cArray a("a"); // add 100 messages to cArray cMessage *msgs[100]; int pos[100]; int i; for (i=0; i<100; i++) { if (i==50) a.setTakeOwnership(false); char name[20]; sprintf(name,"msg-%d", i); msgs[i] = new cMessage(name); pos[i] = a.add(msgs[i]); } // test if they were added correctly CHECK(a.size()==100); for (i=0; i<100; i++) { cMessage *msg = msgs[i]; int k = pos[i]; CHECK(a.find(msg)==k); CHECK(a.find(msg->getName())==k); CHECK(a.get(k)==msg); CHECK(a[k]==msg); CHECK(a.get(msg->getName())==msg); CHECK(a[msg->getName()]==msg); CHECK(a.exist(k)); CHECK(a.exist(msg->getName())); if (i<50) { CHECK(msg->getOwner()==&a); } else { CHECK(msg->getOwner()!=&a); } } // remove them for (i=0; i<100; i++) { cMessage *msg = msgs[i]; int k = pos[i]; // remove in 3 different ways if (i%3==0) { CHECK(a.remove(k)==msg); } if (i%3==1) { CHECK(a.remove(msg->getName())==msg); } if (i%3==2) { CHECK(a.remove(msg)==msg); } // check it's no longer in there CHECK(a.find(msg)<0); CHECK(a.find(msg->getName())<0); CHECK(!a.exist(k)); CHECK(!a.exist(msg->getName())); CHECK(a.get(k)==nullptr); CHECK(a[k]==nullptr); CHECK(a.get(msg->getName())==nullptr); CHECK(a[msg->getName()]==nullptr); CHECK(msg->getOwner()!=&a); CHECK(a.remove(k)==nullptr); CHECK(a.remove(msg->getName())==nullptr); CHECK(a.remove(msg)==nullptr); } EV << "OK!\n"; %contains: stdout OK! %not-contains: stdout BUG