1
0
Fork 0

Merge branch 'devel' of github.com:triAGENS/AvocadoDB

This commit is contained in:
Frank Celler 2012-05-03 15:03:21 +02:00
commit 9f0b91d12e
3 changed files with 240 additions and 128 deletions

View File

@ -0,0 +1,3 @@
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE "C Unit Tests for Cambridge"
#include <boost/test/unit_test.hpp>

View File

@ -36,13 +36,18 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/* regression testing program for GeoIndex module */ /* regression testing program for GeoIndex module */
/* R.A.P. 2.0 4.12.2011 */ /* R.A.P. 2.1 8.1.2012 */
#include <boost/test/unit_test.hpp>
#ifdef GEO_TRIAGENS
#include "GeoIndex/GeoIndex.h" #include "GeoIndex/GeoIndex.h"
#else #include "Basics/StringUtils.h"
#include "GeoIndex2.h"
#endif using namespace triagens::basics;
// -----------------------------------------------------------------------------
// --SECTION-- private variables
// -----------------------------------------------------------------------------
int errors; int errors;
@ -67,73 +72,41 @@ int np4[4]={2838,5116,5180,9869};
int hs4[4]={33972992,9770664,11661062,28398735}; int hs4[4]={33972992,9770664,11661062,28398735};
int hs5[4]={79685116,67516870,19274248,35037618}; int hs5[4]={79685116,67516870,19274248,35037618};
void icheck(int e, int a, int b) // -----------------------------------------------------------------------------
{ // --SECTION-- private functions
if(a==b) return; // -----------------------------------------------------------------------------
errors++;
printf("Error %d, should be %d, was %d\n",e,a,b); static void MyFree (GeoIndex * gi) {
int x;
x=GeoIndex_INDEXVALID(gi);
BOOST_CHECK_EQUAL(x, 0);
GeoIndex_free(gi);
} }
void pcheck(int e, char * a, char * b) int GCCHECK (GeoCoordinates * gc, int ct, char const * bytes) {
{
if(a==b) return;
errors++;
if(b>a) printf("Error %d, pointer was %ld too high\n",e,(long)(b-a));
if(b<a) printf("Error %d, pointer was %ld too low \n",e,(long)(a-b));
}
void dcheck(int e, double a, double b, double bar)
{
if(b<a-bar)
{
errors++;
printf("Error %d, should be %16.9f, was %16.9f\n",e,a,b);
}
if(b>a+bar)
{
errors++;
printf("Error %d, should be %16.9f, was %16.9f\n",e,a,b);
}
}
void gccheck(int e, GeoCoordinates * gc, int ct, char * bytes)
{
int i,good; int i,good;
icheck(e,ct,gc->length);
for(i=0;i<1000;i++) ix[i]=0; for(i=0;i<1000;i++) ix[i]=0;
for(i=0;i<gc->length;i++) for(i=0;i<(int) gc->length;i++)
*((char *)gc->coordinates[i].data)=1; *((char *)gc->coordinates[i].data)=1;
for(i=0;i<25;i++) for(i=0;i<25;i++)
iy[i]='A'+ix[4*i]+2*ix[4*i+1]+4*ix[4*i+2]+8*ix[4*i+3]; iy[i]='A'+ix[4*i]+2*ix[4*i+1]+4*ix[4*i+2]+8*ix[4*i+3];
iy[25]=0; iy[25]=0;
good=1; good=1;
for(i=0;i<25;i++) if(bytes[i]!=iy[i]) good=0; for(i=0;i<25;i++) if(bytes[i]!=iy[i]) good=0;
if(good==0)
{
errors++;
printf("Error %d, should be %s, was %s\n",e+1,bytes,iy);
}
GeoIndex_CoordinatesFree(gc); GeoIndex_CoordinatesFree(gc);
return good;
} }
void gicheck(int e, GeoIndex* gi) int GCMASS (GeoCoordinates * gc, int ct, int hash) {
{
int r;
r=0;
#ifdef DEBUG
r = GeoIndex_INDEXVALID(gi);
#endif
if(r==0) return;
errors++;
printf("Error %d, Index invalidity code %d\n",e,r);
}
void gcmass(int e, GeoCoordinates * gc, int ct, int hash)
{
int i,j; int i,j;
icheck(e,ct,gc->length);
for(i=0;i<1000;i++) ix[i]=0; for(i=0;i<1000;i++) ix[i]=0;
for(i=0;i<gc->length;i++) for(i=0;i<(int) gc->length;i++)
(*((char *)gc->coordinates[i].data))++; (*((char *)gc->coordinates[i].data))++;
j=0; j=0;
for(i=0;i<1000;i++) for(i=0;i<1000;i++)
@ -142,10 +115,61 @@ void gcmass(int e, GeoCoordinates * gc, int ct, int hash)
j=j*7; j=j*7;
j=j%123456791; j=j%123456791;
} }
icheck(e+1,hash,j);
GeoIndex_CoordinatesFree(gc); GeoIndex_CoordinatesFree(gc);
return hash == j ? 1 : 0;
} }
double tolerance (double a, double b, double c) {
if (c == 0.0) {
return 0.00000001;
}
else {
if (a == 0.0) {
if (b == 0.0) {
return 0.001;
}
else {
return c / b * 100.0;
}
}
else {
return c / a * 100.0;
}
}
}
#define icheck(e, a, b) \
BOOST_TEST_CHECKPOINT(StringUtils::itoa((e))); \
BOOST_CHECK_EQUAL((a), (b))
#define pcheck(e, a, b) \
BOOST_TEST_CHECKPOINT(StringUtils::itoa((e))); \
BOOST_CHECK_EQUAL((a), (b))
#define dcheck(e, a, b, c) \
BOOST_TEST_CHECKPOINT(StringUtils::itoa((e))); \
BOOST_CHECK_CLOSE((a), (b), tolerance((a),(b),(c)))
#define gccheck(e, gc, ct, bytes) \
BOOST_TEST_CHECKPOINT(StringUtils::itoa((e))); \
BOOST_CHECK_EQUAL((ct), (gc)->length); \
BOOST_CHECK_EQUAL(GCCHECK((gc), (ct), (bytes)), 1)
#ifdef DEBUG
#define gicheck(e, gi) \
BOOST_TEST_CHECKPOINT(StringUtils::itoa((e))); \
BOOST_CHECK_EQUAL(GeoIndex_INDEXVALID((gi)), 0)
#else
#define gicheck(e, gi) /* do nothing */
#endif
#define gcmass(e, gc, ct, hash) \
BOOST_TEST_CHECKPOINT(StringUtils::itoa((e))); \
BOOST_CHECK_EQUAL((ct), (gc)->length); \
BOOST_TEST_CHECKPOINT(StringUtils::itoa((e + 1))); \
BOOST_CHECK_EQUAL(GCMASS((gc), (ct), (hash)), 1)
void coonum(GeoCoordinate * gc, int num) void coonum(GeoCoordinate * gc, int num)
{ {
double lat,lon; double lat,lon;
@ -196,7 +220,42 @@ void coonum(GeoCoordinate * gc, int num)
} }
} }
int main(int argc, char ** argv) void litnum(GeoCoordinate * gc, int num)
{
coonum(gc,num);
gc->data=&ix[num%97];
return;
}
// -----------------------------------------------------------------------------
// --SECTION-- setup / tear-down
// -----------------------------------------------------------------------------
struct GeoIndexSetup {
GeoIndexSetup () {
BOOST_TEST_MESSAGE("setup GeoIndex");
}
~GeoIndexSetup () {
BOOST_TEST_MESSAGE("tear-down GeoIndex");
}
};
// -----------------------------------------------------------------------------
// --SECTION-- test suite
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief setup
////////////////////////////////////////////////////////////////////////////////
BOOST_FIXTURE_TEST_SUITE(GeoIndexTest, GeoIndexSetup)
////////////////////////////////////////////////////////////////////////////////
/// @brief main test
////////////////////////////////////////////////////////////////////////////////
void runTest (int mode)
{ {
GeoIndex * gi; GeoIndex * gi;
GeoCoordinate gcp; GeoCoordinate gcp;
@ -204,14 +263,7 @@ int main(int argc, char ** argv)
GeoCoordinates * list1; GeoCoordinates * list1;
double la,lo; double la,lo;
double d1; double d1;
int i,j,r,mode; int i,j,r;
if(argc!=2)
{
printf("usage georeg <n> to run test n\n");
exit(1);
}
mode=atoi(argv[1]);
errors=0; errors=0;
@ -221,26 +273,26 @@ int main(int argc, char ** argv)
/* 3 is Auckland -36.916667 +174.783333 */ /* 3 is Auckland -36.916667 +174.783333 */
/* 4 is Jo'burg -26.166667 +28.033333 */ /* 4 is Jo'burg -26.166667 +28.033333 */
gcp1.latitude = 51.5; gcp1.latitude = 51.5;
gcp1.longitude = -0.166666; gcp1.longitude = -0.166666;
gcp2.latitude = 21.306111; gcp2.latitude = 21.306111;
gcp2.longitude = -157.859722; gcp2.longitude = -157.859722;
d1 = GeoIndex_distance(&gcp1, &gcp2); d1 = GeoIndex_distance(&gcp1, &gcp2);
dcheck(1,11624035.0, d1, 11000.0); dcheck(1,11624035.0, d1, 11000.0);
gcp3.latitude = -36.916667; gcp3.latitude = -36.916667;
gcp3.longitude = 174.783333; gcp3.longitude = 174.783333;
d1 = GeoIndex_distance(&gcp1, &gcp3); d1 = GeoIndex_distance(&gcp1, &gcp3);
dcheck(2,18332948.0, d1, 18000.0); dcheck(2,18332948.0, d1, 18000.0);
gcp4.latitude = -26.166667; gcp4.latitude = -26.166667;
gcp4.longitude = +28.033333; gcp4.longitude = +28.033333;
d1 = GeoIndex_distance(&gcp1, &gcp4); d1 = GeoIndex_distance(&gcp1, &gcp4);
dcheck(3,9059681.0, d1, 9000.0); dcheck(3,9059681.0, d1, 9000.0);
d1 = GeoIndex_distance(&gcp2, &gcp3); d1 = GeoIndex_distance(&gcp2, &gcp3);
dcheck(4,7076628.0, d1, 7000.0); dcheck(4,7076628.0, d1, 7000.0);
d1 = GeoIndex_distance(&gcp2, &gcp4); d1 = GeoIndex_distance(&gcp2, &gcp4);
dcheck(5,19194970.0, d1, 19000.0); dcheck(5,19194970.0, d1, 19000.0);
d1 = GeoIndex_distance(&gcp3, &gcp4); d1 = GeoIndex_distance(&gcp3, &gcp4);
dcheck(6,12177171.0, d1, 12000.0); dcheck(6,12177171.0, d1, 12000.0);
/* 10 - 19 */ /* 10 - 19 */
@ -268,8 +320,8 @@ int main(int argc, char ** argv)
list1 = GeoIndex_NearestCountPoints(gi,&gcp,1); list1 = GeoIndex_NearestCountPoints(gi,&gcp,1);
gccheck(13,list1, 1,"AAAAAAAAAAAAAAAABAAAAAAAA"); gccheck(13,list1, 1,"AAAAAAAAAAAAAAAABAAAAAAAA");
gicheck(14,gi); gicheck(14,gi);
/*GeoIndex_INDEXDUMP(gi,stdout);*/
GeoIndex_free(gi); MyFree(gi);
/* 20 - 39 */ /* 20 - 39 */
@ -312,7 +364,7 @@ int main(int argc, char ** argv)
icheck(29,0,r); icheck(29,0,r);
gicheck(30,gi); gicheck(30,gi);
GeoIndex_free(gi); MyFree(gi);
/* */ /* */
/* 50 - 69 */ /* 50 - 69 */
/* ========= */ /* ========= */
@ -391,7 +443,7 @@ int main(int argc, char ** argv)
gicheck(66,gi); gicheck(66,gi);
GeoIndex_free(gi); MyFree(gi);
/* */ /* */
/* 70 - 99 */ /* 70 - 99 */
@ -520,7 +572,7 @@ int main(int argc, char ** argv)
gccheck(97,list1, 7,"KPBAAAAAAAAAAAAAAAAAAAAAA"); gccheck(97,list1, 7,"KPBAAAAAAAAAAAAAAAAAAAAAA");
gicheck(98,gi); gicheck(98,gi);
GeoIndex_free(gi); MyFree(gi);
/* */ /* */
/* 100 - 199 */ /* 100 - 199 */
@ -593,7 +645,7 @@ int main(int argc, char ** argv)
gccheck(150,list1,16,"AAAAAAAAAAAAMPAPPDAAAAAAA"); gccheck(150,list1,16,"AAAAAAAAAAAAMPAPPDAAAAAAA");
gicheck(151,gi); gicheck(151,gi);
GeoIndex_free(gi); MyFree(gi);
/* */ /* */
/* 200 - 299 */ /* 200 - 299 */
@ -787,7 +839,7 @@ int main(int argc, char ** argv)
gccheck(265,list1, 5,"ODAAAAAAAAAAAAAAAAAAAAAAA"); gccheck(265,list1, 5,"ODAAAAAAAAAAAAAAAAAAAAAAA");
gicheck(266,gi); gicheck(266,gi);
GeoIndex_free(gi); MyFree(gi);
/* */ /* */
/* 300 - 399 */ /* 300 - 399 */
@ -978,7 +1030,7 @@ int main(int argc, char ** argv)
if(mode==2) if(mode==2)
{ {
printf("start of 5000000 x points within radius 127 Km (3 found)\n"); BOOST_TEST_MESSAGE("start of 5000000 x points within radius 127 Km (3 found)");
for(i=0;i<10000;i++) for(i=0;i<10000;i++)
{ {
for(j=1;j<=500;j++) for(j=1;j<=500;j++)
@ -988,12 +1040,12 @@ int main(int argc, char ** argv)
GeoIndex_CoordinatesFree(list1); GeoIndex_CoordinatesFree(list1);
} }
} }
printf("End of timing test\n"); BOOST_TEST_MESSAGE("End of timing test");
} }
if(mode==3) if(mode==3)
{ {
printf("start of 5000000 x points by count (2)\n"); BOOST_TEST_MESSAGE("start of 5000000 x points by count (2)");
for(i=0;i<10000;i++) for(i=0;i<10000;i++)
{ {
for(j=1;j<=500;j++) for(j=1;j<=500;j++)
@ -1003,12 +1055,12 @@ int main(int argc, char ** argv)
GeoIndex_CoordinatesFree(list1); GeoIndex_CoordinatesFree(list1);
} }
} }
printf("End of timing test\n"); BOOST_TEST_MESSAGE("End of timing test");
} }
gicheck(390,gi); gicheck(390,gi);
GeoIndex_free(gi); MyFree(gi);
/* */ /* */
/* 400 - 499 */ /* 400 - 499 */
@ -1036,14 +1088,13 @@ int main(int argc, char ** argv)
if(lo>180) lo-=360.0; if(lo>180) lo-=360.0;
} }
list1 = GeoIndex_PointsWithinRadius(gi,&gcp,9800000.0); list1 = GeoIndex_PointsWithinRadius(gi,&gcp,9800000.0);
for(j=0;j<list1->length;j++) /* delete before freeing list1! */ for(j=0;j<(int) list1->length;j++) /* delete before freeing list1! */
{ {
r=GeoIndex_remove(gi,list1->coordinates+j); r=GeoIndex_remove(gi,list1->coordinates+j);
} }
gcmass(400+5*i,list1, np[i], hs[i]); gcmass(400+5*i,list1, np[i], hs[i]);
} }
MyFree(gi);
GeoIndex_free(gi);
/* */ /* */
/* 500 - 599 */ /* 500 - 599 */
@ -1075,9 +1126,9 @@ int main(int argc, char ** argv)
} }
} }
GeoIndex_free(gi); MyFree(gi);
/* */ /* */
/* 600 - 610 */ /* 600 - 649 */
/* ========= */ /* ========= */
/* */ /* */
@ -1105,9 +1156,50 @@ int main(int argc, char ** argv)
gcmass(605+4*(i/4541672),list1,i/1832703,hs5[i/4541672 - 1]); gcmass(605+4*(i/4541672),list1,i/1832703,hs5[i/4541672 - 1]);
} }
} }
GeoIndex_free(gi); MyFree(gi);
} }
/* */ /* */
/* 650 - 699 */
/* ========= */
/* */
/* This set of tests puts in a few points, looks */
/* then puts in loads and deletes them again and */
/* looks again. Testing deletion balancing */
gi=GeoIndex_new();
for(i=1;i<13;i++) /* put in points 1-12 */
{
litnum(&gcp,i);
r = GeoIndex_insert(gi,&gcp);
icheck(651,0,r);
}
litnum(&gcp,17);
list1 = GeoIndex_PointsWithinRadius(gi,&gcp,984000.0);
gccheck(652,list1, 5,"KCKAAAAAAAAAAAAAAAAAAAAAA");
litnum(&gcp,16);
list1 = GeoIndex_NearestCountPoints(gi,&gcp,4);
gccheck(654,list1, 4,"EBBBAAAAAAAAAAAAAAAAAAAAA");
for(i=100;i<80000;i++) /* put in points 100-80000 */
{
litnum(&gcp,i);
r = GeoIndex_insert(gi,&gcp);
icheck(655,0,r);
}
for(i=100;i<80000;i++) /* remove them again */
{
litnum(&gcp,i);
r = GeoIndex_remove(gi,&gcp);
icheck(656,0,r);
}
litnum(&gcp,17); /* see if it is all still OK */
list1 = GeoIndex_PointsWithinRadius(gi,&gcp,984000.0);
gccheck(657,list1, 5,"KCKAAAAAAAAAAAAAAAAAAAAAA");
litnum(&gcp,16);
list1 = GeoIndex_NearestCountPoints(gi,&gcp,4);
gccheck(659,list1, 4,"EBBBAAAAAAAAAAAAAAAAAAAAA");
MyFree(gi);
/* */
/* 900 - 999 */ /* 900 - 999 */
/* ========= */ /* ========= */
/* */ /* */
@ -1136,17 +1228,45 @@ int main(int argc, char ** argv)
list1 = GeoIndex_PointsWithinRadius(gi,&gcp,30000000.0); list1 = GeoIndex_PointsWithinRadius(gi,&gcp,30000000.0);
gcmass(901,list1, 49, 94065911); gcmass(901,list1, 49, 94065911);
GeoIndex_free(gi); MyFree(gi);
if(errors==0) {
printf("Georeg Regression Program succeeded\n");
return 0;
}
else {
printf("Georeg Regression Program failed with %d errors\n",
errors);
return 1;
}
} }
/* end of georeg.c */ ////////////////////////////////////////////////////////////////////////////////
/// @brief tst_geo1
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_geo1) {
runTest(1);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief tst_geo2
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_geo2) {
runTest(2);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief tst_geo3
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_geo3) {
runTest(3);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief tst_geo4
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_geo4) {
runTest(4);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate tests
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_SUITE_END ()
/* end of georeg.cpp */

View File

@ -1,11 +0,0 @@
SUBDIRS = .
PID := $(shell echo $$PPID)
TMP_DIR := "/tmp/avocadodb.$(PID)"
PID_FILE := "/tmp//avocadodb.$(PID).pid"
.PHONY: start-avocadodb stop-avocadodb
start-avocadodb:
echo $(PID)
echo $(TMP_DIR)