context("node splitting")

test_that("change of baseline: simple permutations", {
  expect_that(cob.matrix(old=c('X', 'A'), new=c('X', 'A')), equals(diag(1)))
  expect_that(cob.matrix(old=c('X', 'A', 'B'), new=c('X', 'A', 'B')), equals(diag(2)))
  expect_that(cob.matrix(old=c('X', 'A', 'B', 'C'), new=c('X', 'A', 'B', 'C')), equals(diag(3)))
  expect_that(cob.matrix(old=c('X', 'B', 'A'), new=c('X', 'A', 'B')),
              equals(rbind(c(0, 1), c(1, 0))))
  expect_that(cob.matrix(old=c('X', 'B', 'A', 'C'), new=c('X', 'A', 'B', 'C')),
              equals(rbind(c(0, 1, 0), c(1, 0, 0), c(0, 0, 1))))
})

test_that("change of baseline: change of baseline", {
  expect_that(cob.matrix(old=c('A', 'B'), new=c('B', 'A')), equals(diag(-1, nrow=1)))
  expect_that(cob.matrix(old=c('A', 'B', 'C', 'D'), new=c('B', 'A', 'C', 'D')),
              equals(rbind(c(-1, 0, 0), c(-1, 1, 0), c(-1, 0, 1))))
})

test_that("change of baseline: shorter new", {
  expect_that(cob.matrix(old=c('A', 'B', 'C', 'D'), new=c('B', 'A', 'C')),
              equals(rbind(c(-1, 0, 0), c(-1, 1, 0))))
})

