#include <stdio.h>
#include <string.h>

#include "test.h"
#include "grid.c"

#ifdef WIN32
#define GRID    "../../test/dummy.nc"
#else
#define GRID    "dummy.nc"
#endif

int main(void)
{
    int total_err = 0, err;
    fes_grid grid;
    fes_cdf_file nc;
    fes_double_complex c;
    fes_handler fes;
    size_t lon_dim;
    size_t lat_dim;
    double lon_min;
    double lat_min;
    double lon_max;
    double lat_max;
    double lon_step;
    double lat_step;
    double undef;

    grid.file = &nc;

    printf("*** testing _normalize_longitude...\n");
    err = CHECK(_normalize_longitude(0.0, 370), 10);
    SUMMARIZE_ERR;
    err = CHECK(_normalize_longitude(0.0, -10), 350);
    SUMMARIZE_ERR;
    err = CHECK(_normalize_longitude(0.0, 10), 10);
    SUMMARIZE_ERR;

    printf("*** testing _nearest_integer...\n");
    err = CHECK(_nearest_integer(M_PI), 3);
    SUMMARIZE_ERR;

    printf("*** testing _get_index...\n");
    err = CHECK(_get_index(2, 3, 2), 0);
    SUMMARIZE_ERR;

    printf("*** testing _get_value...\n");
    err = CHECK(_get_value(10, -90, 0.5), -85);
    SUMMARIZE_ERR;

    strcpy(grid.file->lat, "latitude");
    strcpy(grid.file->lon, "longitude");
    strcpy(grid.file->amp, "amplitude");
    strcpy(grid.file->pha, "phase");

    printf("*** testing _open_grid..\n");
    if (_open_grid(GRID, &fes, &nc, &lon_dim, &lat_dim, &lon_min, &lat_min,
            &lon_max, &lat_max, &lon_step, &lat_step, &undef))
    {
        printf("%s\n", "nok");
        DIE;
    }

    err = CHECK(lon_dim, 2);
    SUMMARIZE_ERR;
    err = CHECK(lat_dim, 3);
    SUMMARIZE_ERR;
    err = CHECK(lon_min, -10);
    SUMMARIZE_ERR;
    err = CHECK(lat_min, -5);
    SUMMARIZE_ERR;
    err = CHECK(lon_max, 10);
    SUMMARIZE_ERR;
    err = CHECK(lat_max, 5);
    SUMMARIZE_ERR;
    err = CHECK(lon_step, 20);
    SUMMARIZE_ERR;
    err = CHECK(lat_step, 5);
    SUMMARIZE_ERR;
    err = CHECK(undef, 1.844674e+19f);
    SUMMARIZE_ERR;

    grid.lon_dim = lon_dim;
    grid.lat_dim = lat_dim;
    grid.lon_min = lon_min;
    grid.lat_min = lat_min;
    grid.lon_max = lon_max;
    grid.lat_max = lat_max;
    grid.lon_step = lon_step;
    grid.lat_step = lat_step;
    grid.undef = undef;
    grid.n_grids = 1;
    grid.transpose = 0;

    printf("*** testing _read_grid_value..\n");
    if (_read_grid_value(&grid, 1, 1, 0, &c))
        DIE;

    err = CHECK(c.re, 0);
    SUMMARIZE_ERR;
    err = CHECK(c.im, 1);
    SUMMARIZE_ERR;

    grid.file->phase_lag = 1;

    if (_read_grid_value(&grid, 1, 1, 0, &c))
        DIE;

    err = CHECK(c.re, 0);
    SUMMARIZE_ERR;
    err = CHECK(c.im, 1);
    SUMMARIZE_ERR;

    if (_read_grid_value(&grid, 0, 1, 0, &c))
        DIE;

    err = CHECK(c.re, DV);
    SUMMARIZE_ERR;
    err = CHECK(c.im, DV);
    SUMMARIZE_ERR;

    fes.grid = grid;

    printf("*** testing _get_nearest_points..\n");
    _get_nearest_points(&fes, 0, 0);

    err = CHECK(fes.se->re, 0);
    SUMMARIZE_ERR;
    err = CHECK(fes.se->im, 1);
    SUMMARIZE_ERR;
    err = CHECK(fes.sw->re, DV);
    SUMMARIZE_ERR;
    err = CHECK(fes.sw->im, DV);
    SUMMARIZE_ERR;
    err = CHECK(fes.nw->re, 0);
    SUMMARIZE_ERR;
    err = CHECK(fes.nw->im, 0);
    SUMMARIZE_ERR;
    err = CHECK(fes.ne->re, 0);
    SUMMARIZE_ERR;
    err = CHECK(fes.ne->im, 0);
    SUMMARIZE_ERR;

    FINAL_RESULTS;
}
