library(testthat) library(XML) library(tibble) library(magrittr) context("htmlTable") # A simple example test_that("With empty rownames(mx) it should skip those", { mx <- matrix(1:6, ncol = 3) table_str <- htmlTable(mx) expect_false(grepl("", table_str)) expect_false(grepl("[^>]+>NA", table_str)) colnames(mx) <- sprintf("Col %s", LETTERS[1:NCOL(mx)]) table_str <- htmlTable(mx) expect_true(grepl("", table_str)) expect_false(grepl("[^>]+>NA", table_str)) }) test_that("Empty cell names should be replaced with ''", { mx <- matrix(1:6, ncol = 3) mx[1, 1] <- NA table_str <- htmlTable(mx) expect_false(grepl("[^>]+>NA", table_str)) }) test_that("The variable name should not be in the tables first row if no rownames(mx)", { mx <- matrix(1:6, ncol = 3) colnames(mx) <- sprintf("Col %s", LETTERS[1:NCOL(mx)]) table_str <- htmlTable(mx) expect_false(grepl("[^<]*[^>]+>mx", table_str)) }) test_that("A rowlabel without rownames indicates some kind of error and should throw an error", { mx <- matrix(1:6, ncol = 3) colnames(mx) <- sprintf("Col %s", LETTERS[1:NCOL(mx)]) expect_error(htmlTable(mx, rowlabel = "not_mx")) }) # Add rownames test_that("The rowname should appear", { mx <- matrix(1:6, ncol = 3) colnames(mx) <- sprintf("Col %s", LETTERS[1:NCOL(mx)]) rownames(mx) <- LETTERS[1:NROW(mx)] table_str <- htmlTable(mx) parsed_table <- readHTMLTable(as.character(table_str))[[1]] expect_equal(ncol(parsed_table), ncol(mx) + 1) expect_match(table_str, "]*>[^>]+>A") expect_match(table_str, "]*>[^>]+>B") }) test_that("Check that basic output are the same as the provided matrix", { mx <- matrix(1:6, ncol = 3) colnames(mx) <- sprintf("Col %s", LETTERS[1:NCOL(mx)]) table_str <- htmlTable(mx) parsed_table <- readHTMLTable(as.character(table_str))[[1]] expect_equal(ncol(parsed_table), ncol(mx), info = "Cols did not match") expect_equal(nrow(parsed_table), nrow(mx), info = "Rows did not match") expect_true(all(mx == parsed_table), info = "Some cells don't match the inputted cells" ) }) test_that("rnames = FALSE it should skip those", { mx <- matrix(1:6, ncol = 3) rownames(mx) <- c("Row A", "Row B") table_str <- htmlTable(mx, rnames = FALSE) expect_false(grepl("FALSE", table_str)) expect_false(grepl("Row A", table_str)) }) test_that("Test align functions", { expect_equivalent( nchar(prPrepareAlign("lr", x = matrix(1, ncol = 10))), 10 ) expect_equivalent( nchar(prPrepareAlign("lr", x = matrix(1, ncol = 2))), 2 ) expect_equivalent( nchar(prPrepareAlign("lr", x = matrix(1, ncol = 2), rnames = TRUE)), 3 ) expect_equivalent( nchar(prPrepareAlign("l", x = matrix(1, ncol = 2), rnames = TRUE)), 3 ) expect_equivalent( nchar(prPrepareAlign("", x = matrix(1, ncol = 2, nrow = 2), rnames = TRUE)), 3 ) expect_equivalent( attr(prPrepareAlign("r|rlt|r|", x = matrix(1, ncol = 2, nrow = 2), rnames = TRUE), "n"), 3 ) expect_equivalent( attr(prPrepareAlign("r|rcl|lt|r|", x = matrix(1, ncol = 5, nrow = 2), rnames = TRUE), "n"), 6 ) expect_match( prPrepareAlign("r|rcl|lt|r|", x = matrix(1, ncol = 5, nrow = 2), rnames = TRUE), "^r" ) expect_match( prPrepareAlign("l|r|", x = matrix(1, ncol = 3, nrow = 2), rnames = TRUE), "^l|r|r|$" ) align_str <- prPrepareAlign("r|rcl|lt|r|", x = matrix(1, ncol = 5, nrow = 2), rnames = TRUE) expect_true("right" %in% prGetAlign(align_str, 1)) expect_true("right" %in% prGetAlign(align_str, 2)) expect_true("center" %in% prGetAlign(align_str, 3)) expect_true("left" %in% prGetAlign(align_str, 4)) expect_true("left" %in% prGetAlign(align_str, 5)) expect_true("right" %in% prGetAlign(align_str, 6)) expect_true("border-right" %in% names(prGetAlign(align_str, 1))) expect_true("border-right" %in% names(prGetAlign(align_str, 4))) expect_true("border-right" %in% names(prGetAlign(align_str, 5))) expect_true("border-right" %in% names(prGetAlign(align_str, 6))) expect_equivalent(length(prGetAlign(align_str, 1)), 2) expect_equivalent(length(prGetAlign(align_str, 2)), 1) expect_equivalent(length(prGetAlign(align_str, 6)), 2) align_str <- prPrepareAlign("|c|rc", x = matrix(1, ncol = 2, nrow = 2), rnames = TRUE) expect_true("border-right" %in% names(prGetAlign(align_str, 1))) expect_true("border-left" %in% names(prGetAlign(align_str, 1))) expect_true("center" %in% prGetAlign(align_str, 1)) mx <- matrix(1:6, ncol = 3) rownames(mx) <- c("Row A", "Row B") table_str <- htmlTable(mx, rname = FALSE) expect_match(table_str, "text-align: center;[^>]*>1") expect_match(table_str, "text-align: center;[^>]*>3") expect_match(table_str, "text-align: center;[^>]*>5") table_str <- htmlTable(mx) expect_match(table_str, "text-align: left;[^>]*>Row A") expect_match(table_str, "text-align: center;[^>]*>1") expect_match(table_str, "text-align: center;[^>]*>3") expect_match(table_str, "text-align: center;[^>]*>5") table_str <- htmlTable(mx, align = "r") expect_match(table_str, "text-align: left;[^>]*>Ro") expect_match(table_str, "text-align: right;[^>]*>1") expect_match(table_str, "text-align: right;[^>]*>3") expect_match(table_str, "text-align: right;[^>]*>5") table_str <- htmlTable(mx, align = "|ll|r|r|") expect_match(table_str, "text-align: left;[^>]*>Ro") expect_match(table_str, "text-align: left;[^>]*>1") expect_match(table_str, "text-align: right;[^>]*>3") expect_match(table_str, "text-align: right;[^>]*>5") expect_match(table_str, "border-left:[^>]*>Ro") expect_match(table_str, "border-right:[^>]*>1") expect_match(table_str, "border-right:[^>]*>3") expect_match(table_str, "border-right:[^>]*>5") }) test_that("Check color function", { expect_equivalent( prPrepareColors(c("white", "#444444"), 2), c("#ffffff", "#444444") ) expect_equivalent( prPrepareColors(c("white", "#444444"), 3), c("#ffffff", "#444444", "#ffffff") ) expect_equivalent( prPrepareColors(c("white", "#444"), 3), c("#ffffff", "#444444", "#ffffff") ) expect_null(attr(prPrepareColors(c("white", "#444444"), 3), "groups")) expect_equivalent( attr(prPrepareColors(c("white", "#444444"), n = 3, ng = c(2, 3, 1), gtxt = c("a", "b", "c") ), "groups")[[1]], c("#ffffff", "#ffffff") ) expect_equivalent( attr(prPrepareColors(c("white", "#444444"), n = 3, ng = c(2, 3, 1), gtxt = c("a", "b", "c") ), "groups")[[2]], c("#444444", "#444444", "#444444") ) expect_equivalent( attr(prPrepareColors(c("white", "#444444"), n = 3, ng = c(2, 3, 1), gtxt = c("a", "b", "c") ), "groups")[[3]], c("#ffffff") ) expect_equivalent( attr(prPrepareColors(c("white", "#444444", "none"), n = 3, ng = c(2, 3, 1), gtxt = c("a", "b", "c") ), "groups")[[3]], c("none") ) expect_equivalent( attr(prPrepareColors(c("white", "none"), n = 3, ng = c(2, 3, 1), gtxt = c("a", "b", "c") ), "groups")[[2]], c("none", "none", "none") ) ## Test the merge colors expect_equal( prMergeClr(c("white", "#444444")), colorRampPalette(c("#FFFFFF", "#444444"))(3)[2] ) expect_equal( prMergeClr(c("red", "#444444")), colorRampPalette(c("red", "#444444"))(3)[2] ) expect_equal( prMergeClr(c("#444444", "red")), colorRampPalette(c("red", "#444444"))(3)[2] ) expect_equal( prMergeClr(c("#FFFFFF", "#FFFFFF", "#FFFFFF")), "#FFFFFF" ) expect_equal( prMergeClr(c("#FFFFFF", "#FFFFFF", "#000000", "#000000")), prMergeClr(c("#FFFFFF", "#000000")) ) expect_equal( prMergeClr(c("#000000", "#FFFFFF", "#FFFFFF")), prMergeClr(c("#FFFFFF", "#FFFFFF", "#000000")) ) expect_equal( prMergeClr(c("#000000", "#FFFFFF", "#000000")), prMergeClr(c("#FFFFFF", "#000000", "#FFFFFF")) ) }) test_that("Test prAddSemicolon2StrEnd", { test_str <- "background: white" expect_equal( prAddSemicolon2StrEnd(test_str), paste0(test_str, ";") ) test_str <- c("", "", `background-color` = "none") expect_equivalent( prAddSemicolon2StrEnd(test_str), paste0(test_str[3], ";") ) expect_equal( names(prAddSemicolon2StrEnd(test_str)), names(test_str[3]) ) }) test_that("Problem with naming in stringr 1.0.0", { style_bug <- structure(c("", "font-weight: 900;", "#f7f7f7"), .Names = c("", "", "background-color") ) expect_false(is.null(names(prAddSemicolon2StrEnd(style_bug)))) expect_match(prGetStyle(style_bug), regexp = "^font-weight: 900; background-color: #f7f7f7" ) }) test_that("Handling data.frames with factors", { tmp <- data.frame( a = 1:3, b = factor( x = 1:3, labels = c( "Unique_Factor_1", "Factor_2", "Factor_3" ) ) ) str <- htmlTable(tmp) expect_true(grepl("Unique_Factor_1", str)) tmp <- data.frame( a = 1.23, b = factor( x = 1, labels = c("1.2") ) ) %>% txtRound() expect_true(tmp$a == "1", tmp$b == "1.2") }) context("htmlTable - empty table") test_that("has header elements", { empty_dataframe <- data.frame( a = numeric(), b = factor(levels = c( "level one", "level two" )) ) expect_warning({ table_str <- htmlTable(empty_dataframe) }) th_cell_regex <- function(content) str_interp("[^<]*]*>${CONTENT}", list(CONTENT = content)) expect_match(table_str, str_interp("[^<]*${CELL1}${CELL2}[^<]*", list(CELL1 = th_cell_regex("a"), CELL2 = th_cell_regex("b")))) expect_match(table_str, "[^<]+") expect_warning({ table_str <- htmlTable(empty_dataframe, rnames = TRUE, rowlabel = "Row number", cgroup = "Spanner", n.cgroup = 2, col.rgroup = c( "white", "gray" ), caption = "This is a caption", tfoot = "This is a footnote" ) }) expect_match(table_str, str_interp("${CELL_LABEL}${CELL1}${CELL2}[^<]*", list(CELL_LABEL = th_cell_regex("Row number"), CELL1 = th_cell_regex("a"), CELL2 = th_cell_regex("b")))) expect_match(table_str, "[^<]+") expect_match(table_str, "]+>\\s*This is a footnote", perl = TRUE) expect_match(table_str, "]+>\\s*This is a caption", perl = TRUE) }) test_that("An empty dataframe returns an empty table with a warning", { empty_dataframe <- data.frame( a = numeric(), b = factor(levels = c( "level one", "level two" )) ) expect_warning(htmlTable(empty_dataframe), regexp = "empty_dataframe") empty_matrix <- empty_dataframe %>% as.matrix() expect_warning(htmlTable(empty_matrix), regexp = "empty_matrix") expect_warning(htmlTable(empty_dataframe)) expect_warning(htmlTable(empty_dataframe, cgroup = "Spanner", n.cgroup = 2 )) expect_warning(htmlTable(empty_dataframe, cgroup = "Spanner", n.cgroup = 2, caption = "Caption", tfoot = "Footnote" )) expect_warning(htmlTable(empty_dataframe, col.rgroup = c( "white", "gray" ) )) expect_warning(htmlTable(empty_dataframe, rnames = TRUE, rowlabel = "Row number", cgroup = "Spanner", n.cgroup = 2, col.rgroup = c( "white", "gray" ) )) expect_warning(htmlTable(empty_dataframe, rnames = TRUE, rowlabel = "Row number", cgroup = "Spanner", n.cgroup = 2, col.rgroup = c( "white", "gray" ), caption = "This is a caption", tfoot = "This is a footnote" )) })