context("Start() metadata_dims check")

test_that("1. One data set, one var", {
  repos <- "/esarchive/exp/ecmwf/system5_m1/monthly_mean/$var$_f6h/$var$_$sdate$.nc"
suppressWarnings(
  data <- Start(dat = list(list(name = 'system5_m1', path = repos)),
                var = 'tas',
                sdate = '20170101',
                ensemble = indices(1),
                time = indices(1),
                lat = indices(1:2),
                lon = indices(2:3),
                synonims = list(lat = c('lat', 'latitude'),
                                lon = c('lon', 'longitude')),
                return_vars = list(time = 'sdate',
                                   lon = 'dat',
                                   lat = 'dat'),
                metadata_dims = 'dat',  # it can be omitted since it is automatically specified as 'dat'
                retrieve = T
               )
)
  expect_equal(
  length(attr(data, 'Variables')),
  2
  )
  expect_equal(
  names(attr(data, 'Variables')),
  c("common", "system5_m1")
  )
  expect_equal(
  names(attr(data, 'Variables')$common),
  c('time', 'tas')
  )
  expect_equal(
  names(attr(data, 'Variables')$system5_m1),
  c("lon", "lat")
  )
  expect_equal(
  length(attr(data, 'Variables')$common$tas),
  12
  )
  expect_equal(
  data[1, 1, 1, 1, 1, , 1],
  c(248.5012, 248.7815),
  tolerance = 0.0001
  )

})


test_that("2. Two data sets, one var", {
  repos <- "/esarchive/exp/ecmwf/system5_m1/monthly_mean/$var$_f6h/$var$_$sdate$.nc"
  repos2 <- "/esarchive/exp/ecmwf/system4_m1/monthly_mean/$var$_f6h/$var$_$sdate$.nc"
suppressWarnings(
  data <- Start(dat = list(list(name = 'system4_m1', path = repos2),
                           list(name = 'system5_m1', path = repos)),
                var = 'tas',
                sdate = '20170101',
                ensemble = indices(1),
                time = indices(1),
                lat = indices(1:2),
                lon = indices(2:3),
                synonims = list(lat = c('lat', 'latitude'),
                                lon = c('lon', 'longitude')),
                return_vars = list(time = 'sdate',
                                   lon = 'dat',
                                   lat = 'dat'),
                metadata_dims = 'dat',  # it can be omitted since it is automatically specified as 'dat'
                retrieve = T
               )
)
  expect_equal(
  length(attr(data, 'Variables')),
  3
  )
  expect_equal(
  names(attr(data, 'Variables')),
  c("common", "system4_m1", "system5_m1")
  )
  expect_equal(
  names(attr(data, 'Variables')$common),
  'time'
  )
  expect_equal(
  names(attr(data, 'Variables')$system4_m1),
  c("lon", "lat", "tas")
  )
  expect_equal(
  names(attr(data, 'Variables')$system5_m1),
  c("lon", "lat", "tas")
  )
  expect_equal(
  length(attr(data, 'Variables')$system5_m1$tas),
  12
  )
  expect_equal(
  length(attr(data, 'Variables')$system4_m1$tas),
  11
  )
  expect_equal(
  data[, 1, 1, 1, 1, 1, 1],
  c(247.2570, 248.5012),
  tolerance = 0.0001
  )
  expect_equal(
  data[, 1, 1, 1, 1, 1, 2],
  c(247.2570, 248.5016),
  tolerance = 0.0001
  )
})

