context("input/output")

test_that("can read grav2 data", {

    zip_file <- system.file("extdata", "grav2.zip", package="qtl2")
    grav2 <- read_cross2(zip_file)

    # check that it contains the same stuff
    expect_equal(sort(names(grav2)),
                 c("alleles", "cross_info", "crosstype", "geno", "gmap", "is_female",
                   "is_x_chr", "pheno", "phenocovar"))

    # check summary
    expected <- structure(list(crosstype = "riself", nind = 162L, nind_geno = 162L,
                               nind_pheno = 162L, nind_gnp = 162L, nchr = 5L,
                               nmar = c(`1` = 26, `2` = 42, `3` = 64, `4` = 35, `5` = 67),
                               npheno = 241L, ncovar = 0, nphenocovar = 1L, totmar = 234),
                          class = c("summary.cross2", "list"))
    expect_equal(summary(grav2), expected)

    # calculate QTL genotype probabilities
    map <- insert_pseudomarkers(grav2$gmap, step=1)
    pr <- calc_genoprob(grav2, map)

})

test_that("can read iron data", {

    zip_file <- system.file("extdata", "iron.zip", package="qtl2")
    iron <- read_cross2(zip_file)

    # check that it contains the same stuff
    expect_equal(sort(names(iron)),
                 c("alleles", "covar", "cross_info", "crosstype", "geno", "gmap",
                   "is_female", "is_x_chr", "pheno", "phenocovar", "pmap"))

    # check summary
    expected <- structure(list(crosstype = "f2", nind = 284L, nind_geno = 284L,
                               nind_pheno = 284L, nind_gnp = 284L, nchr = 20L,
                               nmar = c(`1` = 3, `2` = 5, `3` = 2, `4` = 2, `5` = 2, `6` = 2, `7` = 7, `8` = 8,
                                        `9` = 5, `10` = 2, `11` = 7, `12` = 2, `13` = 2, `14` = 2,
                                        `15` = 2, `16` = 5, `17` = 2, `18` = 2, `19` = 2, X = 2),
                               npheno = 2L, ncovar = 2L, nphenocovar = 1L, totmar = 66),
                          class = c("summary.cross2", "list"))
    expect_equal(summary(iron), expected)


    # calculate QTL genotype probabilities
    map <- insert_pseudomarkers(iron$gmap, step=1)
    pr <- calc_genoprob(iron, map)

})

test_that("read_pheno works", {

    # iron data
    ironfile <- system.file("extdata", "iron.zip", package="qtl2")
    dir <- tempdir()

    # read full data
    iron <- read_cross2(ironfile)

    # unzip data
    unzipped_files <- utils::unzip(ironfile, exdir=dir)

    # names of data files to be used
    phefile <- unzipped_files[grep("_pheno\\.csv$", unzipped_files)]
    phecovfile <- unzipped_files[grep("_phenocovar\\.csv$", unzipped_files)]

    # zip files to be created
    phezipfile <- paste0(phefile, ".zip")
    phecovzipfile <- paste0(phecovfile, ".zip")
    bothzipfile <- paste0(phefile, "_both.zip")

    # clean up
    on.exit(unlink(c(unzipped_files, phezipfile, phecovzipfile, bothzipfile)))

    # create zip files (-j: don't store file name, -q: be quiet)
    zip(phezipfile, phefile, flags="-j -q")
    zip(phecovzipfile, phecovfile, flags="-j -q")
    zip(bothzipfile, c(phefile, phecovfile), flags="-j -q")

    # read pheno as plain file
    expect_equal(read_pheno(phefile), iron$pheno)

    # read pheno as zip file
    expect_equal(read_pheno(phezipfile), iron$pheno)
    unzip(phezipfile, exdir=dirname(phezipfile)) # restore file

    # read pheno + phenocovar each in plain files
    phelist <- read_pheno(phefile, phecovfile)
    expect_equal(phelist$pheno, iron$pheno)
    expect_equal(phelist$phenocovar, iron$phenocovar)

    # read pheno + phenocovar in one zip file
    expect_error(read_pheno(bothzipfile))
    phelist <- read_pheno(bothzipfile, basename(phecovfile))
    expect_equal(phelist$pheno, iron$pheno)
    expect_equal(phelist$phenocovar, iron$phenocovar)
    unzip(bothzipfile, exdir=dirname(bothzipfile)) # restore files

    # read pheno from one zip file and phenocovar from plain file
    phelist <- read_pheno(phezipfile, phecovfile)
    expect_equal(phelist$pheno, iron$pheno)
    expect_equal(phelist$phenocovar, iron$phenocovar)
    unzip(phezipfile, exdir=dirname(phezipfile)) # restore file

    # read pheno from one zip file and phenocovar from another
    phelist <- read_pheno(phezipfile, phecovzipfile)
    expect_equal(phelist$pheno, iron$pheno)
    expect_equal(phelist$phenocovar, iron$phenocovar)
    unzip(phezipfile, exdir=dirname(phezipfile)) # restore file
    unzip(phecovzipfile, exdir=dirname(phecovzipfile)) # restore file

    # read pheno from zip file and phenocovar from plain file
    phelist <- read_pheno(phefile, phecovzipfile)
    expect_equal(phelist$pheno, iron$pheno)
    expect_equal(phelist$phenocovar, iron$phenocovar)
    unzip(phecovzipfile, exdir=dirname(phecovzipfile)) # restore file

})

test_that("Create zip file works", {

    # unzip iron data to a temporary directory
    ironfile <- system.file("extdata", "iron.zip", package="qtl2")
    dir <- tempdir()
    unzipped_files <- utils::unzip(ironfile, exdir=dir)
    on.exit(unlink(unzipped_files)) # clean up

    # zip the files
    zip_datafiles(file.path(dir, "iron.yaml"))
    on.exit(unlink(file.path(dir, "iron.zip")), add=TRUE)

    # file created?
    zipfile <- file.path(dir, "iron.zip")
    expect_true( file.exists(zipfile) )

    # unzip to tmp dir
    tmp_dir <- file.path(dir, "tmp")
    new_unzipped_files <- utils::unzip(zipfile, exdir=tmp_dir)
    on.exit(unlink(tmp_dir, recursive=TRUE), add=TRUE) # clean up

    # sample files as originally?
    ofiles <- sort( basename( unzipped_files ) )
    nfiles <- sort( basename( new_unzipped_files ) )
    expect_equal( ofiles, nfiles )

    # read them?
    x <- read_cross2(file.path(dir, "iron.yaml"))
    y <- read_cross2(file.path(dir, "iron.zip"))
    expect_equal(y, x)

})
