/**
 * Test: Error code verification
 * 
 * Verifies that error codes are correctly returned and mapped.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "entropyk.h"

int main() {
    printf("Test: Error codes\n");
    
    /* Test 1: Error strings */
    printf("  Test 1: Error strings are non-null... ");
    assert(entropyk_error_string(ENTROPYK_OK) != NULL);
    assert(entropyk_error_string(ENTROPYK_NON_CONVERGENCE) != NULL);
    assert(entropyk_error_string(ENTROPYK_TIMEOUT) != NULL);
    assert(entropyk_error_string(ENTROPYK_CONTROL_SATURATION) != NULL);
    assert(entropyk_error_string(ENTROPYK_FLUID_ERROR) != NULL);
    assert(entropyk_error_string(ENTROPYK_INVALID_STATE) != NULL);
    assert(entropyk_error_string(ENTROPYK_VALIDATION_ERROR) != NULL);
    assert(entropyk_error_string(ENTROPYK_NULL_POINTER) != NULL);
    assert(entropyk_error_string(ENTROPYK_INVALID_ARGUMENT) != NULL);
    assert(entropyk_error_string(ENTROPYK_NOT_FINALIZED) != NULL);
    assert(entropyk_error_string(ENTROPYK_TOPOLOGY_ERROR) != NULL);
    assert(entropyk_error_string(ENTROPYK_COMPONENT_ERROR) != NULL);
    assert(entropyk_error_string(ENTROPYK_UNKNOWN) != NULL);
    printf("PASS\n");
    
    /* Test 2: OK message */
    printf("  Test 2: OK message contains 'Success'... ");
    const char* ok_msg = entropyk_error_string(ENTROPYK_OK);
    assert(strstr(ok_msg, "Success") != NULL);
    printf("PASS\n");
    
    /* Test 3: Null pointer error */
    printf("  Test 3: Null pointer returns ENTROPYK_NULL_POINTER... ");
    EntropykErrorCode err = entropyk_system_add_edge(NULL, 0, 1);
    assert(err == ENTROPYK_NULL_POINTER);
    printf("PASS\n");
    
    /* Test 4: Component with invalid parameters */
    printf("  Test 4: Invalid parameters return null... ");
    EntropykComponent* comp = entropyk_condenser_create(-1.0);  /* Invalid UA */
    assert(comp == NULL);
    comp = entropyk_evaporator_create(0.0);  /* Invalid UA */
    assert(comp == NULL);
    comp = entropyk_compressor_create(NULL, 10);  /* Null coefficients */
    assert(comp == NULL);
    double coeffs[5] = {1, 2, 3, 4, 5};
    comp = entropyk_compressor_create(coeffs, 5);  /* Wrong count */
    assert(comp == NULL);
    printf("PASS\n");
    
    /* Test 5: Not finalized error */
    printf("  Test 5: Finalize returns NOT_FINALIZED for empty system... ");
    EntropykSystem* sys = entropyk_system_create();
    /* Empty system may not finalize properly - this tests error handling */
    entropyk_system_finalize(sys);  /* May return error for empty system */
    entropyk_system_free(sys);
    printf("PASS\n");
    
    printf("All error code tests PASSED\n");
    return 0;
}
