# library(testthat)

context("Tree size")


test_that("Get a hclust number of leaves", {
  hc <- hclust(dist(USArrests[1:3, ]), "ave")

  expect_true(nleaves(hc) == 3L)
})


test_that("Get a dendrogram number of leaves", {
  hc <- hclust(dist(USArrests[1:3, ]), "ave")
  dend <- as.dendrogram(hc)

  expect_true(nleaves(dend) == 3L)
})


test_that("nleaves works the same for members and order", {
  dend <- as.dendrogram(hclust(dist(USArrests)))
  expect_identical(nleaves(dend, "order"), nleaves(dend, "members"))
})



test_that("Get a dendrogram number of nodes", {
  hc <- hclust(dist(USArrests[1:3, ]), "ave")
  dend <- as.dendrogram(hc)

  expect_true(nnodes(dend) == 5L)
  expect_true(nnodes(hc) == 5L)
})


test_that("Can't get a tree size for an object which is not hclust, dendrogram or phylo", {
  x <- 1:4
  expect_error(nleaves(x))
  x <- letters[1:4]
  expect_error(nleaves(x))
  x <- list(1:4)
  expect_error(nleaves(x))
})



test_that("Get a dendrogram tree size with leaves having their branch of height 0", {
  hc <- hclust(dist(USArrests[1:3, ]), "ave")
  dend <- as.dendrogram(hc)

  ###
  # Trivial case
  #    count_terminal_nodes(dend) # 3 terminal nodes
  #    nleaves(dend) # 3 - the same number
  expect_true(count_terminal_nodes(dend) == nleaves(dend))

  ###
  # NON-Trivial case
  #    str(dend)
  attr(dend[[2]], "height") <- 0
  #    count_terminal_nodes(dend) # 2 terminal nodes, why? see this plot:
  #    plot(dend, main = "This is considered a tree \n with TWO terminal nodes only") # while we have 3 leaves, in practice we have only 2 terminal nodes (this is a feature, not a bug.)
  expect_false(count_terminal_nodes(dend) == nleaves(dend))
})
