#include <stdio.h>
#include <string.h>

#include "bool.h"
#include "registry.h"

main() 
{
  Registry r;

  fprintf(stderr, "*** Testing Registry *** \n");
  fprintf(stderr, "Testing create(OBJSTR)...");
  r = Registry_create(&Registry_strcmp, &Registry_strhash);
  if (r != NULL) 
    fprintf(stderr, "passed.\n");
  else {
    fprintf(stderr, "failed.\n");
    abort();
  }
  fprintf(stderr, "Testing entry_count=0...");
  if (Registry_entry_count(r) == 0)
    fprintf(stderr, "passed.\n");
  else {
    fprintf(stderr, "failed.\n");
    abort();
  }
  fprintf(stderr, "Testing add(3 new)...");
  if (Registry_add(r, "foo", "fooval") != Bool_TRUE) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  if (Registry_add(r, "bar", "barval") != Bool_TRUE) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  if (Registry_add(r, "abc", "def") != Bool_TRUE) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  fprintf(stderr, "passed.\n"); /* add new */
  fprintf(stderr, "Testing add(2 dup)...");
  if (Registry_add(r, "bar", "barval") != Bool_FALSE) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  if (Registry_add(r, "foo", "fizval") != Bool_FALSE) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  fprintf(stderr, "passed.\n");	/* add dup */
  fprintf(stderr, "Testing entry_count=3...");
  if (Registry_entry_count(r) != 3) {
    fprintf(stderr, "failed.\n");
    abort();
  } else
    fprintf(stderr, "passed.\n");
  fprintf(stderr, "Testing get(is in)...");
  if (strcmp(Registry_get(r, "foo"), "fooval") != 0) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  if (strcmp(Registry_get(r, "bar"), "barval") != 0) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  if (strcmp(Registry_get(r, "abc"), "def") != 0) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  fprintf(stderr, "passed.\n");	/* get (is in) */
  fprintf(stderr, "Testing get(not in)...");
  if (Registry_get(r, "zzz") != NULL) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  if (Registry_get(r, "fooz") != NULL) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  if (Registry_get(r, "ab") != NULL) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  if (Registry_get(r, "") != NULL) {
    fprintf(stderr, "failed.\n");
    abort();
  }  
  fprintf(stderr, "passed.\n");	/* get (not in) */
  fprintf(stderr, "Testing remove(not in)...");
  if (Registry_remove(r, "zzz") != Bool_FALSE) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  if (Registry_remove(r, "fooz") != Bool_FALSE) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  if (Registry_remove(r, "ab") != Bool_FALSE) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  if (Registry_remove(r, "") != Bool_FALSE) {
    fprintf(stderr, "failed.\n");
    abort();
  }  
  fprintf(stderr, "passed.\n");	/* remove (not in) */
  fprintf(stderr, "Testing remove(is in)...");
  if (Registry_remove(r, "abc") != Bool_TRUE) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  fprintf(stderr, "passed.\n");
  fprintf(stderr, "Testing entry_count=2");
  if (Registry_entry_count(r) != 2) {
    fprintf(stderr, "failed.\n");
    abort();
  }
  fprintf(stderr, "passed.\n");
/* test traverse */
/* test fetch contents */
/* test pointer registry */
}
