library("TreeTools")

test_that("MAST fails gracefully", {
  # R-level guard catches edge count mismatch
  expect_error(.MASTSizeEdges(BalancedTree(7)$edge, BalancedTree(8)$edge, 7),
               "same number of edges")
  expect_error(MASTSize(BalancedTree(8), UnrootTree(BalancedTree(8))))
  expect_error(MASTSize(BalancedTree(10000), PectinateTree(10000))) # Too large
  
})

test_that("MAST works", {
  tree1 <- BalancedTree(8L)
  tree2 <- PectinateTree(8L)
  expect_equal(8L, MASTSize(tree1, tree1, rooted = TRUE))
  expect_equal(8L, MASTSize(tree1, tree1, rooted = FALSE))
  expect_equal(4L, MASTSize(tree1, tree2, rooted = TRUE))
  expect_equal(6L, MASTSize(tree1, tree2, rooted = FALSE))
  
  expect_equal(MASTSize(BalancedTree(7), as.phylo(0:3, 7)),
               MASTSize(as.phylo(0:3, 7), BalancedTree(7)))
  
  expect_equal(MASTSize(list(BalancedTree(7), PectinateTree(7)), as.phylo(0:3, 7))[1, ],
               MASTSize(as.phylo(0:3, 7), BalancedTree(7)))
  
  expect_equal(MASTInfo(BalancedTree(7), as.phylo(0:3, 7)),
               MASTInfo(as.phylo(0:3, 7), BalancedTree(7)))
  
  expect_equal(MASTInfo(list(BalancedTree(7), PectinateTree(7)), as.phylo(0:3, 7))[1, ],
               MASTInfo(as.phylo(0:3, 7), BalancedTree(7)))
  
})

test_that("MAST supports funnily-ordered edges", {
  tree1 <- BalancedTree(8L)
  tree2 <- PectinateTree(8L)
  tree1$edge <- tree1$edge[c(1:7 * 2, (7:1 * 2) - 1), ]
  tree2$edge <- tree2$edge[c(1:7 * 2, (7:1 * 2) - 1), ]
  expect_equal(6L, MASTSize(Postorder(tree1), Postorder(tree2), rooted = FALSE))
  expect_equal(6L, MASTSize(tree1, tree2, rooted = FALSE))
})

test_that("MAST size calculated correctly on small trees", {
  library("TreeTools")
  #expect_equal(4L, MASTSize(as.phylo(0, 5), as.phylo(1, 5)))
  t1 <- structure(list(edge = structure(c(6L, 6L, 7L, 7L, 8L, 8L, 9L, 
                                          9L, 1L, 7L, 2L, 8L, 3L, 9L, 4L, 5L),
                                        .Dim = c(8L, 2L)), Nnode = 4L, 
                       tip.label = c("t3", "t5", "t4", "t1", "t2")),
                  class = "phylo", order = "cladewise")
  t2 <- structure(list(edge = structure(c(6L, 9L, 9L, 7L, 7L, 8L, 8L, 
                                          6L, 9L, 2L, 7L, 3L, 8L, 4L, 5L, 1L), 
                                        .Dim = c(8L, 2L)), 
                       tip.label = c("t3", "t4", "t1", "t2", "t5"), Nnode = 4L), 
                  class = "phylo", order = "cladewise")
  t1 <- RenumberTips(t1, paste0("t", 1:5))
  
  t2 <- RenumberTips(t2, t1)
  t2 <- Preorder(t2)

  ME <- function(e, node) {
    expect_equal(e, 
                 .MASTSizeEdges(Postorder(t1$edge),
                                RootOnNode(t2, node = node, TRUE)$edge,
                                nTip = 5L))
  }
  
  ME(2L, 1)
  ME(3L, 2)
  ME(4L, 3)
  ME(2L, 4)
  ME(2L, 5)
  ME(4L, 6)
  ME(4L, 7)
  ME(3L, 8)
  ME(3L, 9)
  
  expect_equal(4L, MASTSize(t1, t2, rooted = FALSE))
})
