library(testthat)

context("Expansion Test")

mev <- getOption("magclass_expand_version")
msm <- getOption("magclass_setMatching")

on.exit({
  options(magclass_expand_version = mev)
  options(magclass_setMatching = msm)
})

test_that("partial expansion", {
  a <- new.magpie(c("AFR.1", "AFR.2", "EUR.1"), fill = 1)
  b <- new.magpie(c("AFR", "EUR"), fill = 1)

  options(magclass_expand_version = NULL)
  options(magclass_setMatching = TRUE)
  expect_identical(magpie_expand(b, a), a)
  options(magclass_setMatching = msm)
  expect_identical(magpie_expand(b, a), a)

  d <- new.magpie(c("AFR.BLUB.1", "AFR.BLUB.2", "EUR.BLUB.1",
                    "AFR.BLA.1", "AFR.BLA.2", "EUR.BLA.1"), fill = 1)
  e <- new.magpie(c("BLA.AFR.A", "BLA.EUR.A", "BLUB.AFR.A", "BLUB.EUR.A",
                    "BLA.AFR.B", "BLA.EUR.B", "BLUB.AFR.B", "BLUB.EUR.B"), fill = 1)
  ee <- magpie_expand(e, d)
  expect_identical(ee, magpie_expand(d, ee))
})

test_that("expansion with unusual set names", {
  d <- new.magpie(c("AFR.BLUB.1", "AFR.BLUB.2", "EUR.BLUB.1", "EUR.BLUB.2",
                    "AFR.BLA.1", "AFR.BLA.2", "EUR.BLA.1", "EUR.BLA.2"), fill = 1)
  e <- new.magpie(c("BLA.AFR.A", "BLA.EUR.A", "BLUB.AFR.A", "BLUB.EUR.A",
                    "BLA.AFR.B", "BLA.EUR.B", "BLUB.AFR.B", "BLUB.EUR.B"), fill = 1)

  # test for cases with missing set names
  names(dimnames(e)) <- NULL
  ee <- magpie_expand(e, d)
  expect_identical(ee, magpie_expand(d, ee))

  # test case with NA set name
  f <- new.magpie("GLO", 1900, "value", fill = 1)
  g <- new.magpie("GLO", 1900, "blub", fill = 1)
  names(dimnames(g))[3] <- NA
  ff <- magpie_expand(f, g)
  expect_identical(ff, magpie_expand(g, ff))

})

test_that("subdimension order", {
  # subdimension order should remain unchanged if possible
  names <- c("bla.value1", "bla.value2")
  h <- new.magpie("GLO", 1900, names, fill = 1)
  i <- new.magpie("GLO", 1900, c("value1", "value2"), fill = 1)
  expect_identical(getItems(magpie_expand(i, h), 3), names)

  x <- new.magpie("GLO", 2000, c("a", "b", "c"))
  y <- new.magpie("GLO", 2000, c("1", "2", "3"))
  xx <- magpie_expand(x, y)
  expect_identical(getItems(xx, 3), getItems(magpie_expand(y, xx), 3))
})

test_that("magpie_expand_dim works", {
  a <- maxample("animal")
  expect_error(magclass:::magpie_expand_dim(a, a, dim = 4), "Unsupported dim setting")
  expect_error(magclass:::magpie_expand_dim(a[, , 2:5], a, dim = 3), "Identical set names but different content")
  expect_identical(magclass:::magpie_expand_dim(collapseDim(a, "day"), a, dim = 2), a)
})
