
#include <objc/Object.h>
#include <coll/coll.h>

int compareInts(elt e1, elt e2)
{
  return (e1.int_t - e2.int_t);
}

@interface Collection (TestingExtras)
- printCount;
@end
@implementation Collection (TestingExtras)
- printCount
{
  printf("%s: count=%d\n", [self name], [self count]);
  return self;
}
@end

void checkSameContents(id colllist)
{
  unsigned i, c = [colllist count];
  
  for (i = 1; i < c; i++)
    if (![[colllist objectAtIndex:0] 
	  includesSameContents:[colllist objectAtIndex:i]])
      printf("collection 0 does not have same contents as collection %d\n", i);
}


BOOL nonNullTest(elt e)
{
  if (e.void_ptr_t == 0) return NO;
  else return YES;
}


main()
{
  int i, j, e;
  char *s;

  id array = [[Array alloc] initDescription:"i"];
  id sarray = [[SortedArray alloc] initDescription:"i" 
	       comparisonFunc:compareInts];
  id llist = [[LinkedList alloc] initDescription:"i"];
  id bag = [[Bag alloc] initDescription:"i"];
  id stack = [[Stack alloc] initDescription:"i"];
  id queue = [[Queue alloc] initDescription:"i"];
  id gaparray = [[GapArray alloc] initDescription:"i"];

  id collections = [DelegateList new];

  [collections delegateListAddObject:array];
  [collections delegateListAddObject:sarray];
  [collections delegateListAddObject:llist];
  [collections delegateListAddObject:bag];
  [collections delegateListAddObject:stack];
  [collections delegateListAddObject:queue];
  [collections delegateListAddObject:gaparray];
  printf("delegateList filled, count=%d\n",
	 [[collections delegateListList] count]);

  [collections addElement:99];
  [collections printCount];

  printf("Adding numbers...\n");
  for (i = 0; i < 17; i++)
    {
      e = random() % 99;
      printf("%2d ", e);
      [collections addElement:e];
    }
  printf("\ncollections filled\n\n");
  [collections printForDebugger];

  if ([array trueForAllByCalling:nonNullTest])
    printf("Array contains no zero's\n");

  checkSameContents([collections delegateListList]);

  printf("\nremoving 99\n\n");
  [collections removeElement:99];
  [collections printForDebugger];
  checkSameContents([collections delegateListList]);

  exit(0);

/*
  if (![collections trueForAllByPerforming:@selector(includesSameContents:)
	      with:array])
    printf("error: collections not all the same\n");
*/
}


