// EventIdList_t.cxx #include "dataset_id/EventIdList.h" #include #include #include #include #include "dataset_util/XmlElement.h" using std::cout; using std::endl; using std::vector; #if ( __GNUC__ != 2 ) using namespace std::rel_ops; #endif void msg(const char* msg) { cout << "----- "; cout << msg; cout << " -----" << endl; } int EventIdList_t() { msg("Default constructor"); { EventIdList evids; assert( ! evids.xml_only() ); EventIdList::size_type size = evids.size(); EventIdList::size_type max_size = evids.max_size(); cout << "size = " << size << endl; assert( size == 0 ); cout << "max size = " << max_size << endl; assert( max_size > 10000 ); } msg("Construct from a range"); { EventIdRange rng(101, 201, 220); assert( rng.size() == 20 ); EventIdList evids(rng); cout << evids << endl; assert( evids.size() == rng.size() ); } msg("Build a list"); EventId evid211 = EventId(2,11); EventId evid311 = EventId(3,11); EventId evid312 = EventId(3,12); EventId evid313 = EventId(3,13); EventIdList evids; { evids.insert(evid211); cout << evids << endl; assert( evids.size() == 1 ); assert( evids.ranges().size() == 1 ); evids.insert(evid211); cout << evids << endl; assert( evids.size() == 1 ); assert( evids.ranges().size() == 1 ); evids.insert(evid311); cout << evids << endl; assert( evids.size() == 2 ); assert( evids.ranges().size() == 2 ); evids.insert(evid313); cout << evids << endl; assert( evids.size() == 3 ); assert( evids.ranges().size() == 3 ); evids.insert(evid312); cout << evids << endl; assert( evids.size() == 4 ); assert( evids.ranges().size() == 2 ); msg("Check front"); assert( evids.front().is_valid() ); cout << evids.front() << endl; assert( evids.front() == evid211 ); msg("Check back"); assert( evids.back().is_valid() ); cout << evids.back() << endl; assert( evids.back() == evid313 ); cout << "Memsize = " << evids.memsize() << endl; assert( evids.memsize() > 0 ); } msg("Check find"); EventIdList::const_iterator i211 = evids.find(evid211); EventIdList::const_iterator i311 = evids.find(evid311); EventIdList::const_iterator i312 = evids.find(evid312); EventIdList::const_iterator i313 = evids.find(EventId(3,13)); EventIdList::const_iterator i314 = evids.find(EventId(3,14)); EventIdList::const_iterator i511 = evids.find(EventId(5,11)); assert( i211 != evids.end() ); assert( i311 != evids.end() ); assert( i312 != evids.end() ); assert( i313 != evids.end() ); assert( i314 == evids.end() ); assert( i511 == evids.end() ); assert( *i211 == evid211 ); assert( *i311 == evid311 ); assert( *i312 == evid312 ); assert( *i313 == evid313 ); msg("Contains event ID"); assert( evids.contains(evid211) ); assert( evids.contains(evid311) ); assert( evids.contains(evid312) ); assert( evids.contains(EventId(3,13)) ); assert( ! evids.contains(EventId()) ); assert( ! evids.contains(EventId(3,14)) ); assert( ! evids.contains(EventId(3,15)) ); msg("Contains event ID range"); assert( evids.contains(EventIdRange()) ); assert( evids.contains(EventIdRange(3,11,11)) ); assert( evids.contains(EventIdRange(3,12,12)) ); assert( evids.contains(EventIdRange(3,13,13)) ); assert( evids.contains(EventIdRange(3,11,13)) ); assert( ! evids.contains(EventIdRange(3,10,10)) ); assert( ! evids.contains(EventIdRange(3,14,14)) ); msg("Contains another event ID list"); { cout << evids << endl; EventIdList evids2; cout << evids2 << endl; assert( evids.contains(evids2) ); evids2.insert(evid311); cout << evids2 << endl; assert( evids.contains(evids2) ); evids2.insert(evid312); cout << evids2 << endl; assert( evids.contains(evids2) ); evids2.insert(evid313); cout << evids2 << endl; assert( evids.contains(evids2) ); evids2.insert(evid211); cout << evids2 << endl; assert( evids.contains(evids2) ); evids2.insert(EventId(3,14)); cout << evids2 << endl; assert( ! evids.contains(evids2) ); } msg("Iterate over the list"); { vector vids; vids.push_back(evid211); vids.push_back(evid311); vids.push_back(evid312); vids.push_back(evid313); vector::const_iterator ivid = vids.begin(); for ( EventIdList::const_iterator ieid=evids.begin(); ieid!=evids.end(); ++ieid ) { cout << *ieid << endl; assert( *ieid == *ivid ); ++ivid; } } msg("Remove an ID with iterator"); { EventIdList evids2 = evids; cout << evids2 << endl; assert( evids2.size() == evids.size() ); assert( evids2.contains(evid311) ); EventIdList::const_iterator ieid = evids2.find(evid311); evids2.erase(ieid); cout << evids2 << endl; assert( evids2.size() == evids.size()-1 ); assert( ! evids2.contains(evid311) ); assert( evids2.erase(EventId(3,15)) == 0 ); } msg("Remove an ID by value"); { EventIdList evids2 = evids; cout << evids2 << endl; assert( evids2.size() == evids.size() ); assert( evids2.contains(evid311) ); assert( evids2.erase(evid311) == 1 ); cout << evids2 << endl; assert( evids2.size() == evids.size()-1 ); assert( ! evids2.contains(evid311) ); assert( evids.erase(EventId(3,15)) == 0 ); } msg("Select ID's"); { EventIdList evids1 = evids; EventIdList::size_type old_size = evids1.size(); EventIdList evids2; cout << evids1 << endl; evids2.insert(EventIdRange(3,10,12)); cout << evids2 << endl; evids1.select(evids2); cout << evids1 << endl; assert( evids1.size()+2 == old_size ); } msg("Overlap"); { EventIdList evids1 = evids; EventIdList evids2; cout << evids1 << endl; evids2.insert(EventIdRange(3,20,25)); cout << evids2 << endl; assert( ! evids1.overlaps(evids2) ); evids2.insert(EventId(3,12)); cout << evids2 << endl; assert( evids1.overlaps(evids2) ); } msg("Merge ID's"); { EventIdList evids1 = evids; EventIdList evids2; cout << evids1 << endl; { evids2.insert(EventIdRange(3,10,15)); cout << evids2 << endl; EventIdList::size_type new_size = evids1.merge(evids2); cout << evids1 << endl; assert( new_size == 7 ); assert( evids1.size() == new_size ); } { evids2.insert(EventIdRange(3,10,15)); cout << evids2 << endl; EventIdList::size_type new_size = evids1.merge(evids2, true); cout << evids1 << endl; assert( new_size == 0 ); assert( evids2.size() != new_size ); } } msg("Equality"); { cout << evids << endl; EventIdList evids2; evids2.insert(evid211); evids2.insert(evid311); evids2.insert(evid312); cout << evids2 << endl; assert( evids2 != evids ); evids2.insert(evid313); cout << evids2 << endl; assert( evids2 == evids ); } msg("XML name"); cout << EventIdList::xml_name() << endl; msg("DTD"); cout << EventIdList::dtd() << endl; assert( EventIdList::dtd().size() > 0 ); msg("Write xml"); { const XmlElement* pele = evids.xml(); cout << *pele << endl; msg("Read XML"); { EventIdList evids2(*pele); cout << evids << endl; assert( evids2.xml_only() ); cout << evids2 << endl; assert( evids == evids2 ); assert( ! evids.xml_only() ); } msg("Read XML child"); { XmlElement xtest("Test"); xtest.add_child(evids.xml()); cout << xtest << endl; EventIdList evids2(xtest, true); cout << evids2 << endl; assert( evids == evids2 ); } msg("Read XML child -- NOT"); { XmlElement xtest("Test"); xtest.add_child(evids.xml()); cout << xtest << endl; EventIdList evids2(xtest, false); cout << evids2 << endl; assert( evids2.size() == 0 ); } msg("Read XML with too many children"); { XmlElement xtest("Test"); xtest.add_child(evids.xml()); xtest.add_child(evids.xml()); cout << xtest << endl; EventIdList evids2(xtest, true); cout << evids2 << endl; assert( evids2.size() == 0 ); } msg("Read XML grandchild"); { XmlElement xtest("Test"); XmlElement* pchild = new XmlElement("TestChild"); pchild->add_child(evids.xml()); xtest.add_child(pchild); cout << xtest << endl; EventIdList evids2(xtest, true); cout << evids2 << endl; assert( evids2.size() == 0 ); } } msg("Done"); return 0; } #ifdef CTEST_MAIN int main() { return EventIdList_t(); } #endif