@@ -338,6 +338,113 @@ test_that(".rebuild_gt_subset copies transforms and substitutions", {
338338 expect_true(" _substitutions" %in% names(sub ))
339339})
340340
341+ test_that(" .rebuild_gt_subset preserves locale" , {
342+ tbl <- gt :: gt(mtcars [1 : 6 , 1 : 4 ], locale = " de" )
343+ cleaned <- writetfl ::: .clean_gt(tbl )
344+ sub <- writetfl ::: .rebuild_gt_subset(cleaned , 1 : 3 )
345+
346+ expect_equal(sub [[" _locale" ]], cleaned [[" _locale" ]])
347+ })
348+
349+ test_that(" .rebuild_gt_subset preserves stubhead label" , {
350+ tbl <- gt :: gt(mtcars [1 : 6 , 1 : 4 ], rownames_to_stub = TRUE ) | >
351+ gt :: tab_stubhead(label = " Car" )
352+ cleaned <- writetfl ::: .clean_gt(tbl )
353+ sub <- writetfl ::: .rebuild_gt_subset(cleaned , 1 : 3 )
354+
355+ expect_equal(sub [[" _stubhead" ]]$ label , " Car" )
356+ grob <- gt :: as_gtable(sub )
357+ expect_true(inherits(grob , " grob" ))
358+ })
359+
360+ test_that(" .rebuild_gt_subset preserves sub_missing() substitutions" , {
361+ df <- data.frame (a = c(1 , NA , 3 , NA , 5 , 6 ), b = c(10 , 20 , 30 , 40 , 50 , 60 ))
362+ tbl <- gt :: gt(df ) | >
363+ gt :: sub_missing(columns = a , missing_text = " N/A" )
364+ cleaned <- writetfl ::: .clean_gt(tbl )
365+ sub <- writetfl ::: .rebuild_gt_subset(cleaned , c(1 , 2 , 3 ))
366+
367+ expect_true(length(sub [[" _substitutions" ]]) > 0L )
368+ grob <- gt :: as_gtable(sub )
369+ expect_true(inherits(grob , " grob" ))
370+ })
371+
372+ test_that(" .rebuild_gt_subset drops substitutions for excluded rows" , {
373+ df <- data.frame (a = c(1 , NA , 3 , 4 , 5 , 6 ), b = 1 : 6 )
374+ tbl <- gt :: gt(df ) | >
375+ gt :: sub_missing(columns = a , missing_text = " N/A" )
376+ cleaned <- writetfl ::: .clean_gt(tbl )
377+ # Row 2 has NA; subset rows 3:6 excludes it
378+ sub <- writetfl ::: .rebuild_gt_subset(cleaned , c(3 , 4 , 5 , 6 ))
379+ # Substitution should still exist (applied to all rows) but re-indexed
380+ grob <- gt :: as_gtable(sub )
381+ expect_true(inherits(grob , " grob" ))
382+ })
383+
384+ test_that(" .rebuild_gt_subset preserves text_transform()" , {
385+ tbl <- gt :: gt(mtcars [1 : 6 , 1 : 4 ]) | >
386+ gt :: text_transform(
387+ locations = gt :: cells_body(columns = mpg ),
388+ fn = function (x ) paste0(x , " mpg" )
389+ )
390+ cleaned <- writetfl ::: .clean_gt(tbl )
391+ sub <- writetfl ::: .rebuild_gt_subset(cleaned , 1 : 3 )
392+
393+ expect_true(length(sub [[" _transforms" ]]) > 0L )
394+ grob <- gt :: as_gtable(sub )
395+ expect_true(inherits(grob , " grob" ))
396+ })
397+
398+ test_that(" .rebuild_gt_subset drops transforms targeting excluded rows" , {
399+ tbl <- gt :: gt(mtcars [1 : 6 , 1 : 4 ]) | >
400+ gt :: text_transform(
401+ locations = gt :: cells_body(columns = mpg , rows = 1 : 2 ),
402+ fn = function (x ) paste0(x , " mpg" )
403+ )
404+ cleaned <- writetfl ::: .clean_gt(tbl )
405+ # Subset rows 4:6 — transform targets rows 1:2 only, should be dropped
406+ sub <- writetfl ::: .rebuild_gt_subset(cleaned , 4 : 6 )
407+ expect_length(sub [[" _transforms" ]], 0L )
408+ })
409+
410+ test_that(" .rebuild_gt_subset preserves tab_options()" , {
411+ tbl <- gt :: gt(mtcars [1 : 6 , 1 : 4 ]) | >
412+ gt :: tab_options(
413+ table.font.size = gt :: px(10 ),
414+ row.striping.include_table_body = TRUE
415+ )
416+ cleaned <- writetfl ::: .clean_gt(tbl )
417+ sub <- writetfl ::: .rebuild_gt_subset(cleaned , 1 : 3 )
418+
419+ expect_equal(sub [[" _options" ]], cleaned [[" _options" ]])
420+ grob <- gt :: as_gtable(sub )
421+ expect_true(inherits(grob , " grob" ))
422+ })
423+
424+ test_that(" .rebuild_gt_subset copies _summary_cols when present" , {
425+ df <- data.frame (
426+ group = rep(c(" A" , " B" ), each = 3 ),
427+ val = c(10 , 20 , 30 , 40 , 50 , 60 )
428+ )
429+ tbl <- gt :: gt(df , groupname_col = " group" ) | >
430+ gt :: summary_rows(
431+ groups = gt :: everything(),
432+ columns = val ,
433+ fns = list (Total = ~ sum(. ))
434+ )
435+ cleaned <- writetfl ::: .clean_gt(tbl )
436+ sub <- writetfl ::: .rebuild_gt_subset(cleaned , 1 : 3 )
437+
438+ # _summary_cols may or may not be populated depending on gt version,
439+
440+ # but the slot should be carried through if present
441+ if (length(cleaned [[" _summary_cols" ]]) > 0L ) {
442+ expect_equal(sub [[" _summary_cols" ]], cleaned [[" _summary_cols" ]])
443+ } else {
444+ expect_true(TRUE ) # slot empty in this gt version
445+ }
446+ })
447+
341448# .gt_content_height() / .gt_grob_height() --------------------------------
342449
343450test_that(" .gt_content_height returns positive numeric" , {
0 commit comments