Files
epics-base/src/libCom/test/epicsListTest.cpp
Andrew Johnson 95806cd1cd MSVC can't handle partial template specializations (swap<T>), so removed
removed swap<epicsList<T>> and renamed epicsSwap<epicsList<T>> to
epicsListSwap<T>
2001-04-12 15:35:56 +00:00

178 lines
3.8 KiB
C++

// $Id$
// Author: Andrew Johnson
// Date: December 2000
// Test code for the epics::List class
#include "epicsList.h"
#include <iostream.h>
#ifdef vxWorks
#define MAIN epicsListTest
#else
#define MAIN main
#endif
class fred {
public:
fred(const char* const _name) : name(_name) {}
void show () const {cout << name << ' ';}
private:
const char* const name;
};
static int tests = 0;
static int nak = 0;
static void check(bool res, const char* str, int line) {
tests++;
if (!res) {
printf("Test %d failed, line %d: %s\n", tests, line, str);
nak++;
}
}
#define test(expr) check(expr, #expr, __LINE__)
int MAIN(int /*argc*/, char* /*argv[]*/) {
fred* apf[10];
const char* const names[] = {
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"
};
int i;
for (i=0; i<10; i++)
apf[i] = new fred(names[i]);
epicsList<fred*> Fred;
test(Fred.empty());
test(Fred.size() == 0);
test(Fred.begin() == Fred.end());
Fred.push_back(apf[0]);
test(!Fred.empty());
test(Fred.size() == 1);
test(Fred.begin() != Fred.end());
test(Fred.front() == apf[0]);
test(Fred.back() == apf[0]);
epicsList<fred*>::iterator Fi = Fred.begin();
test(Fi != Fred.end());
test(*Fi == apf[0]);
epicsList<fred*>::const_iterator Fci = Fred.begin();
test(Fci != Fred.end());
test(Fci == Fi);
test(Fi == Fci);
test(*Fci == apf[0]);
++Fi;
test(Fi == Fred.end());
test(Fci != Fi);
test(Fi != Fci);
++Fci;
test(Fci == Fred.end());
Fci = --Fi;
test(Fi == Fred.begin());
test(Fci == Fred.begin());
Fred.push_front(apf[1]);
test(Fred.size() == 2);
test(Fred.front() == apf[1]);
test(Fred.back() == apf[0]);
test(*Fi == apf[0]);
Fi--;
test(*Fi == apf[1]);
Fci--;
test(*Fci == apf[1]);
Fi = Fred.insert(++Fi, apf[2]);
test(Fred.size() == 3);
test(Fred.front() == apf[1]);
test(Fred.back() == apf[0]);
test(Fi != Fci);
test(*Fi == apf[2]);
Fred.pop_back();
test(Fred.size() == 2);
Fred.push_front(apf[0]);
test(Fred.size() == 3);
Fi = Fred.begin();
Fred.erase(Fi);
test(Fred.size() == 2);
Fred.push_front(apf[0]);
test(Fred.size() == 3);
Fi = Fred.begin();
for (i=0; Fi != Fred.end(); i++, ++Fi)
test(*Fi == apf[i]);
Fci = Fred.begin();
for (i=0; Fci != Fred.end(); i++, ++Fci)
test(*Fci == apf[i]);
for (i=0; i<10; i++) {
test(Fred.size() == 3);
epicsList<fred*> Freda;
test(Freda.empty());
epicsListSwap(Fred, Freda);
test(Fred.empty());
test(Freda.size() == 3);
test(Freda.front() == apf[0]);
for (Fi = Freda.begin(); Fi != Freda.end(); Fi++)
Fred.push_back(*Fi);
test(Fred.size() == 3);
Fi = Freda.begin();
for (Fci = Fred.begin(); Fci != Fred.end(); ++Fci, ++Fi) {
test(Fi != Freda.end());
test(*Fci == *Fi);
}
// Freda's destructor returns her nodes to global store,
// from where they are allocated again during the next loop.
}
Fred.erase(Fred.begin(), --Fred.end());
test(Fred.size() == 1);
Fred.clear();
test(Fred.empty());
// Some more complicated stuff, just for the fun of it.
// Try doing this in tsDLList!
epicsList<epicsList<fred*>*> llf;
for (i=0; i<10; i++) {
llf.push_front(new epicsList<fred*>);
llf.front()->push_front(apf[i]);
}
test(llf.size() == 10);
epicsList<epicsList<fred*>*>::iterator llfi;
for (llfi = llf.begin(); llfi != llf.end(); ++llfi)
test(llfi->size() == 1);
for (llfi = llf.begin(); llfi != llf.end(); ++llfi) {
llfi->clear();
delete *llfi;
}
llf.clear();
for (i=0; i<10; i++)
delete apf[i];
cout << tests << " tests completed, " << nak << " failed." << endl;
return 0;
};