#include <stdbool.h>
#include <stdio.h>

#include "listarray.h"

#define TEST(EXP,RESULT) if (EXP != RESULT) { ++errors; printf ("  Error for: %s\n", #EXP);}

/* Test collection example */
void
testExample (void)
{
  printf("--EXAMPLE TEST--\n");

  int errors = 0;
  
  listarray_t * list = new (5);

  TEST( size (list),   0 );   // list is empty
  TEST( add (list,42), true); // added item
  TEST( size (list),   1 );   // list is appropriate size
  TEST( get (list,0),  42);   // check item was added / indexable

  clear(list);
  printf ("Done: errors = %d\n", errors);
} // testExample


/* Test all methods for a single node (no expansions) */
void
testBasic (void)
{
  printf("--BASIC TESTS--\n");
  
  const unsigned int CAPACITY = 10;
  int errors = 0;
 
  listarray_t * list = new (CAPACITY);

  TEST( size(list), 0 );        // initial list is empty

  int i; // index for all loops
  
  /* Test add (successful), size (incremented), and get (new item) */
  for (i=0 ; i<CAPACITY ; i++) {
    TEST( add (list,i), true);  // added item i
    TEST( size (list),  i+1 );  // list is appropriate size
    TEST( get (list,i), i);     // check index i is item i
  }

  /* Test contains (true and false) at all locations*/
  for (i=0 ; i< 2*CAPACITY ; i++) {
    TEST( contains (list,i), i<CAPACITY); // list contains item
  }

  /* Test set (return), size (same), and get (new value) */
  for ( i=0 ; i<CAPACITY ; i++) {
    TEST( set (list, i, i + CAPACITY), i);
    TEST( size (list), CAPACITY ) ;
    TEST( get (list,i), i + CAPACITY); 
  }

  clear (list); // should run without memory errors
  
  printf ("Done: errors = %d\n", errors);
} // testBasic


/* Driver program for test suite */
int
main (void)
{
  testExample();
  testBasic();
  // Add more test collections here
} // main
