testavl.cpp
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #include "value.h"
00025 #include "property_map.h"
00026 #include "internal.h"
00027 #include "ustring.h"
00028 
00029 #include <stdio.h>
00030 #include <stdlib.h>
00031 #include <time.h>
00032 #include <assert.h>
00033 
00034 using namespace KJS;
00035 
00036 bool testInsertDelete(int numInsert, int numDelete, int delOffset, int randSeed) {
00037 
00038   srand(randSeed);
00039   char str[20];
00040   bool result = true;
00041 
00042   assert(numDelete >= 0 && numDelete < numInsert);
00043   assert(delOffset >= 0 && delOffset+numDelete <= numInsert);
00044   PropertyMap map;
00045 
00046   
00047   int *nums = (int*)malloc(numInsert*sizeof(int));
00048   int i;
00049   for (i = 0; i < numInsert; i++) {
00050     nums[i] = int(1000.0*rand()/RAND_MAX);
00051 
00052     Value val = Number(nums[i]);
00053     ValueImp *v = val.imp();
00054     v->ref();
00055 
00056     sprintf(str,"%05d-%05d",nums[i],i); 
00057     map.put(str,v,0);
00058     map.checkTree();
00059   }
00060 
00061   
00062   for (i = 0; i < numInsert; i++) {
00063     sprintf(str,"%05d-%05d",nums[i],i);
00064     ValueImp *v = map.get(str);
00065     if (v == 0 || v->type() != NumberType ||
00066         static_cast<NumberImp*>(v)->value() != nums[i]) {
00067       result = false;
00068     }
00069     map.checkTree();
00070   }
00071 
00072   
00073   for (i = delOffset; i < delOffset+numDelete; i++) {
00074     sprintf(str,"%05d-%05d",nums[i],i);
00075     map.remove(str);
00076     map.checkTree();
00077   }
00078 
00079   
00080   for (i = 0; i < numInsert; i++) {
00081     sprintf(str,"%05d-%05d",nums[i],i);
00082     ValueImp *v = map.get(str);
00083 
00084     if (i >= delOffset && i < delOffset+numDelete) {
00085       
00086       if (v)
00087         result = false;
00088     }
00089     else {
00090       
00091       if (v == 0 || v->type() != NumberType ||
00092           static_cast<NumberImp*>(v)->value() != nums[i]) {
00093         result = false;
00094       }
00095     }
00096     map.checkTree();
00097   }
00098 
00099   
00100   PropertyMapNode *it = map.first();
00101   int itcount = 0;
00102   while (it) {
00103     itcount++;
00104     PropertyMapNode *prev = it;
00105     it = it->next();
00106     if (it) {
00107       if (uscompare(prev->name,it->name) >= 0)
00108         result = false;
00109     }
00110   }
00111   if (itcount != numInsert-numDelete)
00112     result = false;
00113 
00114   if (result)
00115     printf("PASS: Insert %d, delete %d-%d, seed %d\n",numInsert,delOffset,
00116            delOffset+numDelete-1,randSeed);
00117   else
00118     printf("FAIL: Insert %d, delete %d-%d, seed %d\n",numInsert,delOffset,
00119            delOffset+numDelete-1,randSeed);
00120 
00121   return result;
00122 }
00123 
00124 void testMisc() {
00125   PropertyMap *map;
00126 
00127   
00128   map = new PropertyMap();
00129   map->remove("nonexistent");
00130   delete map;
00131   printf("PASS: remove() doesn't crash with empty list\n");
00132 
00133   
00134   map = new PropertyMap();
00135   map->get("nonexistent");
00136   delete map;
00137   printf("PASS: get() doesn't crash with empty list\n");
00138 
00139   
00140   map = new PropertyMap();
00141   if (map->get("nonexistent") == 0)
00142     printf("PASS: get() returns 0 on an empty list\n");
00143   else
00144     printf("FAIL: get() returns 0 on an empty list\n");
00145   delete map;
00146 }
00147 
00148 int main()
00149 {
00150   PropertyMap map;
00151 
00152   testMisc();
00153 
00154   int randomSeed = 4;
00155   int numTests = 100;
00156 
00157   srand(randomSeed);
00158 
00159   int *numInserts = (int*)malloc(numTests*sizeof(int));
00160   int *numDeletes = (int*)malloc(numTests*sizeof(int));
00161   int *delOffsets = (int*)malloc(numTests*sizeof(int));
00162   int i;
00163   for (i = 0; i < numTests; i++) {
00164     numInserts[i] = int(1000.0*rand()/RAND_MAX);
00165     numDeletes[i] = int(float(numInserts[i])*rand()/RAND_MAX);
00166     delOffsets[i] = int(float(numInserts[i]-numDeletes[i])*rand()/RAND_MAX);
00167   }
00168 
00169   for (i = 0; i < numTests; i++) {
00170     testInsertDelete(numInserts[i],numDeletes[i],delOffsets[i],4);
00171   }
00172 
00173 
00174 
00175   return 0;
00176 }
 
This file is part of the documentation for kjs Library Version 3.2.0.