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("nonexistant");
00130 delete map;
00131 printf("PASS: remove() doesn't crash with empty list\n");
00132
00133
00134 map = new PropertyMap();
00135 map->get("nonexistant");
00136 delete map;
00137 printf("PASS: get() doesn't crash with empty list\n");
00138
00139
00140 map = new PropertyMap();
00141 if (map->get("nonexistant") == 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 kdelibs Version 3.1.4.