void TestArchivoDeBuckets::tests() {
    char nombre[]= "archivo.bin";
    remove(nombre);
    ArchivoDeBuckets* archivo = new ArchivoDeBuckets(nombre,128);

    Distrito* d = new Distrito("Buenos Aires");
    Registro* r = new Registro(d);
    Bucket*	b	= new Bucket(9,128);

    b->agregarRegistro(r);

    int nrr = archivo->guardarBucket(b);

    delete r;

    b = archivo->obtenerBucket(nrr);
    cout << b->getEspacioLibre() << endl;
    cout << b->getTamanioDeDispersion() << endl;
    cout << b->getCantidadDeRegistros() << endl;
    r = new Registro(d);
    Registro* r2 = b->getRegistro(r);
    delete r;
    delete d;
    d = (Distrito*)r2->getContenido();
    cout << "Distrito: " << d->getDistrito() << endl;


    delete r2;
    delete d;
    delete archivo;
}
Bucket* TestArchivoDeBuckets::crearBucket5() {
    Bucket* bucket = new Bucket(LONGITUD_BLOQUE_PRUEBA,0);
    string distritos[] = {"Copenhague","Marseille","Viena","Praga"};

    for (int i=0; i < 4 ; i++) {
        Distrito* distrito = new Distrito(distritos[i]);
        Registro* registro = new Registro(distrito);
        delete(distrito);

        bucket->agregarRegistro(registro);
        delete(registro);
    }
    return bucket;
}
Bucket* TestArchivoDeBuckets::crearBucket4() {
    Bucket* bucket = new Bucket(LONGITUD_BLOQUE_PRUEBA,0);
    string distritos[] = {"Washington","Nueva York","Roma","Atenas"};

    for (int i=0; i < 4 ; i++) {
        Distrito* distrito = new Distrito(distritos[i]);
        Registro* registro = new Registro(distrito);
        delete(distrito);

        bucket->agregarRegistro(registro);
        delete(registro);
    }
    return bucket;
}
Bucket* TestArchivoDeBuckets::crearBucket3() {
    Bucket* bucket = new Bucket(LONGITUD_BLOQUE_PRUEBA,0);
    string distritos[] = {"Moscu","Auckland","Canberra","Puerto Moresby"};

    for (int i=0; i < 4 ; i++) {
        Distrito* distrito = new Distrito(distritos[i]);
        Registro* registro = new Registro(distrito);
        delete(distrito);

        bucket->agregarRegistro(registro);
        delete(registro);
    }
    return bucket;
}
Bucket* TestArchivoDeBuckets::crearBucket2() {
    Bucket* bucket = new Bucket(LONGITUD_BLOQUE_PRUEBA,0);
    string distritos[] = {"Montevideo","San Francisco","Paris","Londres"};

    for (int i=0; i < 4 ; i++) {
        Distrito* distrito = new Distrito(distritos[i]);
        Registro* registro = new Registro(distrito);
        delete(distrito);

        bucket->agregarRegistro(registro);
        delete(registro);
    }
    return bucket;
}
void TestArchivoDeBuckets::testCargo()
{
    int numero = 320;
    char nombre[]= {"buckets.bin"};
    ArchivoDeBuckets* archivo = new ArchivoDeBuckets(nombre,numero);

    Cargo* c = new Cargo("presidente");
    Registro* r = new Registro(c);
    Bucket* b = new Bucket(0,numero);
    b->agregarRegistro(r);
    delete c;
    delete r;

    c = new Cargo("vicepresidente");
    r = new Registro(c);
    b->agregarRegistro(r);
    delete r;
    delete c;

    int nrr = archivo->guardarBucket(b);

    Bucket* z = archivo->obtenerBucket(nrr);

    cout << "espacio libre: " << z->getEspacioLibre() << endl;
    cout << "cant registros: " << z->getCantidadDeRegistros() << endl;

    list<Registro*>::iterator it = z->ubicarPrimero();
    int cant = z->getCantidadDeRegistros();
    for(int i = 0; i<cant; i++) {
        Cargo* cargo = (Cargo*)((*it)->getContenido());
        cout << cargo->getCargo() << endl;
        delete cargo;
    }

    delete archivo;

}
Bucket* TestArchivoDeBuckets::crearBucket1() {
    Bucket* bucket = new Bucket(LONGITUD_BLOQUE_PRUEBA,0);
    string distritos[] = {"Buenos Aires","Puerto Esperanza","Bahia Blancaaaaa","ushuaia"};

    for (int i=0; i < 4 ; i++) {
        Distrito* distrito = new Distrito(distritos[i]);
        Registro* registro = new Registro(distrito);
        delete(distrito);

        bucket->agregarRegistro(registro);
        delete(registro);
    }

    return bucket;
}
void TestArchivoDeBuckets::testAgotamiento() {
    char nombreDelArchivo[]= "Archivo.bin";
    remove(nombreDelArchivo);
    int numero = LONGITUD_BLOQUE_PRUEBA;
    int nb;
    int nb2;
    Distrito* d;
    ArchivoDeBuckets* archivo = new ArchivoDeBuckets(nombreDelArchivo,numero);

    for (int i = 0; i < 10000; i++) {
        if (i == 5000)
            d = new Distrito("B");
        else
            d = new Distrito("A");

        Registro* r = new Registro(d);
        Bucket* b = new Bucket(0,numero);
        b->agregarRegistro(r);

        if (i==5000)
            nb = archivo->guardarBucket(b);
        else
            nb2 = archivo->guardarBucket(b);

        cout << "Bloque (" << i << ") almacenado en posicion :" << nb2 << endl;

        delete b;
        delete r;
        delete d;
    }

    cout << nb << endl;

    Bucket* buc = archivo->obtenerBucket(nb);
    cout << "cant regs" << buc->getCantidadDeRegistros() << endl;
    list<Registro*>::iterator it = buc->ubicarPrimero();
    Registro* reg = *it;
    Distrito* dis = (Distrito*)reg->getContenido();
    cout << "distrito: " << dis->getDistrito() << endl;
    delete archivo;
}
void TestArchivoDeBuckets::testVotante() {
    int numero = 320;
    char nombre[]= {"buckets.bin"};
    remove(nombre);
    ArchivoDeBuckets* archivo = new ArchivoDeBuckets(nombre,numero);

    Votante* v = new Votante(32,"nombre","password","domicilio","distrito");
    Registro* r = new Registro(v);
    Bucket* b = new Bucket(0,numero);
    b->mostarBucket();
    b->agregarRegistro(r);
    b->mostarBucket();

    delete r;
    delete v;

    int nrr = archivo->guardarBucket(b);

//	delete archivo;
//
//	archivo = new ArchivoDeBuckets(nombre,numero);

    b = archivo->obtenerBucket(nrr);
    cout << "A continuacion se muestra el bucket leido desde disco" << endl;
    b->mostarBucket();

    v = new Votante(32,"","","","");
    r = new Registro(v);
    Registro* r2 = b->getRegistro(r);
    b->mostarClavesDeBucket();
    delete v;
    delete r;
    v = (Votante*)(r2->getContenido());

    cout << "A continuacion se muestra la informacion del votante leido"<<endl;
    v->verVotante();
    delete v;
    delete r2;

    delete archivo;

    archivo = new ArchivoDeBuckets(nombre,numero);

    b = archivo->obtenerBucket(nrr);
    v = new Votante(32,"","","","");
    r = new Registro(v);
    r2 = b->getRegistro(r);
    delete r;
    delete v;
    v = (Votante*)r2->getContenido();

    v->setNombre("Vincent Van Gogh");
    v->setDistrito("Arles, Provence-Alpes-Côte d'Azur");
    v->setDomicilio("Rue des Suisses - 13200 ");
    v->setPassword("oreille");

    r2->setContenido(v);
    b->reemplazarRegistro(r2);
    delete r2;

    archivo->modificarBucket(nrr,b);

    delete archivo;

    archivo = new ArchivoDeBuckets(nombre,numero);

    b = archivo->obtenerBucket(nrr);
    v = new Votante(32,"","","","");
    r = new Registro(v);
    r2 = b->getRegistro(r);
    delete r;
    delete v;
    v = (Votante*)r2->getContenido();

    cout << v->getNombre() << endl;
    cout << v->getDomicilio() << endl;
    cout << v->getDistrito() << endl;

    delete archivo;
}
void TestArchivoDeBuckets::testLecturaEscrituraDeBuckets() {
    char nombreDelArchivo[]= "Archivo.bin";
    remove(nombreDelArchivo);
    int numero = LONGITUD_BLOQUE_PRUEBA;

    ArchivoDeBuckets* archivo = new ArchivoDeBuckets(nombreDelArchivo,numero);

    Distrito* distrito = new Distrito("Buenos Aires");
    string* serializacion = distrito->serializar();
    cout << "longitud distrito: "<< serializacion->size() << endl;
    delete serializacion;

    Registro* registro = new Registro(distrito);
    serializacion = registro->serializar();
    cout << "longitud registro: "<< serializacion->size() << endl;
    delete serializacion;

    delete distrito;

    Bucket* bucket = new Bucket(0,numero);
    serializacion = bucket->serializar();
    cout << "longitud bucket: "<< serializacion->size() << endl;
    delete serializacion;

    bucket->agregarRegistro(registro);
    serializacion = bucket->serializar();
    cout << "longitud bucket luego de agregar registro: "<< serializacion->size() << endl;
    delete serializacion;

    delete registro;

    int numeroDeBucket1 = archivo->guardarBucket(bucket);
    //delete bucket;

    bucket = archivo->obtenerBucket(numeroDeBucket1);

    distrito = new Distrito("Puerto Esperanza");
    serializacion = distrito->serializar();
    cout << "longitud: "<< serializacion->size() << endl;
    delete serializacion;

    registro = new Registro(distrito);
    serializacion = registro->serializar();
    cout << "longitud: "<< serializacion->size() << endl;
    delete serializacion;

    delete distrito;

    bucket->agregarRegistro(registro);
    serializacion = bucket->serializar();
    cout << "longitud: "<< serializacion->size() << endl;
    delete serializacion;

    delete registro;

    numeroDeBucket1 = archivo->guardarBucket(bucket);
    //delete bucket;

    cout << "Se muesta el bucket de la posicion: " << numeroDeBucket1 << endl;
    this->mostrarBucket(archivo,numeroDeBucket1);


    cout << "FIN DE EJECUCION" << endl;
    delete archivo;
}