kjs Library API Documentation

testavl.cpp

00001 // -*- c-basic-offset: 2 -*-
00002 /*
00003  *  This file is part of the KDE libraries
00004  *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
00005  *
00006  *  This library is free software; you can redistribute it and/or
00007  *  modify it under the terms of the GNU Lesser General Public
00008  *  License as published by the Free Software Foundation; either
00009  *  version 2 of the License, or (at your option) any later version.
00010  *
00011  *  This library is distributed in the hope that it will be useful,
00012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  *  Lesser General Public License for more details.
00015  *
00016  *  You should have received a copy of the GNU Lesser General Public License
00017  *  along with this library; see the file COPYING.LIB.  If not, write to
00018  *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00019  *  Boston, MA 02111-1307, USA.
00020  *
00021  *  $Id: testavl.cpp,v 1.4 2002/06/19 08:21:00 domi Exp $
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   // add some random numbers
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); // ensure uniqueness
00057     map.put(str,v,0);
00058     map.checkTree();
00059   }
00060 
00061   // check to ensure they're all there
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   // delete some
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   // make sure the deletes ones aren't there any more, and the others are
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       // should have been deleted
00086       if (v)
00087         result = false;
00088     }
00089     else {
00090       // should not have been deleted
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   // check that first() and next() work
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   // test remove() doesn't crash with empty list
00128   map = new PropertyMap();
00129   map->remove("nonexistant");
00130   delete map;
00131   printf("PASS: remove() doesn't crash with empty list\n");
00132 
00133   // test get() doesn't crash with empty list
00134   map = new PropertyMap();
00135   map->get("nonexistant");
00136   delete map;
00137   printf("PASS: get() doesn't crash with empty list\n");
00138 
00139   // test get() returns 0 on an empty list
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 }
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.4.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Sun Feb 27 22:15:18 2005 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001