# library(testthat)

context("labels assignment")

test_that("labels assginment works for vectors",{
   x <- 1:3   
   # expect_that(labels(x), equals(as.character(1:3))) # notice this is 1:3 as character
   expect_equal(labels(x), (as.character(1:3))) # notice this is 1:3 as character

   labels(x) <- letters[1:3]
   expect_equal(labels(x), (letters[1:3]))
   # labels(x) # [1] "a" "b" "c"   
   labels(x)[1] <- "one"
   expect_equal(labels(x), c("one", "b", "c")) # checking specific assignment   
})



# test_that("labels assginment works for matrix",{
   # y <- matrix(1:9, 3,3)
   # expect_equal(labels(y), (NULL))
   
   # labels(y) <- letters[1:3] # defaults to assign labels to columns
   # expect_equal(labels(y), (letters[1:3]))
   # expect_equal(colnames(y), (letters[1:3]))
   
   # labels(y, which = "rownames") <- letters[24:26]
   # expect_equal(labels(y, which = "rownames"), letters[24:26])
   # expect_equal(rownames(y), letters[24:26])

   # labels(y)[1] <- "one"
   # expect_equal(labels(y), c("one", "b", "c")) # checking specific assignment      
# })




test_that("labels (with order=TRUE, by default), before and after assginment, works for hclust",{
   hc <- hclust(dist(USArrests[1:3,]), "ave")
    
   #    plot(hc)   
#    expect_that(labels(hc), equals(c("Alabama", "Alaska", "Arizona")))
   expect_equal(labels(hc), c("Arizona", "Alabama", "Alaska"))
   
   labels(hc)  <- letters[1:3]
   expect_equal(labels(hc), letters[1:3])
   
   labels(hc)[1] <- "one"
   expect_equal(labels(hc), c("one", "b", "c")) # checking specific assignment         
})


test_that("labels (without order!) works for hclust",{
   hc <- hclust(dist(USArrests[1:3,]), "ave")
   #    plot(hc)   
   # expect_that(labels(hc, order = FALSE), equals(c("Alabama", "Alaska", "Arizona")))
   expect_equal(labels(hc, order = FALSE), c("Alabama", "Alaska", "Arizona"))
})


test_that("labels (without order!) works differently than labels assignment (which are WITH order) for hclust",{
   hc <- hclust(dist(USArrests[1:3,]), "ave")
   #    plot(hc)   
   # expect_that(labels(hc, order = FALSE), equals(c("Alabama", "Alaska", "Arizona")))
	expect_equal(labels(hc, order = FALSE), c("Alabama", "Alaska", "Arizona"))
	
   labels(hc)  <- letters[1:3]
   
   # expect_that(identical(labels(hc, order = FALSE) , letters[1:3]),
               # is_false())   
   expect_false(identical(labels(hc, order = FALSE) , letters[1:3]))   
})


test_that("labels assginment works for dendrogram",{
   hc <- hclust(dist(USArrests[1:3,]), "ave")
   dend <- as.dendrogram(hc)
   
   expect_equal(labels(dend), c("Arizona", "Alabama", "Alaska"))
   
   labels(dend)  <- letters[1:3]
   expect_equal(labels(dend), letters[1:3])
   
   labels(dend)[1] <- "one"
   expect_equal(labels(dend), c("one", "b", "c")) # checking specific assignment            
})


test_that("labels for hclust and dendrogram are (by default) the same",{
   hc <- hclust(dist(USArrests[1:3,]), "ave")
   dend <- as.dendrogram(hc)      
   # hc and dend labels should NOT be identical.   
   expect_true(identical(labels(dend), labels(hc)))
})




test_that("labels assginment recycles properly and consistently",{
   x <- 1:3   
   hc <- hclust(dist(USArrests[1:3,]), "ave")
   dend <- as.dendrogram(hc)
   # y <- matrix(1:9, 3,3)
   
   suppressWarnings({
   labels(x) <- letters[1]
   labels(hc)  <- letters[1]
   labels(dend)  <- letters[1]
   # labels(y) <- letters[1] # defaults to assign labels to columns
   # labels(y, which = "rownames") <- letters[24]
   })
   
   expect_equal(labels(x), (rep(letters[1], 3)))
   expect_equal(labels(hc), (rep(letters[1], 3)))
   expect_equal(labels(dend), (rep(letters[1], 3)))
   # expect_equal(labels(y), (rep(letters[1], 3)))
   # expect_equal(labels(y, which = "rownames"), (rep(letters[24], 3)))
   # labels(x) # [1] "a" "b" "c"      
})


test_that("labels assginment issues warning when using recycling",{
   x <- 1:3   
   hc <- hclust(dist(USArrests[1:3,]), "ave")
   dend <- as.dendrogram(hc)
   # y <- matrix(1:9, 3,3)   
   
#    expect_that(labels(x) <- letters[1], gives_warning())
   expect_warning(labels(x) <- letters[1])
   expect_warning(labels(hc) <- letters[1])
   expect_warning(labels(dend) <- letters[1])
   # expect_warning(labels(y) <- letters[1])
   # expect_warning(labels(y, which = "rownames") <- letters[24])
})


test_that("labels assginment to dendrogram keeps the child nodes as NOT of dendrogram class",{
   hc <- hclust(dist(USArrests[1:3,]), "ave")
   dend <- as.dendrogram(hc)
   labels(dend)  <- letters[1:3]
   
   expect_true(class(unclass(dend)[[2]]) == "list")
})



test_that("order of leaves in sub-dendrogram and as.hclust",{
   # For example:
   hc <- hclust(dist(USArrests[1:6,]), "ave")
   dend <- as.dendrogram(hc)
   sub_dend <- dend[[1]]
   
   # bad order
   expect_equal(order.dendrogram(sub_dend), c(4,6))
   # bad labels:
#    expect_equal(labels(as.hclust(sub_dend)), as.character(rep(NA,2)))
   # since R 3.1.1-patched - the above will produce an error. (as it should)
   
   # let's fix it:   
   order.dendrogram(sub_dend) <- rank(order.dendrogram(sub_dend), ties.method= "first")
   expect_equal(labels(as.hclust(sub_dend)), c("Arkansas", "Colorado"))
   # We now have labels :)
   
   
})



test_that("labels of hclust on data without rownames is an integer",{
   # this is a problem when some function assumes that labels are "character"
   DATA <- USArrests
   rownames(DATA) <- NULL
   hc <- hclust(dist(DATA))
   dend <- as.dendrogram(hc)
   expect_true(length(labels(hc))==0) # hc has NO labels
   expect_true(is.integer(labels(dend))) # the labels the dend gets are Integer   
})






test_that("order of leaves can be extracted and changed",{
   hc <- hclust(dist(USArrests[1:3,]), "ave")
   dend <- as.dendrogram(hc)
   
   expect_identical(order.dendrogram(dend), c(3L,1L,2L))
   
   # change order:
   order.dendrogram(dend) <- 1:3   
   expect_identical(order.dendrogram(dend), 1:3)
   
   # change order (with replications):
   expect_warning(order.dendrogram(dend) <- c(1,2))   
   expect_identical(order.dendrogram(dend), as.integer(c(1,2,1)))
   
   
})



