#include <nb.h>
#include <freesasa_internal.h>
#include <check.h>
#include "tools.h"

const double v[18] = {0,0,0, 1,1,1, -1,1,-1, 2,0,-2, 2,2,0, -5,5,5};
const double r[6]  = {4,2,2,2,2,2};

START_TEST (test_nb)
{
    coord_t *coord = freesasa_coord_new();
    nb_list *nb;
    freesasa_coord_append(coord,v,6);
    ck_assert_ptr_eq(freesasa_nb_new(NULL,NULL),NULL);
    ck_assert_ptr_eq(freesasa_nb_new(NULL,r),NULL);
    ck_assert_ptr_eq(freesasa_nb_new(coord,NULL),NULL);

    nb = freesasa_nb_new(coord,r);
    ck_assert(nb != NULL);
    ck_assert(freesasa_nb_contact(nb,0,1));
    ck_assert(freesasa_nb_contact(nb,1,0));
    ck_assert(freesasa_nb_contact(nb,0,5) == 0);
    freesasa_nb_free(nb);
    freesasa_coord_free(coord);
}
END_TEST

START_TEST (test_memerr)
{
    freesasa_set_verbosity(FREESASA_V_SILENT);
    double v[18] = {0,0,0, 1,1,1, -1,1,-1, 2,0,-2, 2,2,0, -5,5,5};
    struct coord_t coord = {.xyz = v, .n = 6, .is_linked = 0};
    const double r[6]  = {4,2,2,2,2,2};

    for (int i = 1; i < 30; ++i) {
        set_fail_after(i);
        void *ptr = freesasa_nb_new(&coord,r);
        set_fail_after(0);
        ck_assert_ptr_eq(ptr, NULL);
    }
    freesasa_set_verbosity(FREESASA_V_NORMAL);
}
END_TEST

extern TCase * test_nb_static();

Suite* nb_suite() {
    Suite *s = suite_create("Neighbor lists");

    TCase *tc_nb = tcase_create("Basic");
    tcase_add_test(tc_nb,test_nb);
    tcase_add_test(tc_nb,test_memerr);

    TCase *tc_static = test_nb_static();
    
    suite_add_tcase(s, tc_nb);
    suite_add_tcase(s, tc_static);
    
    return s;
}