test_that("rewrite AB: 2-arm trials untouched", {
  data.ab <- read.table(textConnection("
study treatment
s01   A
s01   B
s02   A
s02   C
s03   B
s03   C"), header=TRUE, stringsAsFactors=TRUE)
  expect_that(nodesplit.rewrite.data.ab(data.ab, "A", "B"), equals(data.ab))
})

test_that("rewrite AB: 3-arm trials arm removed", {
  data.ab <- read.table(textConnection("
study treatment
s01   A
s01   B
s02   A
s02   C
s03   A
s03   B
s03   C"), header=TRUE, stringsAsFactors=TRUE)
  expect_that(nodesplit.rewrite.data.ab(data.ab, "A", "B"), equals(data.ab[1:6,]))
})

test_that("rewrite AB: 4+-arm trials split", {
  data.ab <- read.table(textConnection("
study treatment
s01   A
s01   B
s01   C
s01   D"), header=TRUE, stringsAsFactors=TRUE)
  data.ab.rewrite <- read.table(textConnection("
study treatment
s01*  A
s01*  B
s01** C
s01** D"), header=TRUE, stringsAsFactors=TRUE)
  expect_that(nodesplit.rewrite.data.ab(data.ab, "A", "B"), equals(data.ab.rewrite))
})

test_that("rewrite RE: 2-arm trials untouched", {
  data.re <- read.table(textConnection("
study treatment diff std.err
s01   A         NA   NA
s01   B         1.0  0.4
s02   A         -1.5 0.3
s02   C         NA   0.2
s03   B         NA   NA
s03   C         0.8  0.4"), header=TRUE, stringsAsFactors=TRUE)
  expect_that(nodesplit.rewrite.data.re(data.re, "A", "B"), equals(data.re))
})

test_that("rewrite RE: 3-arm trials arm removed, baseline changed", {
  data.re <- read.table(textConnection("
study treatment diff std.err
s01   A         NA   0.2
s01   B         1.0  0.4
s01   C         -1.5 0.3
s02   B         NA   0.1
s02   A         -1.2 0.3
s02   C         0.8  0.4
s03   C         NA   0.1
s03   A         -1.2 0.3
s03   B         0.8  0.4"), header=TRUE, stringsAsFactors=TRUE)
  data.re.rewrite <- read.table(textConnection("
study treatment diff std.err
s01   A         NA   0.2
s01   B         1.0  0.4
s02   A         NA   0.2
s02   B         1.2  0.3
s03   A         NA   0.2
s03   B         2.0  0.5"), header=TRUE, stringsAsFactors=TRUE)
  levels(data.re.rewrite$treatment) <- c("A", "B", "C")
  expect_that(nodesplit.rewrite.data.re(data.re, "A", "B"), equals(data.re.rewrite))
})

test_that("rewrite RE: 4+-arm trials split, baseline changed", {
  data.re <- read.table(textConnection("
study treatment diff std.err
s01   B         NA   0.3
s01   A         0.7  0.6
s01   C         0.9  0.5
s01   D         0.5  0.6"), header=TRUE, stringsAsFactors=TRUE)
  data.re.rewrite <- read.table(textConnection("
study treatment diff std.err
s01*  A         NA   0.3
s01*  B         -0.7 0.6
s01** C         NA   0.2
s01** D         -0.4 0.5"), header=TRUE, stringsAsFactors=TRUE)
  expect_that(nodesplit.rewrite.data.re(data.re, "A", "B"), equals(data.re.rewrite))
})

test_that("rewrite studies", {
  data.re <- read.table(textConnection("
study treatment diff std.err
s01   B         NA   0.3
s01   A         0.7  0.6
s01   C         0.9  0.5
s01   D         0.5  0.6"), header=TRUE, stringsAsFactors=TRUE)
  data.ab <- read.table(textConnection("
study treatment mean std.err
s02   B         NA   0.3
s02   A         0.7  0.6
s03   A         0.9  0.5
s03   B         0.9  0.5
s03   D         0.5  0.6"), header=TRUE, stringsAsFactors=TRUE)
  studies <- read.table(textConnection("
study x
s01   1
s02   2
s03   3"), header=TRUE, stringsAsFactors=TRUE)
  studies.rewrite <- read.table(textConnection("
study x
s01*  1
s01** 1
s02   2
s03   3"), header=TRUE, stringsAsFactors=FALSE)
  network <- list(data.ab=data.ab, data.re=data.re, studies=studies, treatments=data.frame(id=as.factor(c("A","B","C","D"))))
  expect_that(nodesplit.rewrite.studies(network, "A", "B"), equals(studies.rewrite))
})

test_that("rewrite studies with trivial studies data frame", {
  data.re <- read.table(textConnection("
study treatment diff std.err
s01   B         NA   0.3
s01   A         0.7  0.6
s01   C         0.9  0.5
s01   D         0.5  0.6"), header=TRUE, stringsAsFactors=TRUE)
  data.ab <- read.table(textConnection("
study treatment mean std.err
s02   B         NA   0.3
s02   A         0.7  0.6
s03   A         0.9  0.5
s03   B         0.9  0.5
s03   D         0.5  0.6"), header=TRUE, stringsAsFactors=TRUE)
  studies <- read.table(textConnection("
study
s01
s02
s03"), header=TRUE, stringsAsFactors=TRUE)
  studies.rewrite <- read.table(textConnection("
study
s01*
s01**
s02
s03"), header=TRUE, stringsAsFactors=FALSE)
  network <- list(data.ab=data.ab, data.re=data.re, studies=studies, treatments=data.frame(id=as.factor(c("A","B","C","D"))))
  expect_that(nodesplit.rewrite.studies(network, "A", "B"), equals(studies.rewrite))
})

## Regression test for issue #10
test_that("non-lexicographical treatment order works correctly", {
  data.ab <- read.table(textConnection("
study treatment mean std.err
1     1         1    0.5
1     10        1    0.5
2     1         1    0.5
2     11        1    0.5
3     2         1    0.5
3     10        1    0.5
4     10        1    0.5
4     11        1    0.5
"), header=TRUE, stringsAsFactors=FALSE)
  treatments <- read.table(textConnection("
id description
1  A
2  B
10 C
11 D
"), header=TRUE, stringsAsFactors=FALSE)
  network <- mtc.network(data.ab=data.ab, treatments=treatments)
  mtc.model(network, type="nodesplit", t1=10, t2=11)
  succeed()
})

## Regression test for issue #22
test_that("study names do not mess up nodesplit with RE data", {
  data <- read.csv("../data/ns-complex.csv")
  network <- mtc.network(data.re=data)
  expect_that(mtc.nodesplit.comparisons(network), equals(data.frame(t1=c("B", "D"), t2=c("D", "H"), stringsAsFactors=FALSE)))
  data$study <- data$Study
  data$Study <- NULL
  network <- mtc.network(data.re=data)
  expect_that(mtc.nodesplit.comparisons(network), equals(data.frame(t1=c("B", "D"), t2=c("D", "H"), stringsAsFactors=FALSE)))
})

## Regression test for issue #25
test_that("mixing AB and RE data will not duplicate comparisons", {
  data.ab <- data.frame(study=c('1', '1', '2', '2', '4', '4'), treatment=c('A', 'B', 'A', 'C', 'B', 'C'))
  data.re <- data.frame(study=c('3', '3', '3'), treatment=c('C', 'A', 'B'), diff=c(NA, 1, 1), std.err=c(0.5, 1, 1))
  network <- mtc.network(data.ab=data.ab, data.re=data.re)
  expect_that(mtc.nodesplit.comparisons(network), equals(data.frame(t1=c("A", "A", "B"), t2=c("B", "C", "C"), stringsAsFactors=FALSE)))
})
