Commit 1c7abb05 authored by Ulrich Sibiller's avatar Ulrich Sibiller Committed by Mihai Moldovan

Lift record to xorg-server-1.2.0/xorg-server-1.3.0.0 state

parent 0b625990
......@@ -44,9 +44,6 @@ from The Open Group.
implemented, and RecordCreateSet will decide heuristically which one
to use based on the set members.
Note: When compiling for use in the server, do not use -DTESTING.
When compiling for stand-alone testing of the set ADT, use -DTESTING.
*/
#ifdef HAVE_DIX_CONFIG_H
......@@ -55,28 +52,7 @@ from The Open Group.
#include <string.h>
#ifndef TESTING
#include "misc.h"
#else
#include <stdio.h>
#include <stdlib.h>
/* stuff that you normally get from the X Server's environment */
typedef int Bool;
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
typedef unsigned short CARD16;
#ifndef max
#define max(_a, _b) ( ((_a) > (_b)) ? (_a) : (_b) )
#endif
#endif /* TESTING */
#include "set.h"
static int
......@@ -417,20 +393,6 @@ bailout:
return (RecordSetPtr)prls;
}
#ifdef TESTING
typedef enum {
BitVectorImplementation, IntervalListImplementation} RecordSetImplementation;
RecordSetImplementation _RecordSetImpl;
static void
_RecordForceSetImplementation(setimpl)
RecordSetImplementation setimpl;
{
_RecordSetImpl = setimpl;
}
#endif
typedef RecordSetPtr (*RecordCreateSetProcPtr)(
RecordSetInterval *pIntervals,
int nIntervals,
......@@ -455,12 +417,8 @@ _RecordSetMemoryRequirements(pIntervals, nIntervals, alignment, ppCreateSet)
&bma);
rlsize = IntervalListMemoryRequirements(pIntervals, nIntervals, maxMember,
&rla);
#ifdef TESTING
if (_RecordSetImpl == BitVectorImplementation)
#else
if ( ( (nIntervals > 1) && (maxMember <= 255) )
|| (bmsize < rlsize) )
#endif
{
*alignment = bma;
*ppCreateSet = BitVectorCreateSet;
......@@ -509,183 +467,3 @@ RecordCreateSet(pIntervals, nIntervals, pMem, memsize)
}
return (*pCreateSet)(pIntervals, nIntervals, pMem, size);
}
/***************************************************************************/
#ifdef TESTING
/*
Test Strategy
Having two set representations is convenient for testing because we
can play them against each other. The test code will be able to
specify which implementation to use. This breaks the encapsulation,
but that seems acceptable for testing. The crux of the test loop
looks like this:
loop:
generate random list of Intervals
create set A using bit vector implementation
create set B using Interval list implementation
for each possible set member
if set A and set B disagree on whether this is a member error;
iterate over both sets, comparing the intervals returned by each.
if intervals or number of intervals are different error;
iterate over intervals of set A
for i = interval.first to interval.last
if i is not a member of set B error;
iterate over intervals of set B
for i = interval.first to interval.last
if i is not a member of set A error;
destroy sets A, B
*/
int GenerateRandomIntervals(pIntervals, maxintervals)
RecordSetInterval *pIntervals;
int maxintervals;
{
int i, nIntervals;
nIntervals = rand() % maxintervals;
for (i = 0; i < nIntervals; i++)
{
pIntervals[i].first = rand();
pIntervals[i].last = pIntervals[i].first + rand();
}
return nIntervals;
}
#define MAXINTERVALS 100
int main(argc, argv)
int argc;
char **argv;
{
RecordSetPtr bs, rs;
RecordSetInterval br, rr;
RecordSetIteratePtr bi, ri;
CARD16 i;
int testcount;
RecordSetInterval intervals[MAXINTERVALS];
int nIntervals;
int bsize, rsize;
int balign, ralign;
int pad;
for (testcount = 0; 1; testcount++)
{
nIntervals = GenerateRandomIntervals(intervals, MAXINTERVALS);
printf("%d nIntervals %d\n", testcount, nIntervals);
if (testcount & 1)
{
_RecordForceSetImplementation(BitVectorImplementation);
bsize = RecordSetMemoryRequirements(intervals, nIntervals, &balign);
_RecordForceSetImplementation(IntervalListImplementation);
rsize = RecordSetMemoryRequirements(intervals, nIntervals, &ralign);
pad = (ralign - (bsize & (ralign - 1))) & (ralign - 1);
bs = (RecordSetPtr)malloc(bsize + pad + rsize );
if (!bs)
{
fprintf(stderr, "%d: failed to alloc memory for sets\n",
testcount);
continue;
}
rs = (RecordSetPtr)(((char *)bs) + bsize + pad);
}
else
{
bs = rs = NULL;
bsize = rsize = 0;
}
_RecordForceSetImplementation(BitVectorImplementation);
bs = RecordCreateSet(intervals, nIntervals, bs, bsize);
_RecordForceSetImplementation(IntervalListImplementation);
rs = RecordCreateSet(intervals, nIntervals, rs, rsize);
if (!bs || !rs)
{
fprintf(stderr, "%d: failed to create sets\n", testcount);
continue;
}
for (i = 0; i < 65535; i++)
{
unsigned long b, r;
b = RecordIsMemberOfSet(bs, i);
r = RecordIsMemberOfSet(rs, i);
if ( (b && !r) || (!b && r) )
{
fprintf(stderr, "%d: isMemberOfSet %d\n",
testcount, (int)i);
}
}
bi = RecordIterateSet(bs, NULL, &br);
ri = RecordIterateSet(rs, NULL, &rr);
while (bi && ri)
{
if ( (rr.first != br.first) || (rr.last != br.last) )
{
fprintf(stderr, "%d: iterateSet interval value mismatch\n",
testcount);
}
bi = RecordIterateSet(bs, bi, &br);
ri = RecordIterateSet(rs, ri, &rr);
}
if (bi != ri)
{
fprintf(stderr, "%d: iterateSet interval count mismatch\n",
testcount);
}
bi = NULL;
while (bi = RecordIterateSet(bs, bi, &br))
{
for (i = br.first; i <= br.last; i++)
{
if (!RecordIsMemberOfSet(rs, i))
{
fprintf(stderr, "%d: iterateSet b / isMemberOfSet r %d\n",
testcount, (int)i);
}
}
}
ri = NULL;
while (ri = RecordIterateSet(rs, ri, &rr))
{
for (i = rr.first; i <= rr.last; i++)
{
if (!RecordIsMemberOfSet(bs, i) )
{
fprintf(stderr, "%d: iterateSet r / isMemberOfSet b %d\n",
testcount, (int)i);
}
}
}
RecordDestroySet(bs);
RecordDestroySet(rs);
if (testcount & 1)
{
free(bs);
}
}
}
#endif /* TESTING */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment