#include "member.h"
#include "consistent_hash.h"

int
main(int argc, char *argv[]) {

	consistent_hash ch;

	

	for (int i = 0; i < 5; i ++) {
		member m(100*i);

		//overall, this adds one element
		assert(ch.contains_member(m) == false);		
		assert(ch.add_member(m) == true);
		assert(ch.contains_member(m) == true);	
		//printf("id %d hash is %f \n", 100*i, ch.hash(m));
		assert(ch.contains_member(m) == true);
		assert(ch.remove_member(m) == true);
		assert(ch.contains_member(m) == false);	
		assert(ch.remove_member(m) == false);
		assert(ch.add_member(m) == true);
		assert(ch.add_member(m) == false);
			
	}

	//ch.print_mems();

	assert(ch.lookup_hash(0.0025).get_client_id() == 0);
	assert(ch.lookup_hash(0.002).get_client_id() == 300);
	assert(ch.lookup_hash(0.78).get_client_id() == 300);
	assert(ch.lookup_hash(0.60).get_client_id() == 100);
	assert(ch.lookup_hash(0.40).get_client_id() == 400);

	assert(ch.lookup(3).get_client_id() == 400);


	//printf("hash of 401 %f, 1 %f, 301 %f \n", ch.hash(401), ch.hash(1), ch.hash(301));

	assert(ch.lookup(401).get_client_id() == 0);
	assert(ch.lookup_next(*(new member(0))).get_client_id() == 200);
	assert(ch.lookup_previous(*(new member(0))).get_client_id() == 300);


	assert(ch.lookup(1).get_client_id() == 300);
	assert(ch.lookup_next(*(new member(300))).get_client_id() == 0);
	assert(ch.lookup_previous(*(new member(300))).get_client_id() == 100);

	assert(ch.lookup(301).get_client_id() == 400);
	assert(ch.lookup_next(*(new member(400))).get_client_id() == 100);
	assert(ch.lookup_previous(*(new member(400))).get_client_id() == 200);

	printf("Tests passed OK \n");

}
