context("h5-H5File-Subset")
fname <- tempfile(fileext=".h5")

test_that("H5File-Subset-Group",{
  if(file.exists(fname)) file.remove(fname)
  file <- h5file(fname, "a")

  f <- function() file[[c("1", "2", "3")]]
  expect_that(f(), throws_error("An object with name 1 does not exist in this group"))

  group3 <- createGroup(file, "/testgroup3")
  expect_that(group3, is_a("H5Group"))
  expect_that(group3$get_obj_name(), is_identical_to("/testgroup3"))

  groupnested <- createGroup(group3, "test")
  expect_that(groupnested, is_a("H5Group"))
  expect_that(groupnested$get_obj_name(), is_identical_to("/testgroup3/test"))
  h5close(groupnested)
  h5close(group3)

  group3 <- file[["/testgroup3"]]
  grouprelative <- group3[["test"]]
  expect_that(grouprelative, is_a("H5Group"))
  expect_that(grouprelative$get_obj_name(), is_identical_to("/testgroup3/test"))
  h5close(grouprelative)
  h5close(group3)

  # TODO(mario): recursive group creation
  # group5 <- file["/test1/test2/test3/test4/test5"]


  # expect_that(group5, is_a("H5Group"))
  # expect_that(group5@location, is_identical_to("/test1/test2/test3/test4/test5"))
  # h5close(group5)
  h5close(file)
  expect_true(file.remove(fname))
})

test_that("H5File-Subset-DataSet",{
  if(file.exists(fname)) file.remove(fname)
  file <- h5file(fname, "a")

  # TODO(mario): Implicit, recursive group creation?
  # group5 <- file["/test1/test2/test3/test4/test5"]

  g1 <- createGroup(file, "test/test1/test2/test3")
  g1[["dset1"]] <- 1:10
  g1[["dset2"]] <- matrix(1:9, nrow = 3)
  g1[["dset3"]] <- array(1:6, dim = c(1, 2, 3))
  file[["dset4"]] <- matrix(1:10, nrow = 5)

  # TODO: should work without h5close()
  h5close(g1)
  h5close(file)

  file <- h5file(fname, "r")
  dset <- file[["test/test1/test2/test3/dset1"]]
  expect_that(readDataSet(dset), is_identical_to(1:10))
  h5close(dset)

  dset <- file[["test/test1/test2/test3/dset2"]]
  expect_that(readDataSet(dset), is_identical_to(matrix(1:9, nrow = 3)))
  h5close(dset)

  # TODO(mario): Does array retrieval work?
  # dset <- file[["test/test1/test2/test3/dset3"]]
  # expect_that(readDataSet(dset), is_identical_to(array(1:6, dim = c(1, 2, 3))))
  # h5close(dset)

  dset <- file[["dset4"]]
  expect_that(readDataSet(dset), is_identical_to(matrix(1:10, nrow = 5)))
  h5close(dset)

  # check subsets
  # TODO: should work without h5close()
  dset <- file[["test/test1/test2/test3/dset1"]]
  expect_that(dset[1:5], is_identical_to(1:5))
  h5close(dset)

  dset <- file[["test/test1/test2/test3/dset2"]]
  expect_that(dset[1:2,], is_identical_to(matrix(1:9, nrow = 3)[1:2,]))
  h5close(dset)

  # TODO(mario): Does array retrieval work?
  # dset <- file[["test/test1/test2/test3/dset3"]]
  # expect_that(dset[1,1:2,3],
  #     is_identical_to(array(1:6, dim = c(1, 2, 3))[1,1:2,3,drop = FALSE]))
  # h5close(dset)

  # set subsets
  # TODO: include test cases
  h5close(file)
  expect_true(file.remove(fname))
})