#include "Ens32.h"
#include "Err.h"
#include "Commun.h"


void Ens32::Test(int k){   
	int i;
	cout<<"Test : ";
	for(i=0;i<k;i++) TestNext();
	for(i=0;i<k;i++) TestPut1();
	for(i=0;i<k;i++) TestPut0();
	for(i=0;i<k;i++) TestPutX();
	for(i=0;i<k;i++) TestPut();
	for(i=0;i<k;i++) TestComp();
	for(i=0;i<k;i++) TestIn();
	for(i=0;i<k;i++) TestRand();
	cout<<"OK"<<endl;
}
void Ens32::TestNext(){
	bool test;
	Ens32 A;
	A.Rand();   	// Ensemble aléatoire.
	int i;          	// Numéro de bit.
	int s1;         	// Nombre de bit à 1 dans A.
	int s2;         	// Nombre de bit à 1 dans ~A.
	s1=0;i=A.Next(0);while(i!=-1){s1++;i=A.Next(i+1);}
	A=~A;
	s2=0;i=A.Next(0);while(i!=-1){s2++;i=A.Next(i+1);}
	test=(s1+s2==32);
	EI("TestNext",test);
}

void Ens32::TestPut1(){
	bool test;
    Ens32 A;
    A.Rand();    // Ensemble aléatoire
    Ens32 B;            // Ensemble copie de A
    int i;             // Numéro de bit
    B=0;i=A.Next(0);while(i!=-1){B.Put1(i);i=A.Next(i+1);}  //B++;
    test=(A==B);
    EI("TestPUT1",test);
}

void Ens32::TestPut0(){
	bool test;
    Ens32 A;
    A.Rand();	 // Ensemble aléatoire
    Ens32 B;           // Ensemble copie de A
    int i;           // Numéro de bit
    B=-1;
    i=A.Next(0);
    while(i!=-1){B.Put0(i);i=A.Next(i+1);}  //B++;
    test=(A==~B);
    EI("TestPUT0",test);
}

void Ens32::TestPutX(){
	bool test;
	Ens32 A;A.Rand(); // Ensemble aléatoire
	Ens32 B;B.Rand(); // Ensemble copie de A
	Ens32 C;
    int i;        // Numéro de bit
    C=B;
    i=A.Next(0);
    while(i!=-1){B.PutX(i);i=A.Next(i+1);}  //B++;
    test=(A==((~B&C)|(~C&B)));
    EI("TestPUTX",test);
}
void Ens32::TestPut(){
	Ens32 A;A.Rand();
	Ens32 B;B.Rand(); 
	Ens32 C;C.Rand(); 
    int i;
    i=A.Next(0);while(i!=-1){C.Put(i,B[i]);i=A.Next(i+1);}
    A=~A;
    i=A.Next(0);while(i!=-1){C.Put(i,B[i]);i=A.Next(i+1);}
    EI("TestPUT",B==C);
}
void Ens32::TestComp(){
	Ens32 A;A.Rand();
	Ens32 B=A;
	EI("TestComp",A<=B && A>=B);
	int i=lrand(0,31);
	B.Put0(i);
	A.Put1(i);
	EI("TestComp",A>B && B<A && !(A<=B) && !(B>=A));
}

void Ens32::TestIn(){
	bool test;
	Ens32 A;
	A.Rand(); // Ensemble aléatoire
    Ens32 B;
    B.Rand(); // Ensemble copie de A
    int i;        // Numéro de bit
    for(i=0;i<32;i++) if (A.In(i)) B.Put1(i); else B.Put0(i); //B++;
    test=(A==B);
    EI("TestIN",test);
}

void Ens32::TestRand(){
	int n = 1000;
	int B[32]; for(int i=0;i<32;i++) B[i]=0;
	Ens32 x;
	int j;
	for(int k=0;k<n;k++){
		x.b=lrand();
		j=0;
		do {
			j = x.Next(j);
			if (j!=-1) {B[j]++; j++;}
		}
		while (j!=-1);
	}
	for(int i=0;i<32;i++) EI("TestRand", B[i]>n/3 && B[i]<2*n/3);
}
