| Back to Long Tests report for BioC 3.22 |
This page was generated on 2025-10-18 23:55 -0400 (Sat, 18 Oct 2025).
| Hostname | OS | Arch (*) | R version | Installed pkgs |
|---|---|---|---|---|
| nebbiolo2 | Linux (Ubuntu 24.04.3 LTS) | x86_64 | 4.5.1 Patched (2025-08-23 r88802) -- "Great Square Root" | 4887 |
| lconway | macOS 12.7.6 Monterey | x86_64 | 4.5.1 Patched (2025-09-10 r88807) -- "Great Square Root" | 4677 |
| Click on any hostname to see more info about the system (e.g. compilers) (*) as reported by 'uname -p', except on Windows and Mac OS X | ||||
| Package 17/31 | Hostname | OS / Arch | CHECK | |||||||
| DOtools 0.99.11 (landing page) Mariano Ruz Jurado
| nebbiolo2 | Linux (Ubuntu 24.04.3 LTS) / x86_64 | ERROR | |||||||
| lconway | macOS 12.7.6 Monterey / x86_64 | ERROR | ||||||||
|
To the developers/maintainers of the DOtools package: - Use the following Renviron settings to reproduce errors and warnings. - If 'R CMD check' started to fail recently on the Linux builder(s) over a missing dependency, add the missing dependency to 'Suggests:' in your DESCRIPTION file. See Renviron.bioc for more information. |
| Package: DOtools |
| Version: 0.99.11 |
| Command: /home/biocbuild/bbs-3.22-bioc/R/bin/R CMD check --test-dir=longtests --no-stop-on-test-error --no-codoc --no-examples --no-manual --ignore-vignettes --check-subdirs=no DOtools_0.99.11.tar.gz |
| StartedAt: 2025-10-18 16:08:39 -0400 (Sat, 18 Oct 2025) |
| EndedAt: 2025-10-18 16:17:14 -0400 (Sat, 18 Oct 2025) |
| EllapsedTime: 515.1 seconds |
| RetCode: 1 |
| Status: ERROR |
| CheckDir: DOtools.Rcheck |
| Warnings: NA |
DOtools.Rcheck/tests/test-DO.BarplotWilcox.Rout.fail
R version 4.5.1 Patched (2025-08-23 r88802) -- "Great Square Root"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> library(testthat)
> library(Seurat)
Loading required package: SeuratObject
Loading required package: sp
Attaching package: 'SeuratObject'
The following objects are masked from 'package:base':
intersect, t
> library(ggplot2)
> library(SingleCellExperiment)
Loading required package: SummarizedExperiment
Loading required package: MatrixGenerics
Loading required package: matrixStats
Attaching package: 'MatrixGenerics'
The following objects are masked from 'package:matrixStats':
colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse,
colCounts, colCummaxs, colCummins, colCumprods, colCumsums,
colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs,
colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats,
colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
colWeightedMeans, colWeightedMedians, colWeightedSds,
colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins,
rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars,
rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
rowWeightedSds, rowWeightedVars
Loading required package: GenomicRanges
Loading required package: stats4
Loading required package: BiocGenerics
Loading required package: generics
Attaching package: 'generics'
The following objects are masked from 'package:base':
as.difftime, as.factor, as.ordered, intersect, is.element, setdiff,
setequal, union
Attaching package: 'BiocGenerics'
The following objects are masked from 'package:stats':
IQR, mad, sd, var, xtabs
The following objects are masked from 'package:base':
Filter, Find, Map, Position, Reduce, anyDuplicated, aperm, append,
as.data.frame, basename, cbind, colnames, dirname, do.call,
duplicated, eval, evalq, get, grep, grepl, is.unsorted, lapply,
mapply, match, mget, order, paste, pmax, pmax.int, pmin, pmin.int,
rank, rbind, rownames, sapply, saveRDS, table, tapply, unique,
unsplit, which.max, which.min
Loading required package: S4Vectors
Attaching package: 'S4Vectors'
The following object is masked from 'package:utils':
findMatches
The following objects are masked from 'package:base':
I, expand.grid, unname
Loading required package: IRanges
Attaching package: 'IRanges'
The following object is masked from 'package:sp':
%over%
Loading required package: Seqinfo
Loading required package: Biobase
Welcome to Bioconductor
Vignettes contain introductory material; view with
'browseVignettes()'. To cite Bioconductor, see
'citation("Biobase")', and for packages 'citation("pkgname")'.
Attaching package: 'Biobase'
The following object is masked from 'package:MatrixGenerics':
rowMedians
The following objects are masked from 'package:matrixStats':
anyMissing, rowMedians
Attaching package: 'SummarizedExperiment'
The following object is masked from 'package:Seurat':
Assays
The following object is masked from 'package:SeuratObject':
Assays
>
> # Helper function to create test Seurat object
> create_test_seurat <- function() {
+ set.seed(42)
+
+ # Toy counts matrix: 10 genes x 12 cells
+ mat <- matrix(rpois(120, lambda = 5), nrow = 10)
+ rownames(mat) <- paste0("gene", 1:10)
+ colnames(mat) <- paste0("cell", 1:12)
+
+ # Metadata: four conditions, three cells each
+ meta <- data.frame(
+ orig.ident = rep(c("sample1", "sample2", "sample3", "sample4"), each = 3),
+ condition = rep(c("A", "B", "C", "D"), each = 3),
+ cluster = rep(c("cluster1", "cluster2"), times = 6)
+ )
+ rownames(meta) <- colnames(mat)
+
+ # Create Seurat object - convert matrix to dgCMatrix to avoid warnings
+ mat_sparse <- as(mat, "dgCMatrix")
+ seurat_obj <- CreateSeuratObject(counts = mat_sparse, meta.data = meta)
+ seurat_obj <- NormalizeData(seurat_obj)
+
+ # Add a metadata feature
+ seurat_obj$metadata_feature <- rnorm(ncol(seurat_obj))
+
+ return(seurat_obj)
+ }
>
> # Helper function to create test SCE object
> create_test_sce <- function() {
+ set.seed(42)
+
+ # Toy counts matrix: 10 genes x 12 cells
+ mat <- matrix(rpois(120, lambda = 5), nrow = 10)
+ rownames(mat) <- paste0("gene", 1:10)
+ colnames(mat) <- paste0("cell", 1:12)
+
+ # Create SingleCellExperiment
+ sce <- SingleCellExperiment(
+ assays = list(counts = mat, logcounts = log1p(mat)),
+ colData = data.frame(
+ orig.ident = rep(c("sample1", "sample2", "sample3", "sample4"), each = 3),
+ condition = rep(c("A", "B", "C", "D"), each = 3),
+ cluster = rep(c("cluster1", "cluster2"), times = 6)
+ )
+ )
+
+ return(sce)
+ }
>
> test_that("DO.BarplotWilcox returns ggplot and list correctly", {
+ skip_if_not_installed("Seurat")
+ skip_if_not_installed("ggplot2")
+ skip_if_not_installed("rstatix")
+
+ seurat_obj <- create_test_seurat()
+
+ # Test 1: Default parameters (ggplot)
+ p <- DO.BarplotWilcox(
+ sce_object = seurat_obj,
+ Feature = "gene1",
+ ListTest = list(c("A","B")),
+ returnValues = FALSE,
+ ctrl.condition = "A",
+ group.by = "condition"
+ )
+ expect_s3_class(p, "ggplot")
+
+ # Test 2: returnValues = TRUE (list with components)
+ res <- DO.BarplotWilcox(
+ sce_object = seurat_obj,
+ Feature = "gene1",
+ ListTest = list(c("A","B")),
+ returnValues = TRUE,
+ ctrl.condition = "A",
+ group.by = "condition"
+ )
+ expect_type(res, "list")
+ expect_named(res, c("plot", "df.melt", "df.melt.orig", "df.melt.sum", "stat.test"))
+ expect_s3_class(res$plot, "ggplot")
+ expect_true(is.data.frame(res$df.melt))
+ expect_true(is.data.frame(res$df.melt.orig))
+ expect_true(is.data.frame(res$df.melt.sum))
+ })
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
── Error: DO.BarplotWilcox returns ggplot and list correctly ───────────────────
Error in `DO.BarplotWilcox(sce_object = seurat_obj, Feature = "gene1",
ListTest = list(c("A", "B")), returnValues = FALSE, ctrl.condition = "A",
group.by = "condition")`: could not find function "DO.BarplotWilcox"
Error:
! Test failed
Backtrace:
▆
1. ├─testthat::test_that(...)
2. │ └─withr (local) `<fn>`()
3. └─reporter$stop_if_needed()
4. └─rlang::abort("Test failed", call = NULL)
Execution halted
DOtools.Rcheck/tests/test-DO.Dotplot.Rout
R version 4.5.1 Patched (2025-08-23 r88802) -- "Great Square Root"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> # tests/testthat/test-DO.Dotplot-full.R
> library(testthat)
> library(Seurat)
Loading required package: SeuratObject
Loading required package: sp
Attaching package: 'SeuratObject'
The following objects are masked from 'package:base':
intersect, t
> library(SingleCellExperiment)
Loading required package: SummarizedExperiment
Loading required package: MatrixGenerics
Loading required package: matrixStats
Attaching package: 'MatrixGenerics'
The following objects are masked from 'package:matrixStats':
colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse,
colCounts, colCummaxs, colCummins, colCumprods, colCumsums,
colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs,
colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats,
colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
colWeightedMeans, colWeightedMedians, colWeightedSds,
colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins,
rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars,
rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
rowWeightedSds, rowWeightedVars
Loading required package: GenomicRanges
Loading required package: stats4
Loading required package: BiocGenerics
Loading required package: generics
Attaching package: 'generics'
The following objects are masked from 'package:base':
as.difftime, as.factor, as.ordered, intersect, is.element, setdiff,
setequal, union
Attaching package: 'BiocGenerics'
The following objects are masked from 'package:stats':
IQR, mad, sd, var, xtabs
The following objects are masked from 'package:base':
Filter, Find, Map, Position, Reduce, anyDuplicated, aperm, append,
as.data.frame, basename, cbind, colnames, dirname, do.call,
duplicated, eval, evalq, get, grep, grepl, is.unsorted, lapply,
mapply, match, mget, order, paste, pmax, pmax.int, pmin, pmin.int,
rank, rbind, rownames, sapply, saveRDS, table, tapply, unique,
unsplit, which.max, which.min
Loading required package: S4Vectors
Attaching package: 'S4Vectors'
The following object is masked from 'package:utils':
findMatches
The following objects are masked from 'package:base':
I, expand.grid, unname
Loading required package: IRanges
Attaching package: 'IRanges'
The following object is masked from 'package:sp':
%over%
Loading required package: Seqinfo
Loading required package: Biobase
Welcome to Bioconductor
Vignettes contain introductory material; view with
'browseVignettes()'. To cite Bioconductor, see
'citation("Biobase")', and for packages 'citation("pkgname")'.
Attaching package: 'Biobase'
The following object is masked from 'package:MatrixGenerics':
rowMedians
The following objects are masked from 'package:matrixStats':
anyMissing, rowMedians
Attaching package: 'SummarizedExperiment'
The following object is masked from 'package:Seurat':
Assays
The following object is masked from 'package:SeuratObject':
Assays
> library(DOtools)
> library(Matrix)
Attaching package: 'Matrix'
The following object is masked from 'package:S4Vectors':
expand
> library(ggplot2)
>
> safe_dotplot <- function(...) suppressWarnings(suppressMessages(DO.Dotplot(...)))
>
> # Helper function to create consistent test data
> create_test_seurat <- function() {
+ set.seed(1234)
+ n_genes <- 200
+ n_cells <- 60
+ synthetic_genes <- paste0("SGENE", seq_len(n_genes))
+
+ # Create matrix with correct dimensions: n_genes x n_cells
+ counts_matrix <- matrix(
+ rpois(n_genes * n_cells, lambda = 1),
+ nrow = n_genes,
+ ncol = n_cells,
+ dimnames = list(synthetic_genes, paste0("Cell", seq_len(n_cells)))
+ )
+
+ # Convert to dgCMatrix
+ counts <- as(counts_matrix, "dgCMatrix")
+
+ clusters <- c(rep("C1", 30), rep("C2", 30))
+ conditions <- c(rep(c("healthy","disease"), each = 15), rep(c("healthy","disease"), each = 15))
+ origidents <- rep(c("sample1","sample2","sample3","sample4"), length.out = n_cells)
+
+ # Create some expression patterns
+ counts["SGENE10", clusters == "C1" & conditions == "healthy"] <- rpois(15, 80)
+ counts["SGENE10", clusters == "C1" & conditions == "disease"] <- rpois(15, 2)
+ counts["SGENE20", clusters == "C2" & conditions == "disease"] <- rpois(15, 70)
+ counts["SGENE20", clusters == "C2" & conditions == "healthy"] <- rpois(15, 1)
+ counts["SGENE30",] <- rpois(n_cells, 5) # Low expression gene
+ counts["SGENE40",] <- 0 # Zero expression gene
+
+ suppressWarnings({
+ seu <- CreateSeuratObject(counts = counts, assay = "RNA")
+ })
+ seu$cluster <- clusters
+ seu$condition <- conditions
+ seu$orig.ident <- origidents
+ seu <- NormalizeData(seu, verbose = FALSE)
+ return(seu)
+ }
>
> # Define PercentAbove function
> PercentAbove <- function(x, threshold = 0) {
+ if (length(x) == 0) return(0) # Handle empty vector case
+ return(length(x = x[x > threshold]) / length(x = x))
+ }
>
> # ---- Tests for branches ----
>
> test_that("SingleCellExperiment conversion works", {
+ seu <- create_test_seurat()
+
+ # Convert to SCE and test - suppress the scale.data warning
+ suppressWarnings({
+ sce <- as.SingleCellExperiment(seu)
+ })
+ p <- safe_dotplot(sce, Feature = c("SGENE10", "SGENE20"), group.by.x = "condition")
+ expect_s3_class(p, "ggplot")
+ })
Test passed 🥳
>
> test_that("error handling for invalid Feature types", {
+ seu <- create_test_seurat()
+
+ # Test non-vector, non-dataframe input
+ expect_error(DO.Dotplot(seu, Feature = list("SGENE10", "SGENE20"), group.by.x = "condition"))
+ })
Test passed 🥳
>
> test_that("cluster name detection in data frame works with various column names", {
+ seu <- create_test_seurat()
+
+ # Test different cluster column names
+ features_df_cluster <- data.frame(
+ gene = c("SGENE10", "SGENE20"),
+ cluster = c("C1", "C2"),
+ stringsAsFactors = FALSE
+ )
+ p1 <- safe_dotplot(seu, Feature = features_df_cluster, group.by.x = "condition")
+ expect_s3_class(p1, "ggplot")
+
+
+ })
Test passed 🥳
>
> test_that("gene name detection in data frame works with various column names", {
+ seu <- create_test_seurat()
+
+ # Test gene column named "feature"
+ features_df_feature <- data.frame(
+ feature = c("SGENE10", "SGENE20"),
+ cluster = c("C1", "C2"),
+ stringsAsFactors = FALSE
+ )
+ p <- safe_dotplot(seu, Feature = features_df_feature, group.by.x = "condition")
+ expect_s3_class(p, "ggplot")
+ })
Test passed 🥳
>
> test_that("error handling for invalid data frame columns", {
+ seu <- create_test_seurat()
+
+ features_df_invalid <- data.frame(
+ invalid_col1 = c("SGENE10", "SGENE20"),
+ invalid_col2 = c("C1", "C2"),
+ stringsAsFactors = FALSE
+ )
+ expect_error(safe_dotplot(seu, Feature = features_df_invalid, group.by.x = "condition"))
+ })
Test passed 🥳
>
> test_that("group.by.x only case with identical id and xaxis", {
+ seu <- create_test_seurat()
+
+ # Test case where id and xaxis become identical
+ features_df <- data.frame(
+ gene = c("SGENE10", "SGENE20", "SGENE30"),
+ cluster = c("C1", "C2", "C1"),
+ stringsAsFactors = FALSE
+ )
+
+ p <- safe_dotplot(seu, Feature = features_df, group.by.x = "condition")
+ expect_s3_class(p, "ggplot")
+ })
Test passed 🥳
>
> test_that("hide_zero functionality with complete cases", {
+ seu <- create_test_seurat()
+
+ # Test hide_zero = FALSE keeps zeros
+ df_show <- safe_dotplot(seu, Feature = "SGENE40", group.by.x = "condition",
+ hide_zero = FALSE, returnValue = TRUE)
+ # Should have entries even for zero expression
+ expect_true(nrow(df_show) > 0)
+ })
Test passed 🥳
>
> test_that("pseudobulk functionality with edge cases", {
+ seu <- create_test_seurat()
+
+ # Test pseudobulk with single group
+ p1 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", across.group.by.x = TRUE)
+ expect_s3_class(p1, "ggplot")
+
+ # Test pseudobulk with group.by.y but no group.by.y2
+ p2 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster",
+ across.group.by.y = TRUE)
+ expect_s3_class(p2, "ggplot")
+ })
Test passed 😀
>
> test_that("expression scaling and transformation combinations", {
+ seu <- create_test_seurat()
+
+ # Test all combinations of scale_gene and log1p_nUMI
+ combinations <- list(
+ c(FALSE, FALSE),
+ c(FALSE, TRUE),
+ c(TRUE, FALSE),
+ c(TRUE, TRUE)
+ )
+
+ for (combo in combinations) {
+ scale_gene <- combo[1]
+ log1p_nUMI <- combo[2]
+
+ p <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition",
+ scale_gene = scale_gene,
+ log1p_nUMI = log1p_nUMI)
+ expect_s3_class(p, "ggplot")
+ }
+ })
Test passed 🥳
>
> test_that("aesthetic mapping selection logic", {
+ seu <- create_test_seurat()
+
+ # Test case where id and xaxis are identical with vector Feature
+ p1 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"), group.by.x = "condition")
+ expect_s3_class(p1, "ggplot")
+
+ # Test case where id and xaxis are identical with dataframe Feature
+ features_df <- data.frame(
+ gene = c("SGENE10", "SGENE20"),
+ cluster = c("C1", "C2"),
+ stringsAsFactors = FALSE
+ )
+ p2 <- safe_dotplot(seu, Feature = features_df, group.by.x = "condition")
+ expect_s3_class(p2, "ggplot")
+
+ # Test case with group.by.y (different id and xaxis)
+ p3 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster")
+ expect_s3_class(p3, "ggplot")
+ })
Test passed 😀
>
> test_that("color scale branches", {
+ seu <- create_test_seurat()
+
+ # Test the main branch with 2 colors (default)
+ p1 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"), group.by.x = "condition")
+ expect_s3_class(p1, "ggplot")
+ })
Test passed 🥳
>
> test_that("facetting and plot type branches", {
+ seu <- create_test_seurat()
+
+ # Test across.group.by.x branch
+ p1 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", across.group.by.x = TRUE)
+ expect_s3_class(p1, "ggplot")
+
+ # Test across.group.by.y branch
+ p2 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster",
+ across.group.by.y = TRUE)
+ expect_s3_class(p2, "ggplot")
+
+ # Test identical id/xaxis branch with dataframe
+ features_df <- data.frame(
+ gene = c("SGENE10", "SGENE20"),
+ cluster = c("C1", "C2"),
+ stringsAsFactors = FALSE
+ )
+ p3 <- safe_dotplot(seu, Feature = features_df, group.by.x = "condition")
+ expect_s3_class(p3, "ggplot")
+
+ # Test default branch (group.by.y case)
+ p4 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster")
+ expect_s3_class(p4, "ggplot")
+ })
Test passed 😀
>
> test_that("annotation_x with coord_flip scenario", {
+ seu <- create_test_seurat()
+
+ features_df <- data.frame(
+ gene = c("SGENE10", "SGENE20"),
+ cluster = c("C1", "C2"),
+ stringsAsFactors = FALSE
+ )
+
+ # Test without expecting warning
+ p <- safe_dotplot(seu, Feature = features_df, group.by.x = "condition",
+ annotation_x = TRUE, coord_flip = TRUE)
+ expect_s3_class(p, "ggplot")
+ })
Test passed 🥳
>
> test_that("statistical significance star plotting", {
+ seu <- create_test_seurat()
+
+ # Test with stats_x = TRUE
+ p1 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster",
+ stats_x = TRUE)
+ expect_s3_class(p1, "ggplot")
+
+ # Test with stats_y = TRUE
+ p2 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster",
+ stats_y = TRUE)
+ expect_s3_class(p2, "ggplot")
+
+ # Test with both stats TRUE
+ p3 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster",
+ stats_x = TRUE, stats_y = TRUE)
+ expect_s3_class(p3, "ggplot")
+ })
Test passed 😀
>
> test_that("scale_size_continuous with different scenarios", {
+ seu <- create_test_seurat()
+
+ # Test with normal data
+ p1 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"), group.by.x = "condition")
+ expect_s3_class(p1, "ggplot")
+
+ # Test with single group (different size scaling branch)
+ features_df <- data.frame(
+ gene = c("SGENE10", "SGENE20"),
+ cluster = c("C1", "C2"),
+ stringsAsFactors = FALSE
+ )
+ p2 <- safe_dotplot(seu, Feature = features_df, group.by.x = "condition")
+ expect_s3_class(p2, "ggplot")
+ })
Test passed 🥳
>
> test_that("statistical tests with genes that have results", {
+ seu <- create_test_seurat()
+
+ # Use genes that definitely have expression and will produce statistical results
+ p <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster",
+ stats_x = TRUE)
+ expect_s3_class(p, "ggplot")
+ })
Test passed 😀
>
> test_that("factor level ordering with sort_x", {
+ seu <- create_test_seurat()
+
+ # Test sort_x with group.by.y
+ p1 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster",
+ sort_x = c("disease", "healthy"))
+ expect_s3_class(p1, "ggplot")
+
+ # Test sort_x without group.by.y
+ p2 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", sort_x = c("SGENE20", "SGENE10"))
+ expect_s3_class(p2, "ggplot")
+ })
Test passed 😀
>
> test_that("pseudobulk level ordering", {
+ seu <- create_test_seurat()
+
+ # Test pseudobulk level ordering for x-axis
+ p1 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", across.group.by.x = TRUE)
+ expect_s3_class(p1, "ggplot")
+
+ # Test pseudobulk level ordering for y-axis without group.by.y2
+ p2 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster",
+ across.group.by.y = TRUE)
+ expect_s3_class(p2, "ggplot")
+
+ # Test pseudobulk level ordering for y-axis with group.by.y2
+ p3 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster",
+ group.by.y2 = "orig.ident", across.group.by.y = TRUE)
+ expect_s3_class(p3, "ggplot")
+ })
Test passed 😀
>
> test_that("edge cases with proper data preparation", {
+ # Test with very small dataset
+ set.seed(123)
+ tiny_counts <- matrix(rpois(5 * 10, lambda = 1), nrow = 5, ncol = 10,
+ dimnames = list(paste0("G", 1:5), paste0("C", 1:10)))
+
+ # Convert to dgCMatrix to avoid warning
+ tiny_counts <- as(tiny_counts, "dgCMatrix")
+
+ suppressWarnings({
+ tiny_seu <- CreateSeuratObject(counts = tiny_counts)
+ })
+ tiny_seu$group <- rep(c("A", "B"), each = 5)
+ tiny_seu <- NormalizeData(tiny_seu, verbose = FALSE) # Add normalization
+
+ p <- safe_dotplot(tiny_seu, Feature = c("G1", "G2"), group.by.x = "group")
+ expect_s3_class(p, "ggplot")
+ })
Test passed 🌈
>
> test_that("error conditions for statistical tests", {
+ seu <- create_test_seurat()
+
+ # Test that no error occurs with valid inputs
+ expect_silent(safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", stats_x = FALSE, stats_y = FALSE))
+ })
Test passed 🥳
>
> test_that("guide customization layers", {
+ seu <- create_test_seurat()
+
+ # Test that guide layers are properly applied
+ p <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"), group.by.x = "condition")
+
+ # Check that the plot has guides
+ expect_s3_class(p, "ggplot")
+ })
Test passed 🥳
>
> test_that("PercentAbove function edge cases", {
+ # Test PercentAbove with various inputs
+ expect_equal(PercentAbove(c(0, 0, 0), threshold = 0), 0)
+ expect_equal(PercentAbove(c(1, 2, 3), threshold = 0), 1)
+ expect_equal(PercentAbove(c(1, 2, 3), threshold = 2), 1/3)
+ expect_equal(PercentAbove(numeric(0), threshold = 0), 0) # Handle empty vector
+ })
Test passed 😸
>
> test_that("data frame manipulation with dplyr functions", {
+ seu <- create_test_seurat()
+
+ # Test that the dplyr manipulations work correctly
+ df <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster",
+ across.group.by.y = TRUE, returnValue = TRUE)
+
+ expect_true(is.data.frame(df))
+ expect_true(all(c("gene", "id", "xaxis", "avg.exp", "pct.exp") %in% colnames(df)))
+ })
Test passed 😀
>
> test_that("conditional factor level setting", {
+ seu <- create_test_seurat()
+
+ # Test with annotation_x_rev = TRUE
+ features_df <- data.frame(
+ gene = c("SGENE10", "SGENE20", "SGENE30"),
+ cluster = c("C1", "C2", "C1"),
+ stringsAsFactors = FALSE
+ )
+
+ p <- safe_dotplot(seu, Feature = features_df, group.by.x = "condition",
+ annotation_x = TRUE, annotation_x_rev = TRUE)
+ expect_s3_class(p, "ggplot")
+ })
Test passed 🥳
>
> # ---- Integration tests with complex scenarios ----
>
> test_that("complex multi-parameter scenarios without conflicting options", {
+ seu <- create_test_seurat()
+
+ features_df <- data.frame(
+ gene = c("SGENE10", "SGENE20", "SGENE30"),
+ cluster = c("C1", "C2", "C1"),
+ stringsAsFactors = FALSE
+ )
+
+ # Test complex scenario but don't set both pseudobulk options
+ p1 <- safe_dotplot(seu, Feature = features_df,
+ group.by.x = "condition",
+ group.by.y = "cluster",
+ across.group.by.y = TRUE, # Only one pseudobulk option
+ scale_gene = TRUE,
+ log1p_nUMI = FALSE,
+ stats_x = TRUE,
+ stats_y = TRUE,
+ annotation_x = TRUE,
+ coord_flip = TRUE,
+ hide_zero = FALSE,
+ dot.size = c(2, 8),
+ point_stroke = 0.5,
+ limits_colorscale = c(0, 10),
+ sig_size = 8,
+ nudge_x = 0.5,
+ nudge_y = 0.5)
+ expect_s3_class(p1, "ggplot")
+
+ # Test another complex scenario with the other pseudobulk option
+ p2 <- safe_dotplot(seu, Feature = features_df,
+ group.by.x = "condition",
+ group.by.y = "cluster",
+ across.group.by.x = TRUE, # Only one pseudobulk option
+ scale_gene = FALSE,
+ log1p_nUMI = TRUE,
+ stats_x = FALSE, # Disable stats to avoid subset issues
+ stats_y = FALSE, # Disable stats to avoid subset issues
+ annotation_x = FALSE,
+ coord_flip = FALSE,
+ hide_zero = TRUE,
+ dot.size = c(1, 6),
+ point_stroke = 0.2)
+ expect_s3_class(p2, "ggplot")
+ })
Test passed 😀
>
> test_that("complex scenario with group.by.y2 but careful statistical testing", {
+ seu <- create_test_seurat()
+
+ features_df <- data.frame(
+ gene = c("SGENE10", "SGENE20"),
+ cluster = c("C1", "C2"),
+ stringsAsFactors = FALSE
+ )
+
+ # Use group.by.y2 but avoid statistical tests that cause subset issues
+ p <- safe_dotplot(seu, Feature = features_df,
+ group.by.x = "condition",
+ group.by.y = "cluster",
+ group.by.y2 = "orig.ident",
+ across.group.by.y = TRUE,
+ stats_x = FALSE, # Disable to avoid "No cells found" error
+ stats_y = FALSE, # Disable to avoid "No cells found" error
+ scale_gene = TRUE,
+ log1p_nUMI = TRUE)
+ expect_s3_class(p, "ggplot")
+ })
Test passed 🥳
>
> # ---- Additional edge case tests ----
>
> test_that("empty gene list handling", {
+ seu <- create_test_seurat()
+
+ # Test with empty gene list (should error)
+ expect_error(safe_dotplot(seu, Feature = character(0), group.by.x = "condition"))
+ })
Test passed 🥳
>
> test_that("single cell edge cases", {
+ seu <- create_test_seurat()
+
+ # Test with single gene, single group
+ p <- safe_dotplot(seu, Feature = "SGENE10", group.by.x = "condition")
+ expect_s3_class(p, "ggplot")
+ })
Test passed 🥳
>
> test_that("metadata column edge cases", {
+ seu <- create_test_seurat()
+
+ # Test with numeric metadata
+ seu$numeric_meta <- as.numeric(factor(seu$condition))
+ p <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"), group.by.x = "numeric_meta")
+ expect_s3_class(p, "ggplot")
+ })
Test passed 🥳
>
> test_that("plot margin and theme parameters", {
+ seu <- create_test_seurat()
+
+ # Test different margin settings
+ p <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", plot.margin = c(0.5, 0.5, 0.5, 0.5))
+ expect_s3_class(p, "ggplot")
+ })
Test passed 🥳
>
> test_that("various parameter combinations that should work", {
+ seu <- create_test_seurat()
+
+ # Test different combinations of parameters that are less likely to cause errors
+ test_combinations <- list(
+ list(group.by.x = "condition", dot.size = c(1, 3)),
+ list(group.by.x = "condition", point_stroke = 0.1),
+ list(group.by.x = "condition", midpoint = 0.8),
+ list(group.by.x = "condition", limits_colorscale = c(0, 2)),
+ list(group.by.x = "condition", sig_size = 4, nudge_x = 0.1, nudge_y = 0.1)
+ )
+
+ for (params in test_combinations) {
+ p <- do.call(safe_dotplot, c(list(sce_object = seu, Feature = c("SGENE10", "SGENE20")), params))
+ expect_s3_class(p, "ggplot")
+ }
+ })
Test passed 🥳
>
> test_that("data frame return structure verification", {
+ seu <- create_test_seurat()
+
+ # Test various returnValue scenarios
+ df1 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", returnValue = TRUE)
+ expect_true(is.data.frame(df1))
+ expect_true(nrow(df1) > 0)
+
+ df2 <- safe_dotplot(seu, Feature = c("SGENE10", "SGENE20"),
+ group.by.x = "condition", group.by.y = "cluster",
+ returnValue = TRUE)
+ expect_true(is.data.frame(df2))
+ expect_true(nrow(df2) > 0)
+ })
Test passed 😀
>
>
> proc.time()
user system elapsed
49.946 1.214 51.152
DOtools.Rcheck/tests/test-DO.MultiDGE.Rout
R version 4.5.1 Patched (2025-08-23 r88802) -- "Great Square Root"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> library(testthat)
> library(DOtools)
> library(Seurat)
Loading required package: SeuratObject
Loading required package: sp
Attaching package: 'SeuratObject'
The following objects are masked from 'package:base':
intersect, t
> library(SingleCellExperiment)
Loading required package: SummarizedExperiment
Loading required package: MatrixGenerics
Loading required package: matrixStats
Attaching package: 'MatrixGenerics'
The following objects are masked from 'package:matrixStats':
colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse,
colCounts, colCummaxs, colCummins, colCumprods, colCumsums,
colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs,
colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats,
colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
colWeightedMeans, colWeightedMedians, colWeightedSds,
colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins,
rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars,
rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
rowWeightedSds, rowWeightedVars
Loading required package: GenomicRanges
Loading required package: stats4
Loading required package: BiocGenerics
Loading required package: generics
Attaching package: 'generics'
The following objects are masked from 'package:base':
as.difftime, as.factor, as.ordered, intersect, is.element, setdiff,
setequal, union
Attaching package: 'BiocGenerics'
The following objects are masked from 'package:stats':
IQR, mad, sd, var, xtabs
The following objects are masked from 'package:base':
Filter, Find, Map, Position, Reduce, anyDuplicated, aperm, append,
as.data.frame, basename, cbind, colnames, dirname, do.call,
duplicated, eval, evalq, get, grep, grepl, is.unsorted, lapply,
mapply, match, mget, order, paste, pmax, pmax.int, pmin, pmin.int,
rank, rbind, rownames, sapply, saveRDS, table, tapply, unique,
unsplit, which.max, which.min
Loading required package: S4Vectors
Attaching package: 'S4Vectors'
The following object is masked from 'package:utils':
findMatches
The following objects are masked from 'package:base':
I, expand.grid, unname
Loading required package: IRanges
Attaching package: 'IRanges'
The following object is masked from 'package:sp':
%over%
Loading required package: Seqinfo
Loading required package: Biobase
Welcome to Bioconductor
Vignettes contain introductory material; view with
'browseVignettes()'. To cite Bioconductor, see
'citation("Biobase")', and for packages 'citation("pkgname")'.
Attaching package: 'Biobase'
The following object is masked from 'package:MatrixGenerics':
rowMedians
The following objects are masked from 'package:matrixStats':
anyMissing, rowMedians
Attaching package: 'SummarizedExperiment'
The following object is masked from 'package:Seurat':
Assays
The following object is masked from 'package:SeuratObject':
Assays
>
> test_that("DO.MultiDGE returns merged dataframe with SC and PB results", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expect_true(all(c("gene", "celltype", "condition") %in% colnames(result)))
+ expect_true(any(grepl("SC_wilcox", colnames(result))))
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE works with SingleCellExperiment input", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expect_true(all(c("gene", "celltype", "condition") %in% colnames(result)))
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE stops when ident_ctrl not found", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ expect_error(
+ DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "nonexistent_condition"
+ ),
+ "was not found in meta data"
+ )
+ })
── Warning: DO.MultiDGE stops when ident_ctrl not found ────────────────────────
2 arguments not used by format '%s was not found in meta data under the specified '
Backtrace:
▆
1. ├─testthat::expect_error(...)
2. │ └─testthat:::quasi_capture(...)
3. │ ├─testthat (local) .capture(...)
4. │ │ └─base::withCallingHandlers(...)
5. │ └─rlang::eval_bare(quo_get_expr(.quo), quo_get_env(.quo))
6. └─DOtools::DO.MultiDGE(...)
7. ├─base::stop(...)
8. └─base::sprintf(...)
>
> test_that("DO.MultiDGE works with different method_sc", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ # Test with different methods
+ methods_to_test <- c("wilcox", "t")
+
+ for(method in methods_to_test) {
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = method,
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expect_true(any(grepl(paste0("SC_", method), colnames(result))))
+ }
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE handles min_pct and logfc_threshold parameters", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy",
+ min_pct = 0.1,
+ logfc_threshold = 0.25
+ )
+
+ expect_true(all(c("gene", "celltype", "condition") %in% colnames(result)))
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE works with only_pos = TRUE", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy",
+ only_pos = TRUE
+ )
+
+ expect_true(all(c("gene", "celltype", "condition") %in% colnames(result)))
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE handles cell count filtering", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy",
+ min_cells_group = 5
+ )
+
+ expect_s3_class(result, "data.frame")
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE works with different assays", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ seurat_obj <- as.Seurat(sce_data)
+
+ result <- DO.MultiDGE(
+ sce_object = seurat_obj,
+ assay = "RNA",
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expect_true(all(c("gene", "celltype", "condition") %in% colnames(result)))
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE returns proper column structure", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expected_base_cols <- c("gene", "pct.1", "pct.2", "celltype", "condition")
+ expect_true(all(expected_base_cols %in% colnames(result)))
+ expect_true(any(grepl("SC_wilcox", colnames(result))))
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE works with additional FindMarkers parameters", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy",
+ min.cells.feature = 3,
+ verbose = FALSE
+ )
+
+ expect_s3_class(result, "data.frame")
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE handles different group_by columns", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ if ("condition" %in% colnames(sce_data@colData)) {
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ group_by = "condition",
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expect_s3_class(result, "data.frame")
+ }
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
>
> test_that("DO.MultiDGE handles the internal .suppressDeprecationWarnings", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expect_s3_class(result, "data.frame")
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE handles the PB_ident creation and usage", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expect_s3_class(result, "data.frame")
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE column renaming works correctly", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ sc_cols <- grep("SC_", colnames(result), value = TRUE)
+ expect_true(length(sc_cols) > 0)
+ expect_true(all(c("gene", "celltype", "condition") %in% colnames(result)))
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE handles the left join operation correctly", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expect_s3_class(result, "data.frame")
+
+ if (nrow(result) > 0) {
+ expect_false(any(is.na(result$gene)))
+ expect_false(any(is.na(result$celltype)))
+ expect_false(any(is.na(result$condition)))
+ }
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE logging doesn't interfere with execution", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expect_s3_class(result, "data.frame")
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE works with minimal parameters", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expect_s3_class(result, "data.frame")
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE pseudo-bulk aggregation works", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expect_s3_class(result, "data.frame")
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> # TESTS FOR SPECIFIC FUNCTIONAL PATHS THAT ARE SAFE
>
> test_that("DO.MultiDGE handles the AggregateExpression pathway", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ # This tests the pseudo-bulk creation without triggering empty results
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident", # This is critical for aggregation
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ expect_s3_class(result, "data.frame")
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE handles annotation name consistency check", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ # This tests the annotation name consistency logic
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation", # Use standard annotation column
+ ident_ctrl = "healthy"
+ )
+
+ expect_s3_class(result, "data.frame")
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE handles the comparison loop structure", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ # Test with a control condition that exists
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ # handle the comparison loops without error
+ expect_s3_class(result, "data.frame")
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE handles the cell count validation", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ # Test with reasonable min_cells_group
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy",
+ min_cells_group = 3 # Default value
+ )
+
+ expect_s3_class(result, "data.frame")
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> test_that("DO.MultiDGE handles the result collection and merging", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ # Test the final merged result structure
+ expect_s3_class(result, "data.frame")
+ if (nrow(result) > 0) {
+ # key columns for the merge
+ expect_true(all(c("gene", "celltype", "condition") %in% colnames(result)))
+ }
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> # TEST FOR THE DESeq2 PSEUDO-BULK PATHWAY
> test_that("DO.MultiDGE DESeq2 pseudo-bulk analysis completes", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident", # Required for pseudo-bulk
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ # should complete the DESeq2 pseudo-bulk pathway
+ expect_s3_class(result, "data.frame")
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> # TEST FOR THE SINGLE-CELL ANALYSIS PATHWAY
> test_that("DO.MultiDGE single-cell analysis completes", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = "wilcox",
+ annotation_col = "annotation",
+ ident_ctrl = "healthy"
+ )
+
+ # Should complete single-cell analysis pathway
+ expect_s3_class(result, "data.frame")
+ expect_true(any(grepl("SC_wilcox", colnames(result))))
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> # COMPREHENSIVE TEST COVERING MULTIPLE PARAMETERS
> test_that("DO.MultiDGE comprehensive parameter test", {
+ sce_data <- readRDS(system.file("extdata", "sce_data.rds", package = "DOtools"))
+
+ # Test multiple parameter combinations that are known to work
+ test_combinations <- list(
+ list(method_sc = "wilcox", only_pos = FALSE),
+ list(method_sc = "wilcox", only_pos = TRUE),
+ list(method_sc = "t", only_pos = FALSE)
+ )
+
+ for (params in test_combinations) {
+ result <- DO.MultiDGE(
+ sce_object = sce_data,
+ sample_col = "orig.ident",
+ method_sc = params$method_sc,
+ annotation_col = "annotation",
+ ident_ctrl = "healthy",
+ only_pos = params$only_pos
+ )
+
+ expect_s3_class(result, "data.frame")
+ if (nrow(result) > 0) {
+ expect_true(any(grepl(paste0("SC_", params$method_sc), colnames(result))))
+ }
+ }
+ })
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
|
| | 0%
|
|====== | 9%
|
|============= | 18%
|
|=================== | 27%
|
|========================= | 36%
|
|================================ | 45%
|
|====================================== | 55%
|
|============================================= | 64%
|
|=================================================== | 73%
|
|========================================================= | 82%
|
|================================================================ | 91%
|
|======================================================================| 100%
|
| | 0%
|
|======================================================================| 100%
Test passed 😀
>
> proc.time()
user system elapsed
173.613 1.561 175.166
DOtools.Rcheck/tests/test-DO.scVI.Rout.fail
R version 4.5.1 Patched (2025-08-23 r88802) -- "Great Square Root"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> library(testthat)
> library(mockery)
> library(Seurat)
Loading required package: SeuratObject
Loading required package: sp
Attaching package: 'SeuratObject'
The following objects are masked from 'package:base':
intersect, t
> library(SingleCellExperiment)
Loading required package: SummarizedExperiment
Loading required package: MatrixGenerics
Loading required package: matrixStats
Attaching package: 'MatrixGenerics'
The following objects are masked from 'package:matrixStats':
colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse,
colCounts, colCummaxs, colCummins, colCumprods, colCumsums,
colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs,
colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats,
colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
colWeightedMeans, colWeightedMedians, colWeightedSds,
colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins,
rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars,
rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
rowWeightedSds, rowWeightedVars
Loading required package: GenomicRanges
Loading required package: stats4
Loading required package: BiocGenerics
Loading required package: generics
Attaching package: 'generics'
The following objects are masked from 'package:base':
as.difftime, as.factor, as.ordered, intersect, is.element, setdiff,
setequal, union
Attaching package: 'BiocGenerics'
The following objects are masked from 'package:stats':
IQR, mad, sd, var, xtabs
The following objects are masked from 'package:base':
Filter, Find, Map, Position, Reduce, anyDuplicated, aperm, append,
as.data.frame, basename, cbind, colnames, dirname, do.call,
duplicated, eval, evalq, get, grep, grepl, is.unsorted, lapply,
mapply, match, mget, order, paste, pmax, pmax.int, pmin, pmin.int,
rank, rbind, rownames, sapply, saveRDS, table, tapply, unique,
unsplit, which.max, which.min
Loading required package: S4Vectors
Attaching package: 'S4Vectors'
The following object is masked from 'package:utils':
findMatches
The following objects are masked from 'package:base':
I, expand.grid, unname
Loading required package: IRanges
Attaching package: 'IRanges'
The following object is masked from 'package:sp':
%over%
Loading required package: Seqinfo
Loading required package: Biobase
Welcome to Bioconductor
Vignettes contain introductory material; view with
'browseVignettes()'. To cite Bioconductor, see
'citation("Biobase")', and for packages 'citation("pkgname")'.
Attaching package: 'Biobase'
The following object is masked from 'package:MatrixGenerics':
rowMedians
The following objects are masked from 'package:matrixStats':
anyMissing, rowMedians
Attaching package: 'SummarizedExperiment'
The following object is masked from 'package:Seurat':
Assays
The following object is masked from 'package:SeuratObject':
Assays
> library(Matrix)
Attaching package: 'Matrix'
The following object is masked from 'package:S4Vectors':
expand
>
> SCE_obj <- readRDS(
+ system.file("extdata",
+ "sce_data.rds",
+ package = "DOtools")
+ )
>
> # ------------------------------
> # Improved Helper functions for test objects
> # ------------------------------
> setup_minimal_seurat <- function() {
+ set.seed(42)
+ counts_matrix <- as(
+ matrix(rpois(20*10, lambda = 10), nrow = 20, ncol = 10), "dgCMatrix"
+ )
+ rownames(counts_matrix) <- paste0("Gene", 1:20)
+ colnames(counts_matrix) <- paste0("Cell", 1:10)
+
+ seurat_obj <- CreateSeuratObject(counts = counts_matrix)
+ seurat_obj <- NormalizeData(seurat_obj, verbose = FALSE)
+ seurat_obj <- ScaleData(seurat_obj, verbose = FALSE)
+
+ seurat_obj$orig.ident <- rep(c("A", "B"), each = 5)
+ VariableFeatures(seurat_obj) <- rownames(seurat_obj)[1:10]
+ seurat_obj
+ }
>
> setup_minimal_sce <- function() {
+ set.seed(42)
+ counts_matrix <- as(
+ matrix(rpois(20*10, lambda = 10), nrow = 20, ncol = 10), "dgCMatrix"
+ )
+ rownames(counts_matrix) <- paste0("Gene", 1:20)
+ colnames(counts_matrix) <- paste0("Cell", 1:10)
+
+ sce <- SingleCellExperiment(
+ assays = list(
+ counts = counts_matrix,
+ logcounts = log1p(counts_matrix)
+ )
+ )
+ colData(sce)$orig.ident <- rep(c("A", "B"), each = 5)
+ sce
+ }
>
> # Global mock for basiliskRun to avoid Python execution
> mock_basilisk_run <- function(env, fun, args) {
+ # Return a simple matrix as the scVI embedding
+ embedding <- matrix(
+ runif(ncol(args$sce_object) * 5), nrow = ncol(args$sce_object), ncol = 5
+ )
+ rownames(embedding) <- colnames(args$sce_object)
+ embedding
+ }
>
> # ------------------------------
> # Enhanced Tests with Real Data
> # ------------------------------
>
> test_that("DO.scVI works with real SCE data", {
+ skip_if_not(exists("SCE_obj"), "Real SCE data not available")
+
+ # Ensure the object has the required structure
+ expect_s4_class(SCE_obj, "SingleCellExperiment")
+ expect_true("counts" %in% assayNames(SCE_obj))
+
+ # Add batch information if not present
+ if (!"orig.ident" %in% colnames(colData(SCE_obj))) {
+ colData(SCE_obj)$orig.ident <- rep(c("A", "B"), length.out = ncol(SCE_obj))
+ }
+
+ mock_as_seurat <- function(x) {
+ # Create a minimal Seurat object that mimics conversion from real SCE
+ counts_matrix <- assay(x, "counts")
+ seurat_obj <- CreateSeuratObject(counts = counts_matrix)
+ seurat_obj <- NormalizeData(seurat_obj, verbose = FALSE)
+ VariableFeatures(seurat_obj) <-
+ rownames(seurat_obj)[1:min(2000, nrow(seurat_obj))]
+ seurat_obj$orig.ident <- colData(x)$orig.ident
+ seurat_obj
+ }
+
+ testthat::with_mocked_bindings(
+ basiliskRun = mock_basilisk_run,
+ code = {
+ mockery::stub(DO.scVI, "as.Seurat", mock_as_seurat)
+ result <- DO.scVI(SCE_obj, batch_key = "orig.ident")
+ },
+ .package = "basilisk"
+ )
+
+ expect_s4_class(result, "SingleCellExperiment")
+ expect_true("scVI" %in% reducedDimNames(result))
+ })
── Error: DO.scVI works with real SCE data ─────────────────────────────────────
Error in `eval(code, test_env)`: object 'DO.scVI' not found
Backtrace:
▆
1. ├─testthat::with_mocked_bindings(...)
2. └─mockery::stub(DO.scVI, "as.Seurat", mock_as_seurat)
3. └─mockery:::build_function_tree(test_env, where, where_name, depth)
Error:
! Test failed
Backtrace:
▆
1. ├─testthat::test_that(...)
2. │ └─withr (local) `<fn>`()
3. └─reporter$stop_if_needed()
4. └─rlang::abort("Test failed", call = NULL)
Execution halted
DOtools.Rcheck/tests/test-DO.SplitBarGSEA.Rout.fail
R version 4.5.1 Patched (2025-08-23 r88802) -- "Great Square Root"
Copyright (C) 2025 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> library(testthat)
> library(DOtools)
>
> test_that("DO.SplitBarGSEA executes successfully on mock GSEA data", {
+ set.seed(123)
+
+ # Create a mock GSEA data frame with proper structure
+ df_GSEA <- data.frame(
+ Term = paste0("GO_Term_", 1:20),
+ Combined.Score = runif(20, 1, 10),
+ State = rep(c("enriched", "depleted"), 10),
+ celltype = rep(c("CT1", "CT2"), each = 10),
+ stringsAsFactors = FALSE
+ )
+
+ # Test that the function runs without errors
+ expect_error(
+ suppressMessages({
+ DO.SplitBarGSEA(
+ df_GSEA = df_GSEA,
+ term_col = "Term",
+ col_split = "Combined.Score",
+ cond_col = "State",
+ pos_cond = "enriched",
+ cutoff = 30,
+ log10_transform = FALSE,
+ figsize = c(8,6),
+ topN = 5,
+ colors_pairs = c("red", "blue"),
+ alpha_colors = 0.5,
+ path = NULL,
+ spacing = 5,
+ txt_size = 10,
+ filename = "test.svg",
+ title = "Test Split Bar Plot",
+ showP = FALSE,
+ celltype = "all"
+ )
+ }),
+ NA # Expect no error
+ )
+ })
── Failure: DO.SplitBarGSEA executes successfully on mock GSEA data ────────────
`suppressMessages(...)` threw an error.
Message: Cannot open lock file: Permission denied
Class: simpleError/error/condition
Backtrace:
▆
1. ├─testthat::expect_error(...)
2. │ └─testthat:::quasi_capture(...)
3. │ ├─testthat (local) .capture(...)
4. │ │ └─base::withCallingHandlers(...)
5. │ └─rlang::eval_bare(quo_get_expr(.quo), quo_get_env(.quo))
6. ├─base::suppressMessages(...)
7. │ └─base::withCallingHandlers(...)
8. └─DOtools::DO.SplitBarGSEA(...)
9. └─basilisk::basiliskRun(...)
10. └─basilisk::basiliskStart(...)
11. └─basilisk::obtainEnvironmentPath(env)
12. └─dir.expiry::lockDirectory(envdir, exclusive = !file.exists(envpath))
13. └─filelock::lock(plock, exclusive = FALSE)
Error:
! Test failed
Backtrace:
▆
1. ├─testthat::test_that(...)
2. │ └─withr (local) `<fn>`()
3. └─reporter$stop_if_needed()
4. └─rlang::abort("Test failed", call = NULL)
Execution halted
##############################################################################
##############################################################################
###
### Running command:
###
### /home/biocbuild/bbs-3.22-bioc/R/bin/R CMD check --test-dir=longtests --no-stop-on-test-error --no-codoc --no-examples --no-manual --ignore-vignettes --check-subdirs=no DOtools_0.99.11.tar.gz
###
##############################################################################
##############################################################################
* using log directory ‘/home/biocbuild/bbs-3.22-bioc-longtests/meat/DOtools.Rcheck’
* using R version 4.5.1 Patched (2025-08-23 r88802)
* using platform: x86_64-pc-linux-gnu
* R was compiled by
gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
GNU Fortran (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
* running under: Ubuntu 24.04.3 LTS
* using session charset: UTF-8
* using options ‘--no-codoc --no-examples --no-manual --ignore-vignettes --no-stop-on-test-error’
* checking for file ‘DOtools/DESCRIPTION’ ... OK
* this is package ‘DOtools’ version ‘0.99.11’
* package encoding: UTF-8
* checking package namespace information ... OK
* checking package dependencies ... INFO
Imports includes 35 non-default packages.
Importing from so many packages makes the package vulnerable to any of
them becoming unavailable. Move as many as possible to Suggests and
use conditionally.
* checking if this is a source package ... OK
* checking if there is a namespace ... OK
* checking for hidden files and directories ... NOTE
Found the following hidden files and directories:
.BBSoptions
These were most likely included in error. See section ‘Package
structure’ in the ‘Writing R Extensions’ manual.
* checking for portable file names ... WARNING
Found the following files with non-portable file names:
vignettes/DOtools_files/figure-html/Clustering and UMAP-1.png
vignettes/DOtools_files/figure-html/Clustering and UMAP-2.png
vignettes/DOtools_files/figure-html/Manual annotation-1.png
vignettes/DOtools_files/figure-html/Manual annotation-2.png
vignettes/DOtools_files/figure-html/cell populations-1.png
These are not fully portable file names.
See section ‘Package structure’ in the ‘Writing R Extensions’ manual.
* checking for sufficient/correct file permissions ... OK
* checking whether package ‘DOtools’ can be installed ... OK
* checking installed package size ... OK
* checking package directory ... OK
* checking DESCRIPTION meta-information ... OK
* checking top-level files ... OK
* checking for left-over files ... OK
* checking index information ... OK
* checking package subdirectories ... OK
* checking code files for non-ASCII characters ... OK
* checking R files for syntax errors ... OK
* checking whether the package can be loaded ... OK
* checking whether the package can be loaded with stated dependencies ... OK
* checking whether the package can be unloaded cleanly ... OK
* checking whether the namespace can be loaded with stated dependencies ... OK
* checking whether the namespace can be unloaded cleanly ... OK
* checking loading without being on the library search path ... OK
* checking whether startup messages can be suppressed ... OK
* checking dependencies in R code ... OK
* checking S3 generic/method consistency ... OK
* checking replacement functions ... OK
* checking foreign function calls ... OK
* checking R code for possible problems ... OK
* checking Rd files ... OK
* checking Rd metadata ... OK
* checking Rd cross-references ... OK
* checking for missing documentation entries ... OK
* checking for code/documentation mismatches ... SKIPPED
* checking Rd \usage sections ... OK
* checking Rd contents ... OK
* checking for unstated dependencies in examples ... OK
* checking line endings in shell scripts ... OK
* checking files in ‘vignettes’ ... SKIPPED
* checking examples ... SKIPPED
* checking for unstated dependencies in ‘longtests’ ... OK
* checking tests in ‘longtests’ ...
Running ‘test-DO.BarplotWilcox.R’
Running ‘test-DO.Dotplot.R’
Running ‘test-DO.MultiDGE.R’
Running ‘test-DO.SplitBarGSEA.R’
Running ‘test-DO.scVI.R’
ERROR
Running the tests in ‘longtests/test-DO.BarplotWilcox.R’ failed.
Last 13 lines of output:
**************************************************|
── Error: DO.BarplotWilcox returns ggplot and list correctly ───────────────────
Error in `DO.BarplotWilcox(sce_object = seurat_obj, Feature = "gene1",
ListTest = list(c("A", "B")), returnValues = FALSE, ctrl.condition = "A",
group.by = "condition")`: could not find function "DO.BarplotWilcox"
Error:
! Test failed
Backtrace:
▆
1. ├─testthat::test_that(...)
2. │ └─withr (local) `<fn>`()
3. └─reporter$stop_if_needed()
4. └─rlang::abort("Test failed", call = NULL)
Execution halted
Running the tests in ‘longtests/test-DO.SplitBarGSEA.R’ failed.
Last 13 lines of output:
9. └─basilisk::basiliskRun(...)
10. └─basilisk::basiliskStart(...)
11. └─basilisk::obtainEnvironmentPath(env)
12. └─dir.expiry::lockDirectory(envdir, exclusive = !file.exists(envpath))
13. └─filelock::lock(plock, exclusive = FALSE)
Error:
! Test failed
Backtrace:
▆
1. ├─testthat::test_that(...)
2. │ └─withr (local) `<fn>`()
3. └─reporter$stop_if_needed()
4. └─rlang::abort("Test failed", call = NULL)
Execution halted
Running the tests in ‘longtests/test-DO.scVI.R’ failed.
Last 13 lines of output:
Backtrace:
▆
1. ├─testthat::with_mocked_bindings(...)
2. └─mockery::stub(DO.scVI, "as.Seurat", mock_as_seurat)
3. └─mockery:::build_function_tree(test_env, where, where_name, depth)
Error:
! Test failed
Backtrace:
▆
1. ├─testthat::test_that(...)
2. │ └─withr (local) `<fn>`()
3. └─reporter$stop_if_needed()
4. └─rlang::abort("Test failed", call = NULL)
Execution halted
* DONE
Status: 1 ERROR, 1 WARNING, 1 NOTE
See
‘/home/biocbuild/bbs-3.22-bioc-longtests/meat/DOtools.Rcheck/00check.log’
for details.
DOtools.Rcheck/00install.out
* installing *source* package ‘DOtools’ ... ** this is package ‘DOtools’ version ‘0.99.11’ ** using staged installation ** R ** inst ** byte-compile and prepare package for lazy loading ** help *** installing help indices *** copying figures ** building package indices ** installing vignettes ** testing if installed package can be loaded from temporary location ** testing if installed package can be loaded from final location ** testing if installed package keeps a record of temporary installation path * DONE (DOtools)