test_that("3. One data set, two vars", {
  repos <- paste0('/esarchive/exp/ecearth/a1tr/cmorfiles/CMIP/EC-Earth-Consortium/',
                  'EC-Earth3/historical/r24i1p1f1/Amon/$var$/gr/v20190312/',
                  '$var$_Amon_EC-Earth3_historical_r24i1p1f1_gr_185001-185012.nc')
  var <- c('tas', 'clt')
suppressWarnings(
  data <- Start(dat = repos,
                var = var, 
                time = indices(1),
                lat = indices(9:10),
                lon = indices(10:11), 
                return_vars = list(lat = NULL, lon = NULL),
                metadata_dims = 'var',
                synonims = list(lat = c('lat', 'latitude'),
                                lon = c('lon', 'longitude')),
                retrieve = TRUE
               )
)
  expect_equal(
  length(attr(data, 'Variables')),
  2
  )
  expect_equal(
  names(attr(data, 'Variables')),
  c("common", "dat1")
  )
  expect_equal(
  names(attr(data, 'Variables')$common),
  c('lat', 'lon', 'tas', 'clt')
  )
  expect_equal(
  is.null(attr(data, 'Variables')$dat1),
  TRUE
  )
  expect_equal(
  length(attr(data, 'Variables')$common$tas),
  17
  )
  expect_equal(
  length(attr(data, 'Variables')$common$clt),
  16
  )
  expect_equal(
  data[1, , 1, 1, 1],
  c(249.42436, 32.45226),
  tolerance = 0.0001
  )
  expect_equal(
  data[1, , 1, 2, 1],
  c(250.00110, 25.04345),
  tolerance = 0.0001
  )
})

test_that("4. Two data sets, two vars", {
  repos <- "/esarchive/exp/ecmwf/system5_m1/monthly_mean/$var$_f6h/$var$_$sdate$.nc"
  repos2 <- "/esarchive/exp/ecmwf/system4_m1/monthly_mean/$var$_f6h/$var$_$sdate$.nc"
suppressWarnings(
  data <- Start(dat = list(list(name = 'system4_m1', path = repos2),
                           list(name = 'system5_m1', path = repos)),
                var = c('tas', 'sfcWind'),
                sdate = '20170101',
                ensemble = indices(1),
                time = indices(1),
                lat = indices(1:2),
                lon = indices(1:2),
                synonims = list(lat = c('lat', 'latitude'),
                                lon = c('lon', 'longitude')),
                return_vars = list(time = 'sdate',
                                   lon = 'dat',
                                   lat = 'dat'),
                metadata_dims = 'dat',
                retrieve = T
               )
)
  expect_equal(
  length(attr(data, 'Variables')),
  3
  )
  expect_equal(
  names(attr(data, 'Variables')),
  c("common", "system4_m1", "system5_m1")
  )
  expect_equal(
  names(attr(data, 'Variables')$common),
  'time'
  )
  expect_equal(
  names(attr(data, 'Variables')$system4_m1),
  c("lon", "lat", "tas")
  )
  expect_equal(
  names(attr(data, 'Variables')$system5_m1),
  c("lon", "lat", "tas")
  )
  expect_equal(
  length(attr(data, 'Variables')$system5_m1$tas),
  12
  )
  expect_equal(
  length(attr(data, 'Variables')$system4_m1$tas),
  11
  )
  expect_equal(
  data[1, , 1, 1, 1, 2, 2],
  c(247.227219, 6.370782),
  tolerance = 0.0001
  )
  expect_equal(
  data[2, , 1, 1, 1, 2, 2],
  c(248.781540, 5.794801),
  tolerance = 0.0001
  )

#-------------------------------------------------------------
suppressWarnings(
  data <- Start(dat = list(list(name = 'system4_m1', path = repos2),
                           list(name = 'system5_m1', path = repos)),
                var = c('tas', 'sfcWind'),
                sdate = '20170101',
                ensemble = indices(1),
                time = indices(1),
                lat = indices(1:2),
                lon = indices(1:2),
                synonims = list(lat = c('lat', 'latitude'),
                                lon = c('lon', 'longitude')),
                return_vars = list(time = 'sdate',
                                   lon = 'dat',
                                   lat = 'dat'),
                metadata_dims = c('dat', 'var'),
                retrieve = T
               )
)

  expect_equal(
  length(attr(data, 'Variables')),
  3
  )
  expect_equal(
  names(attr(data, 'Variables')),
  c("common", "system4_m1", "system5_m1")
  )
  expect_equal(
  names(attr(data, 'Variables')$common),
  'time'
  )
  expect_equal(
  names(attr(data, 'Variables')$system4_m1),
  c("lon", "lat", "tas", "sfcWind")
  )
  expect_equal(
  names(attr(data, 'Variables')$system5_m1),
  c("lon", "lat", "tas", "sfcWind")
  )
  expect_equal(
  length(attr(data, 'Variables')$system5_m1$tas),
  12
  )
  expect_equal(
  length(attr(data, 'Variables')$system5_m1$sfcWind),
  12
  )
  expect_equal(
  length(attr(data, 'Variables')$system4_m1$tas),
  11
  )
  expect_equal(
  length(attr(data, 'Variables')$system4_m1$sfcWind),
  11
  )
  expect_equal(
  data[1, , 1, 1, 1, 2, 2],
  c(247.227219, 6.370782),
  tolerance = 0.0001
  )
  expect_equal(
  data[2, , 1, 1, 1, 2, 2],
  c(248.781540, 5.794801),
  tolerance = 0.0001
  )
})

