# tests for shape descriptor computation

test_that("Shape descriptors can be computed", {
    testthat::skip_on_cran();

    fsbrain::download_optional_data();
    subjects_dir = fsbrain::get_optional_data_filepath("subjects_dir");
    subject_id = 'subject1';

    # Load data (see function surface.curvature for computing it in R)
    k1 = subject.morph.native(subjects_dir, subject_id, 'white.max', hemi='both');
    k2 = subject.morph.native(subjects_dir, subject_id, 'white.min', hemi='both');

    # Get principal curvature info
    pc = principal.curvatures(k1, k2);

    # Visualize k1
    vis.data.on.subject(subjects_dir, subject_id, morph_data_both = pc$principal_curvature_k1, rglactions = list('trans_fun'=clip.data));

    # Compute shape descriptors
    shape = shape.descriptors(pc);
    expect_true(is.data.frame(shape));

    # error handling
    expect_error(shape.descriptors(pc, descriptors = c('noidea'))); # invalid descriptor

    vis.data.on.subject(subjects_dir, subject_id, morph_data_both = shape$shape_index, rglactions = list('trans_fun'=clip.data));
})


test_that("Principal curvatures can be computed", {
    testthat::skip_on_cran();

    fsbrain::download_optional_data();
    subjects_dir = fsbrain::get_optional_data_filepath("subjects_dir");
    subject_id = 'subject1';

    # Load data (see function surface.curvature for computing it in R)
    lh_surf = subject.surface(subjects_dir, subject_id, surface = "white", hemi='lh');
    rh_surf = subject.surface(subjects_dir, subject_id, surface = "white", hemi='rh');
    lh_curvatures = surface.curvatures(lh_surf);
    rh_curvatures = surface.curvatures(rh_surf);

    # Get principal curvature info
    lh_pc = principal.curvatures(lh_curvatures$K1, lh_curvatures$K2);
    rh_pc = principal.curvatures(rh_curvatures$K1, rh_curvatures$K2);

    vis.data.on.subject(subjects_dir, subject_id, morph_data_lh = lh_pc$principal_curvature_k1, morph_data_rh = rh_pc$principal_curvature_k1, rglactions = list('trans_fun'=clip.data));
    expect_true(1L == 1L);
})

