#include"Land.h"
#include"Err.h"
#include "Commun.h"
#include<iostream>
using namespace std;

void Land::Test(int k){
	int i;
	cout<<"Land::Test : ";
	for(i=0;i<k;i++) TestAddLand();
	for(i=0;i<k;i++) TestMalloc();
	for(i=0;i<k;i++) TestCalloc();
	for(i=0;i<k;i++) TestFree();
	cout<<"OK"<<endl;
}
void Land::TestAddLand(){
	const int b_ = 10;
	const int nL_ = 10;
	const int nP_ = 10;
	const int na_ = 10;
	
	int tb=lrand(1,b_);
	int aQ=0;
	Land L(tb);
	for(int i=0;i<na_;i++){
		int nL=lrand(2,nL_);
		int nP=lrand(1,nP_);
		L.AddLand(nL,nP);
		aQ += tb*nL*sizeof(int);
	}
	aQ += L.t*sizeof(int);
	int n=0;
	int* k = L.p;
	while (k){
	n++;
	if (tb>1)memset((char*)(k+1),255,(tb-1)*sizeof(int));
	k = *(int**)k;
	}

	EI("Land::TestAddLand",aQ==(int)((n*tb+L.t)*sizeof(int))); 
}

void Land::TestMalloc(){
	const int b_ = 10;
	const int nL_ = 10;
	const int nP_ = 10;
	const int n_ = 1000;

	int tb=lrand(1,b_);
	Land L(tb);
	int nL=lrand(2,nL_);
	int nP=lrand(1,nP_);
	struct{int* p; int v;} M[n_];
	for(int i=0;i<n_;i++)M[i].v=0;
	for(int i=0;i<n_;i++){
		int j=lrand(0,n_-1);
		if (M[j].v) {L.Free(M[j].p); M[j].v=0;}
		else {
			int v=lrand(); while (!v) v=lrand(); 
			M[j].p=L.Malloc(nL,nP);M[j].v=v;
			for(int k=0;k<tb;k++) M[j].p[k]=v+k; 
		}
	}
	for(int i=0;i<n_;i++) if (M[i].v) for(int k=0;k<tb;k++) EI("Land::TestMalloc",M[i].p[k]==M[i].v+k);
}

void Land::TestCalloc(){
	const int b_ = 10;
	const int nL_ = 10;
	const int nP_ = 10;
	const int n_ = 1000;

	int tb=lrand(1,b_);
	Land L(tb);
	int nL=lrand(2,nL_);
	int nP=lrand(1,nP_);
	struct{int* p; int v;} M[n_];
	for(int i=0;i<n_;i++)M[i].v=0;
	for(int i=0;i<n_;i++){
		int j=lrand(0,n_-1);
		if (M[j].v) {L.Free(M[j].p); M[j].v=0;} else {
			int v=lrand(); while (!v) v=lrand(); 
			M[j].p=L.Calloc(nL,nP);M[j].v=v;
			for(int k=0;k<tb;k++) EI("Land::TestCalloc : different de zéro", M[j].p[k]==0);
			for(int k=0;k<tb;k++) M[j].p[k]=v+k; 
		}
	}
	for(int i=0;i<n_;i++) if (M[i].v) for(int k=0;k<tb;k++) EI("Land::TestCalloc : oublier", M[i].p[k]==M[i].v+k ); 
}

void Land::TestFree(){
	const int b_ = 10;
	const int nL_ = 10;
	const int nP_ = 10;
	const int n_ = 1000;

	int tb=lrand(1,b_);
	Land L(tb);
	int nL=lrand(2,nL_);
	int nP=lrand(1,nP_);
	struct{int* p; int v;} M[n_];
	for(int i=0;i<n_;i++)M[i].v=0;
	for(int i=0;i<n_;i++){
		int j=lrand(0,n_-1);
		if (M[j].v) {L.Free(M[j].p); M[j].v=0;}
		else {
			int v=lrand(); while (!v) v=lrand(); 
			M[j].p=L.Malloc(nL,nP);M[j].v=v;
			for(int k=0;k<tb;k++) M[j].p[k]=v+k; 
		}
	}
	for(int i=0;i<n_;i++) if (M[i].v) L.Free(M[i].p);
	EI("Land::TestFree",L.Qi==0);
}
