From dae9d951a82ffc19120cc98fca5411af6c4b1a9e Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Sun, 6 Sep 2026 11:46:11 +0530 Subject: [PATCH 1/3] Add regression test for geom_text interactive updates (issue #345). Minimal chromote test: stable key + duration + showSelected must move rendered geom_text position when clicking geom_tallrect. Signed-off-by: Gaurav Chaudhary --- ...-renderer3-geom-text-interactive-updates.R | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 tests/testthat/test-renderer3-geom-text-interactive-updates.R diff --git a/tests/testthat/test-renderer3-geom-text-interactive-updates.R b/tests/testthat/test-renderer3-geom-text-interactive-updates.R new file mode 100644 index 00000000..810a61cf --- /dev/null +++ b/tests/testthat/test-renderer3-geom-text-interactive-updates.R @@ -0,0 +1,33 @@ +acontext("geom_text interactive updates - issue #345") +library(animint2) +text.df <- data.frame( + item = c("a", "b"), + x = c(1, 9), + y = 1, + label = "marker", + key = "label") +rect.df <- data.frame( + item = c("a", "b"), + xmin = c(0.6, 8.6), + xmax = c(1.4, 9.4), + id = c("select_a", "select_b")) +viz <- animint( + plot1 = ggplot() + + theme_animint(width = 400) + + scale_x_continuous(limits = c(0, 10)) + + geom_text(aes(x, y, label = label, key = key), + showSelected = "item", data = text.df) + + geom_tallrect(aes(xmin = xmin, xmax = xmax, id = id), + clickSelects = "item", data = rect.df), + duration = list(item = 500), + first = list(item = "a")) +info <- animint2HTML(viz) +get_geom_text_center_x <- function() { + get_element_bbox("svg#plot_plot1 g.geom1_text_plot1 text.geom")$center_x +} +x_start <- get_geom_text_center_x() +clickID("select_b") +Sys.sleep(1) +test_that("geom_text x position updates after showSelected changes", { + expect_gt(get_geom_text_center_x() - x_start, 50) +}) From 4366257968812e32a4136a18ecd688fda06d08ce Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Sat, 12 Sep 2026 20:51:34 +0530 Subject: [PATCH 2/3] test: compare geom_text update with static reference (#345) Replace 50px threshold with equality against a non-showSelected geom_text at the target x-position, per review feedback. Signed-off-by: Gaurav Chaudhary --- ...-renderer3-geom-text-interactive-updates.R | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/tests/testthat/test-renderer3-geom-text-interactive-updates.R b/tests/testthat/test-renderer3-geom-text-interactive-updates.R index 810a61cf..0d4bc8b9 100644 --- a/tests/testthat/test-renderer3-geom-text-interactive-updates.R +++ b/tests/testthat/test-renderer3-geom-text-interactive-updates.R @@ -6,6 +6,10 @@ text.df <- data.frame( y = 1, label = "marker", key = "label") +reference.df <- data.frame( + x = 9, + y = 2, + label = "marker") rect.df <- data.frame( item = c("a", "b"), xmin = c(0.6, 8.6), @@ -13,21 +17,27 @@ rect.df <- data.frame( id = c("select_a", "select_b")) viz <- animint( plot1 = ggplot() + - theme_animint(width = 400) + - scale_x_continuous(limits = c(0, 10)) + geom_text(aes(x, y, label = label, key = key), showSelected = "item", data = text.df) + + geom_text(aes(x, y, label = label), data = reference.df) + geom_tallrect(aes(xmin = xmin, xmax = xmax, id = id), clickSelects = "item", data = rect.df), duration = list(item = 500), first = list(item = "a")) info <- animint2HTML(viz) -get_geom_text_center_x <- function() { +get_interactive_text_x <- function() { get_element_bbox("svg#plot_plot1 g.geom1_text_plot1 text.geom")$center_x } -x_start <- get_geom_text_center_x() +get_reference_text_x <- function() { + get_element_bbox("svg#plot_plot1 g.geom2_text_plot1 text.geom")$center_x +} +reference_x <- get_reference_text_x() +interactive_x <- get_interactive_text_x() +test_that("interactive geom_text starts left of reference", { + expect_lt(interactive_x, reference_x) +}) clickID("select_b") Sys.sleep(1) -test_that("geom_text x position updates after showSelected changes", { - expect_gt(get_geom_text_center_x() - x_start, 50) +test_that("geom_text x position matches non-interactive geom after update", { + expect_equal(get_interactive_text_x(), reference_x) }) From 4996b101a42346da7546fca9cef5f370adb0231b Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Sat, 12 Sep 2026 22:46:54 +0530 Subject: [PATCH 3/3] test: add geom_text multiline renderer coverage (#345) Chromote test checks tspan labels for multiline geom_text. Fails on current .text() workaround; documents missing browser coverage. --- .../test-renderer3-geom-text-interactive-updates.R | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/testthat/test-renderer3-geom-text-interactive-updates.R b/tests/testthat/test-renderer3-geom-text-interactive-updates.R index 0d4bc8b9..ecbb86c7 100644 --- a/tests/testthat/test-renderer3-geom-text-interactive-updates.R +++ b/tests/testthat/test-renderer3-geom-text-interactive-updates.R @@ -1,5 +1,16 @@ -acontext("geom_text interactive updates - issue #345") +acontext("geom_text rendering - issue #345") library(animint2) +multiline.df <- data.frame(x = 1, y = 1, label = "line1\nline2") +multiline.viz <- list( + multiline = ggplot(multiline.df, aes(x, y, label = label)) + geom_text()) +multiline.info <- animint2HTML(multiline.viz) +get_geom_text_tspan_labels <- function(html = multiline.info$html) { + nodes <- getNodeSet(html, "//g[@class='geom1_text_multiline']//tspan") + as.character(sapply(nodes, xmlValue)) +} +test_that("geom_text renders multiline labels", { + expect_equal(get_geom_text_tspan_labels(), c("line1", "line2")) +}) text.df <- data.frame( item = c("a", "b"), x = c(1, 9),