Untitled

 avatar
unknown
plain_text
8 months ago
3.5 kB
11
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/resource.h>
#include <dirent.h>

// Função auxiliar para comparar dois ficheiros linha a linha
int comparar_ficheiros(const char *ficheiro1, const char *ficheiro2, int *linha_diferente) {
    FILE *f1 = fopen(ficheiro1, "r");
    FILE *f2 = fopen(ficheiro2, "r");
    if (!f1 || !f2) {
        if (f1) fclose(f1);
        if (f2) fclose(f2);
        return -1; // erro ao abrir
    }

    char linha1[1024], linha2[1024];
    int linha = 1;

    while (fgets(linha1, sizeof(linha1), f1) && fgets(linha2, sizeof(linha2), f2)) {
        if (strcmp(linha1, linha2) != 0) {
            *linha_diferente = linha;
            fclose(f1);
            fclose(f2);
            return 0; // diferentes
        }
        linha++;
    }

    // Verificar se ambos chegaram ao fim
    int eof1 = feof(f1);
    int eof2 = feof(f2);
    fclose(f1);
    fclose(f2);

    if (!eof1 || !eof2) {
        *linha_diferente = linha;
        return 0; // tamanhos diferentes
    }

    return 1; // iguais
}

// Função para medir o uso de memória
void mostrar_memoria_usada() {
    struct rusage r_usage;
    getrusage(RUSAGE_SELF, &r_usage);
    printf("Memória utilizada: %ld KB\n", r_usage.ru_maxrss);
}

// Função para medir tempo de execução (exemplo simplificado)
double tempo_execucao(void (*funcao)(void)) {
    struct timespec start, end;
    clock_gettime(CLOCK_REALTIME, &start);
    funcao(); // executa função
    clock_gettime(CLOCK_REALTIME, &end);
    return (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1e9;
}

// Função principal
int main(int argc, char *argv[]) {
    if (argc != 4) {
        printf("Uso: %s <pasta-csv> <ficheiro-input> <pasta-resultados-esperados>\n", argv[0]);
        return 1;
    }

    const char *pasta_csv = argv[1];
    const char *ficheiro_input = argv[2];
    const char *pasta_resultados_esperados = argv[3];

    printf("=== Programa de Testes ===\n");
    printf("Dataset: %s\nComandos: %s\nEsperados: %s\n\n", pasta_csv, ficheiro_input, pasta_resultados_esperados);

    // Abrir o ficheiro input.txt e percorrer cada linha
    FILE *input = fopen(ficheiro_input, "r");
    if (!input) {
        perror("Erro ao abrir o ficheiro de comandos");
        return 1;
    }

    char linha[256];
    int total = 0, corretos = 0;

    while (fgets(linha, sizeof(linha), input)) {
        total++;
        int id_query;
        sscanf(linha, "%d", &id_query);

        char ficheiro_output_gerado[256];
        char ficheiro_output_esperado[256];
        snprintf(ficheiro_output_gerado, sizeof(ficheiro_output_gerado), "resultados/command%d_output.txt", id_query);
        snprintf(ficheiro_output_esperado, sizeof(ficheiro_output_esperado), "%s/command%d_output.txt", pasta_resultados_esperados, id_query);

        int linha_dif = -1;
        int res = comparar_ficheiros(ficheiro_output_gerado, ficheiro_output_esperado, &linha_dif);

        if (res == 1) {
            printf("Query %d: OK ✅\n", id_query);
            corretos++;
        } else if (res == 0) {
            printf("Query %d: ❌ diferença na linha %d\n", id_query, linha_dif);
        } else {
            printf("Query %d: ⚠️ erro ao abrir ficheiros\n", id_query);
        }
    }

    fclose(input);

    printf("\nResumo:\n");
    printf("%d de %d queries corretas (%.2f%%)\n", corretos, total, 100.0 * corretos / total);
    mostrar_memoria_usada();

    printf("\n(Fim dos testes)\n");
    return 0;
}
Editor is loading...
Leave a Comment