#include #include #include "config.h" #include "BHeap.h" #include "FHeap.h" #include "BinHeap.h" #include "PLList.h" char N[] = { 5, 9, 10, 29, 6, 1, 15, 18, 25, 11, 2, 14, 23, 16, 17, 3, 8, 24, 20, 13, 30, 21, 26, 4, 7, 28, 12, 27, 19, 22, }; void exception(int e, char *msg) { fprintf(stderr, "%s\n", msg); exit(-1); } PriorityList *newlist(int method) { switch (method) { case 0: return new BinHeap; break; case 1: return new BHeap; break; case 2: return new FHeap; break; case 3: return new PLList; break; default: cerr << _("Unknow priority list type: ") << method << endl; exit(-1); } } void DoCombTest(int method, int number) { int i, n; Key_t K, oK; Datas_t Datas; PriorityList *T; cerr << _("Creation of a priority list and adding ") << number << _(" random entrie(s)..."); T = newlist(method); for (i = 1; i <= number; i++) { // T->Insert(rand() % P_INFINITY, NULL); // T->Insert(rand() % 100, NULL); T->Insert(1, NULL); } cerr << _("Ok.\nDeleting the list..."); oK = P_INFINITY; for (i = number; i >= 1; i--) { if (T->n() != i) { cerr << _("List has ") << T->n() << _(" keys. Expecting ") << i << endl; exception(1, _("List corrupted.")); } if ((n = T->rn()) != i) { cerr << _("List has ") << T->rn() << _(" keys (real count). Expecting ") << i << endl; exception(1, _("List corrupted.")); } K = T->Extract_Min(Datas); if (oK < K) exception(1, _("Incorrect order.")); } delete T; cerr << "Ok.\n"; } void FullTest(int method) { PriorityList *T; Datas_t Datas; Cell C1, C2, C3 = NULL; Key_t K; int i; cerr << _("Size of a PriorityList cell: ") << sizeof(PriorityList) << endl; cerr << _("Size of a BHeap cell : ") << sizeof(BHeap) << endl; cerr << _("Size of a FHeap cell : ") << sizeof(FHeap) << endl; cerr << _("Size of a PLList header : ") << sizeof(PLList) << endl; cerr << _("Size of a CList cell : ") << sizeof(CList) << endl; cerr << _("Size of a SList cell : ") << sizeof(SList) << endl; cerr << _("Size of a BinHeap header : ") << sizeof(BinHeap) << endl; cerr << _("Size of a BinHeap cell : ") << sizeof(binheap_t) << endl; DoCombTest(method, 0); DoCombTest(method, 30); DoCombTest(method, 70); DoCombTest(method, 1000); // DoCombTest(method, 10000); #ifdef BT DoCombTest(method, 100000); #ifdef VBT DoCombTest(method, 1000000); #endif #endif cerr << _("Creating a priority list and adding keys:\n"); T = newlist(method); for (i = 0; i < 30; i++) { fprintf(stderr, "%i ", N[i]); C1 = T->Insert(N[i], NULL); if (N[i] == 30) C3 = C1; } if (!C3) exit(-1); fprintf(stderr, "59 54 -10\n"); C1 = T->Insert(59, NULL); C2 = T->Insert(54, NULL); T->Insert(-10, NULL); cerr << _("Ok.\nList browsing...\n"); T->Dump(cerr); cerr << _("Ok.\nExtract_Min + List browsing...\n"); cerr << T->Extract_Min(Datas) << endl; T->Dump(cerr); cerr << _("Ok.\nLower_Key(0) over 59...\n"); T->Lower_Key(C1, 0); cerr << _("Ok.\nList browsing...\n"); T->Dump(cerr); cerr << _("Ok.\nDelete over 54...\n"); T->Delete(Datas, C2); cerr << _("Ok.\nList browsing...\n"); T->Dump(cerr); cerr << _("Ok.\nLower_Key(-12) over 30...\n"); T->Lower_Key(C3, -12); cerr << _("Ok.\nList browsing...\n"); T->Dump(cerr); cerr << _("Ok.\nExtract_Min...\n"); cerr << T->Extract_Min(Datas) << endl; cerr << _("Ok.\nExtracting datas...\n"); for (i = 0; i <= 29; i++) { cerr << _("Minimum #") << i << " = " << (K = (T->Extract_Min(Datas))) << endl; if (K != i) exception(1, _("Incorrect order.")); } cerr << _("Ok.\n\nAll the tests were successfull\n"); return; } void Usage(void) { cerr << _("Usage: testTas [type]\n"); exit(-1); } int main(int argc, char **argv) { int method = -1; while (--argc) { argv++; if ((strlen(*argv) != 1) || (((*argv)[0] < '0' || (*argv)[0] > '3'))) { cerr << _("Unknow priority list type: ") << *argv << endl; Usage(); } if (method != -1) { cerr << _("Extra command: ") << *argv << endl; Usage(); } method = (*argv)[0] - '0'; } if (method == -1) method = 0; FullTest(method); return 0; }