test_that("5. Specify metadata_dims with another file dimension", {
  repos <- "/esarchive/exp/ecmwf/system5_m1/monthly_mean/$var$_f6h/$var$_$sdate$.nc"
  repos2 <- "/esarchive/exp/ecmwf/system4_m1/monthly_mean/$var$_f6h/$var$_$sdate$.nc"
suppressWarnings(
  data <- Start(dat = list(list(name = 'system4_m1', path = repos2),
                           list(name = 'system5_m1', path = repos)),
                var = c('tas', 'sfcWind'),
                sdate = c('20150101', '20160101', '20170101'),
                ensemble = indices(1),
                time = indices(1),
                lat = indices(1:10),
                lon = indices(1:10),
                synonims = list(lat = c('lat', 'latitude'),
                                lon = c('lon', 'longitude')),
                return_vars = list(time = 'sdate',
                                   lon = 'dat',
                                   lat = 'dat'),
                metadata_dims = 'sdate',
                retrieve = T
               )
)

  expect_equal(
  length(attr(data, 'Variables')),
  3
  )
  expect_equal(
  names(attr(data, 'Variables')),
  c("common", "system4_m1", "system5_m1")
  )
  expect_equal(
  names(attr(data, 'Variables')$common),
  c('time', 'tas', 'tas', 'tas')
  )
  expect_equal(
  names(attr(data, 'Variables')$system4_m1),
  c("lon", "lat")
  )
  expect_equal(
  names(attr(data, 'Variables')$system5_m1),
  c("lon", "lat")
  )
  expect_equal(
  length(attr(data, 'Variables')$common$tas),
  12
  )

})


test_that("6. One data set, two vars from one file", {
mask_path <- '/esarchive/autosubmit/con_files/mask.regions.Ec3.0_O1L46.nc'
suppressWarnings(
data <- Start(repos = mask_path,
              var = c('nav_lon', 'nav_lat'),
              t = 'first',
              z = 'first',
              x = 'all',
              y = 'all',
              return_vars = list(var_names = NULL),
              var_var = 'var_names',
              retrieve = T)
)
  expect_equal(
  length(attr(data, 'Variables')),
  2
  )
  expect_equal(
  names(attr(data, 'Variables')),
  c("common", "dat1")
  )
  expect_equal(
  names(attr(data, 'Variables')$common),
  c("var_names", "nav_lon", "nav_lat")
  )
  expect_equal(
  is.null(attr(data, 'Variables')$dat1),
  TRUE
  )
  expect_equal(
  length(attr(data, 'Variables')$common$nav_lat),
  8
  )

})

test_that("7. Two data sets, while one is missing", {
 repos <- "/esarchive/exp/ecmwf/system5_m1/monthly_mean/$var$_f6h/$var$_$sdate$.nc"
 # incorrect path. Therefore repos2 doesn't have any valid files 
 repos2 <- "/esarchive/exp/ecmwf/system4_m1/monthly_mean/$var$_f2h/$var$_$sdate$.nc"  # correct one is _f6h
  var <- 'tas'
suppressWarnings( 
 data <- Start(dat = list(list(name = 'system4_m1', path = repos2),
                           list(name = 'system5_m1', path = repos)),
                var = var,
                sdate = '20170101',
                ensemble = indices(1),
                time = indices(1),
                lat = 'all',
                lon = 'all',
                synonims = list(lat = c('lat', 'latitude'),
                                lon = c('lon', 'longitude')),
                return_vars = list(time = 'sdate',
                                   lon = 'dat',
                                   lat = 'dat'),
                metadata_dims = 'dat',  # it can be omitted since it is automatically specified as 'dat'
                retrieve = T
               )
)
  expect_equal(
  length(data[is.na(data)]),
  829440
  )
  expect_equal(
  attr(data, "Variables")$system4_m1,
  list(lon = NULL, lat = NULL)
  )
  expect_equal(
  length(attr(data, "Variables")$system5_m1$lon),
  1296
  )
  expect_equal(
  length(attr(data, "Variables")$system5_m1),
  3
  )
  expect_equal(
  attr(data, 'Files'),
  array(c(NA, "/esarchive/exp/ecmwf/system5_m1/monthly_mean/tas_f6h/tas_20170101.nc"),
        dim = c(dat = 2, var = 1, sdate = 1))
  )
})

