test_that("Subjects file can  be read", {
    subjects_file = system.file("extdata", "subjects.txt", package = "fsbrain", mustWork = TRUE);
    subjects_list = read.md.subjects(subjects_file, header = FALSE);
    expect_equal(length(subjects_list), 3);
    expect_equal(subjects_list[1], "subject1");
    expect_equal(subjects_list[2], "subject2");
    expect_equal(subjects_list[3], "subject3");
})


test_that("Demographics file with header can be read with stringsAsFactors = TRUE", {
  demogr_file = system.file("extdata", "demographics.tsv", package = "fsbrain", mustWork = TRUE);
  column_names = c("subject_id", "group", "age");
  demographics = read.md.demographics(demogr_file, header = T, column_names = column_names);
  expect_equal(nrow(demographics), 6);
  expect_equal(ncol(demographics), 3);
  expect_equal(class(demographics$subject_id), "factor");
  expect_equal(class(demographics$group), "factor");
  expect_equal(class(demographics$age), "integer");
})


test_that("Demographics reports can be generated.", {
    testthat::skip_on_cran();
  demogr_file = system.file("extdata", "demographics.tsv", package = "fsbrain", mustWork = TRUE);
  column_names = c("subject_id", "group", "age");
  demographics = read.md.demographics(demogr_file, header = TRUE, column_names = column_names);

  # The expect_warning wrapper in the next line ignores the warning from the t.test function that it cannot compute exact p-values with ties.
  expect_warning(report_unpaired <- report.on.demographics(demographics, group_column_name="group"));
  expect_equal(length(report_unpaired), 11);  # check number of lines in report

  report_paired <- report.on.demographics(demographics, group_column_name="group", paired=TRUE);
  expect_equal(length(report_paired), 10);   # check number of lines in report
})


test_that("Demographics file with header can be read with stringsAsFactors = FALSE", {
  demogr_file = system.file("extdata", "demographics.tsv", package = "fsbrain", mustWork = TRUE);
  column_names = c("subject_id", "group", "age");
  demographics = read.md.demographics(demogr_file, header = TRUE, column_names = column_names, report = FALSE, stringsAsFactors = FALSE);
  expect_equal(nrow(demographics), 6);
  expect_equal(ncol(demographics), 3);
  expect_equal(class(demographics$subject_id), "character");
  expect_equal(class(demographics$group), "character");
  expect_equal(class(demographics$age), "integer");
})


test_that("Demographics file reading fails with incorrect number of column names", {
  demogr_file = system.file("extdata", "demographics.tsv", package = "fsbrain", mustWork = TRUE);
  column_names = c("subject_id", "group", "age", "nosuchfield");
  testthat::expect_error(demographics = read.md.demographics(demogr_file, header = TRUE, column_names = column_names, report = FALSE));
  testthat::expect_error(demographics = read.md.demographics(tempfile()));  # no such file
  testthat::expect_error(demographics = read.md.demographics(demogr_file, header = "I think so")); # header must be logical

})


test_that("Demographics reports can be shown", {
    demogr_file = system.file("extdata", "demographics.tsv", package = "fsbrain", mustWork = TRUE);
    demographics = read.md.demographics(demogr_file, header = TRUE, report = TRUE);
    demographics2 = read.md.demographics(demogr_file, header = TRUE, report = TRUE, scale_and_center = TRUE);
    expect_equal(nrow(demographics), 6);
    expect_equal(nrow(demographics2), 6);
})


test_that("Demographics files without header can be read", {
    demogr_file_nohdr = system.file("extdata", "demographics_nohdr.tsv", package = "fsbrain", mustWork = TRUE);

    column_names = c("subject_id", "group", "age");
    demographics = read.md.demographics(demogr_file_nohdr, header = FALSE, column_names = column_names);
    expect_equal(nrow(demographics), 6);

    # error handling
    testthat::expect_error(demographics = read.md.demographics(demogr_file_nohdr, header = FALSE)); # column names required
})


test_that("A FreeSurfer Group Descriptor File (FSGD) can be written  subjects re-read.", {
    demogr_file = system.file("extdata", "demographics.tsv", package = "fsbrain", mustWork = TRUE);
    column_names = c("subject_id", "group", "age");
    demographics = read.md.demographics(demogr_file, header = TRUE, column_names = column_names, report = FALSE, stringsAsFactors = FALSE);

    tmpfile = tempfile(fileext = ".fsgd");
    demographics.to.fsgd.file(tmpfile, demographics, subject_id_column_name = 'subject_id');

    # re-read the subjects list
    subjects_list = read.md.subjects.from.fsgd(tmpfile);
    testthat::expect_equal(demographics$subject_id, subjects_list);
})