test_that("8. Two data sets, both have files but the first file is missing", {
path_list <- list(
              MPI = list(name = 'MPI_ESM',
                         path = paste0('/esarchive/exp/CMIP6/dcppA-hindcast/MPI-ESM1-2-HR/',
                                       'DCPP/MPI-M/MPI-ESM1-2-HR/',
                                       'dcppA-hindcast/$member$/day/$var$/gn/v20200101/',
                                       '$var$_day_MPI-ESM1-2-HR_dcppA-hindcast_s$sdate$-$member$_gn_$chunk$.nc')),
              Had = list(name = 'HadGEM3',
                         path = paste0('/esarchive/exp/CMIP6/dcppA-hindcast/HadGEM3-GC31-MM/',
                                      'DCPP/MOHC/HadGEM3-GC31-MM/',
                                      'dcppA-hindcast/$member$/day/$var$/gn/v20200101/',
                                      '$var$_day_HadGEM3-GC31-MM_dcppA-hindcast_s$sdate$-$member$_gn_$chunk$.nc')))
suppressWarnings(
data <- Start(dataset = path_list,
              var = 'tasmin',
              member = list(c('r1i1p1f1', 'r2i1p1f2')), 
              sdate = paste0(2018),
              chunk = list(c('20181101-20281231', '20181101-20281230')),
              time = indices(1), #'all',
              lat = values(list(0, 14)),
              lon = values(list(0, 28)),
              synonims = list(time = c('fmonth','time'),
                              lon = c('lon', 'longitude'),
                              lat = c('lat', 'latitude')),
              return_vars = list(lat = 'dataset', lon = 'dataset'),
              lat_reorder = Sort(),
              num_procs = 1,
              retrieve = T)
)
  expect_equal(
  length(data[is.na(data)]),
  5500
  )
  expect_equal(
  length(attr(data, "Variables")$MPI_ESM),
  3
  )
  expect_equal(
  length(attr(data, "Variables")$MPI_ESM$lon),
  30
  )
  expect_equal(
  names(attr(data, "Variables")$MPI_ESM),
  c('lat', 'lon', 'tasmin')
  )
  expect_equal(
  length(attr(data, "Variables")$HadGEM3),
  2
  )
  expect_equal(
  length(attr(data, "Variables")$HadGEM3$lon),
  34
  )
  expect_equal(
  names(attr(data, "Variables")$HadGEM3),
  c('lat', 'lon')
  )
  expect_equal(
  attr(data, 'Files'),
  array(c("/esarchive/exp/CMIP6/dcppA-hindcast/MPI-ESM1-2-HR/DCPP/MPI-M/MPI-ESM1-2-HR/dcppA-hindcast/r1i1p1f1/day/tasmin/gn/v20200101/tasmin_day_MPI-ESM1-2-HR_dcppA-hindcast_s2018-r1i1p1f1_gn_20181101-20281231.nc",
          NA, NA, NA, NA, NA, NA,
          "/esarchive/exp/CMIP6/dcppA-hindcast/HadGEM3-GC31-MM/DCPP/MOHC/HadGEM3-GC31-MM/dcppA-hindcast/r2i1p1f2/day/tasmin/gn/v20200101/tasmin_day_HadGEM3-GC31-MM_dcppA-hindcast_s2018-r2i1p1f2_gn_20181101-20281230.nc"),
        dim = c(dataset = 2, var = 1, member = 2, sdate = 1, chunk = 2))
  )


})
