From bc934721490c6d8b75b4e98aaf72b7a8828827ac Mon Sep 17 00:00:00 2001 From: mattssca Date: Mon, 5 Feb 2024 13:03:49 -0800 Subject: [PATCH 1/8] New unit tests and minor improvements --- R/bin_splitter.R | 4 ++-- man/bin_splitter.Rd | 2 +- tests/testthat/test-bin_splitter.R | 29 +++++++++++++++++++++++++++++ tests/testthat/test-get_gene_info.R | 2 +- 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 tests/testthat/test-bin_splitter.R diff --git a/R/bin_splitter.R b/R/bin_splitter.R index 70b18f3..8acd7d0 100644 --- a/R/bin_splitter.R +++ b/R/bin_splitter.R @@ -4,7 +4,7 @@ #' specified size. #' #' @details This function internally calls the purify_regions function to -#' properly format the incoming regions.Thus, thuis function can accept either a +#' properly format the incoming regions.Thus, this function can accept either a #' data frame of regions or individual region coordinates. #' #' @param these_regions The region(s) to be queried. Can be a data frame with @@ -39,7 +39,7 @@ bin_splitter = function(these_regions = NULL, qend = NULL, bin_size = 1000){ - #call helperto format regions + #call helper to format regions my_regions = purify_regions(these_regions = these_regions, qchrom = qchrom, qstart = qstart, diff --git a/man/bin_splitter.Rd b/man/bin_splitter.Rd index 5cde8f4..a4c9134 100644 --- a/man/bin_splitter.Rd +++ b/man/bin_splitter.Rd @@ -35,7 +35,7 @@ specified size. } \details{ This function internally calls the purify_regions function to -properly format the incoming regions.Thus, thuis function can accept either a +properly format the incoming regions.Thus, this function can accept either a data frame of regions or individual region coordinates. } \examples{ diff --git a/tests/testthat/test-bin_splitter.R b/tests/testthat/test-bin_splitter.R new file mode 100644 index 0000000..f584065 --- /dev/null +++ b/tests/testthat/test-bin_splitter.R @@ -0,0 +1,29 @@ +#load packages +library(testthat) + +test_that("bin_splitter returns correct number of bins", { + result <- bin_splitter(qchrom = c("chr1"), qstart = c(1), qend = c(1001), bin_size = 100) + expect_equal(nrow(result), 10) +}) + +test_that("bin_splitter returns correct bin size", { + result <- bin_splitter(qchrom = c("chr1"), qstart = c(1), qend = c(1000), bin_size = 100) + expect_equal(result$bin_end[1] - result$bin_start[1], 100) +}) + +test_that("bin_splitter handles multiple regions", { + result <- bin_splitter(qchrom = c("chr1", "chr2"), qstart = c(1, 1001), qend = c(1001, 2001), bin_size = 100) + expect_equal(nrow(result), 20) +}) + +test_that("bin_splitter handles regions data frame", { + my_regions <- data.frame(chrom = c("chr1", "chr2"), start = c(1, 1000), end = c(1001, 2001)) + result <- bin_splitter(these_regions = my_regions, bin_size = 100) + expect_equal(nrow(result), 20) +}) + +test_that("bin_splitter returns correct chromosome names", { + result <- bin_splitter(qchrom = c("chr1", "chr2"), qstart = c(1, 1001), qend = c(1000, 2000), bin_size = 100) + expect_equal(unique(result$bin_chr), c("chr1", "chr2")) +}) + diff --git a/tests/testthat/test-get_gene_info.R b/tests/testthat/test-get_gene_info.R index 5736524..4abcfec 100644 --- a/tests/testthat/test-get_gene_info.R +++ b/tests/testthat/test-get_gene_info.R @@ -1,4 +1,4 @@ -#load pacakges +#load packages library(testthat) From 24612ea322b615cdcc18542017c504471fdea645 Mon Sep 17 00:00:00 2001 From: mattssca Date: Mon, 5 Feb 2024 13:05:51 -0800 Subject: [PATCH 2/8] Updated gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 671b0d8..3a14286 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .Rproj.user .DS_Store +my_bed.bed \ No newline at end of file From 4cf255b49f698de8fc2fbd125d0abb89599e5567 Mon Sep 17 00:00:00 2001 From: mattssca Date: Mon, 5 Feb 2024 13:21:11 -0800 Subject: [PATCH 3/8] Adding outstanding unit tests --- tests/testthat/test-gene_ranger.R | 23 +++++++++++ tests/testthat/test-purify_chr.R | 25 ++++++++++++ tests/testthat/test-purify_regions.R | 47 ++++++++++++++++++++++ tests/testthat/test-region_ranger.R | 23 +++++++++++ tests/testthat/test-sanity_check_regions.R | 31 ++++++++++++++ 5 files changed, 149 insertions(+) create mode 100644 tests/testthat/test-gene_ranger.R create mode 100644 tests/testthat/test-purify_chr.R create mode 100644 tests/testthat/test-region_ranger.R create mode 100644 tests/testthat/test-sanity_check_regions.R diff --git a/tests/testthat/test-gene_ranger.R b/tests/testthat/test-gene_ranger.R new file mode 100644 index 0000000..e617796 --- /dev/null +++ b/tests/testthat/test-gene_ranger.R @@ -0,0 +1,23 @@ +library(testthat) + +test_that("gene_ranger throws error with no genes", { + expect_error(gene_ranger()) +}) + +test_that("gene_ranger throws error with invalid projection", { + expect_error(gene_ranger(these_genes = "MYC", projection = "invalid")) +}) + +test_that("gene_ranger throws error with invalid return format", { + expect_error(gene_ranger(these_genes = "MYC", return_as = "invalid")) +}) + +test_that("gene_ranger throws error when write_to_bed is TRUE but bed_path, track_name, or track_description is not provided", { + expect_error(gene_ranger(these_genes = "MYC", write_to_bed = TRUE), "Provide a path for output bed file") + expect_error(gene_ranger(these_genes = "MYC", write_to_bed = TRUE, bed_path = "my_bed"), "Provide a track name for output bed file") + expect_error(gene_ranger(these_genes = "MYC", write_to_bed = TRUE, bed_path = "my_bed", track_name = "MYC"), "Provide a track description for output bed file") +}) + +test_that("gene_ranger runs successfully with valid input", { + expect_silent(gene_ranger(these_genes = "MYC")) +}) diff --git a/tests/testthat/test-purify_chr.R b/tests/testthat/test-purify_chr.R new file mode 100644 index 0000000..31fcb3d --- /dev/null +++ b/tests/testthat/test-purify_chr.R @@ -0,0 +1,25 @@ +library(testthat) + +test_that("purify_chr throws error with no projection", { + expect_error(purify_chr(), "You must provide a valid projection") +}) + +test_that("purify_chr throws error with no incoming_table", { + expect_error(purify_chr(projection = "hg38"), "You must provide a data table with `incoming_table`") +}) + +test_that("purify_chr throws error with invalid projection", { + expect_error(purify_chr(projection = "invalid", incoming_table = data.frame(chrom = c("1", "2", "3"))), "This function supports the following projections") +}) + +test_that("purify_chr adds 'chr' prefix for hg38 projection", { + df = data.frame(chrom = c("1", "2", "3")) + result = purify_chr(projection = "hg38", incoming_table = df) + expect_equal(result$chrom, c("chr1", "chr2", "chr3")) +}) + +test_that("purify_chr removes 'chr' prefix for grch37 projection", { + df = data.frame(chrom = c("chr1", "chr2", "chr3")) + result = purify_chr(projection = "grch37", incoming_table = df) + expect_equal(result$chrom, c("1", "2", "3")) +}) diff --git a/tests/testthat/test-purify_regions.R b/tests/testthat/test-purify_regions.R index e69de29..ccd66e3 100644 --- a/tests/testthat/test-purify_regions.R +++ b/tests/testthat/test-purify_regions.R @@ -0,0 +1,47 @@ +library(testthat) + +test_that("purify_regions handles single region string", { + result <- purify_regions(these_regions = "chr1:100-500") + expect_equal(nrow(result), 1) + expect_equal(result$chrom, "chr1") + expect_equal(result$start, 100) + expect_equal(result$end, 500) +}) + +test_that("purify_regions handles multiple region strings", { + result <- purify_regions(these_regions = c("chr1:100-500", "chr2:100-500")) + expect_equal(nrow(result), 2) + expect_equal(result$chrom, c("chr1", "chr2")) + expect_equal(result$start, c(100, 100)) + expect_equal(result$end, c(500, 500)) +}) + +test_that("purify_regions handles individual region parameters", { + result <- purify_regions(qchrom = "chr1", qstart = 100, qend = 500) + expect_equal(nrow(result), 1) + expect_equal(result$chrom, "chr1") + expect_equal(result$start, 100) + expect_equal(result$end, 500) +}) + +test_that("purify_regions handles multiple individual region parameters", { + result <- purify_regions(qchrom = c("chr1", "chr2"), qstart = c(100, 200), qend = c(500, 600)) + expect_equal(nrow(result), 2) + expect_equal(result$chrom, c("chr1", "chr2")) + expect_equal(result$start, c(100, 200)) + expect_equal(result$end, c(500, 600)) +}) + +test_that("purify_regions handles data frame input", { + my_regions <- data.frame(chrom = c("chr1", "chr2"), start = c(100, 200), end = c(500, 600)) + result <- purify_regions(these_regions = my_regions) + expect_equal(nrow(result), 2) + expect_equal(result$chrom, c("chr1", "chr2")) + expect_equal(result$start, c(100, 200)) + expect_equal(result$end, c(500, 600)) +}) + +test_that("purify_regions throws error with incorrect input", { + expect_error(purify_regions(qchrom = "chr1", qstart = 100)) + expect_error(purify_regions(these_regions = data.frame(chrom = c("chr1", "chr2"), start = c(100, 200), end = c(50, 100)))) +}) diff --git a/tests/testthat/test-region_ranger.R b/tests/testthat/test-region_ranger.R new file mode 100644 index 0000000..8dce8ee --- /dev/null +++ b/tests/testthat/test-region_ranger.R @@ -0,0 +1,23 @@ +library(testthat) + +test_that("region_ranger throws error with no regions", { + expect_error(region_ranger()) +}) + +test_that("region_ranger throws error with invalid projection", { + expect_error(region_ranger(these_regions = "chr8:127735434-127742951", projection = "invalid"), "This function supports the following projections") +}) + +test_that("region_ranger returns correct number of columns when raw is FALSE", { + result = region_ranger(these_regions = "chr8:127735434-127742951") + expect_equal(ncol(result), 11) +}) + +test_that("region_ranger returns all columns when raw is TRUE", { + result = region_ranger(these_regions = "chr8:127735434-127742951", raw = TRUE) + expect_true(ncol(result) > 11) +}) + +test_that("region_ranger returns warning when no genes found", { + expect_warning(region_ranger(these_regions = "chr1:1-10")) +}) diff --git a/tests/testthat/test-sanity_check_regions.R b/tests/testthat/test-sanity_check_regions.R new file mode 100644 index 0000000..9d55699 --- /dev/null +++ b/tests/testthat/test-sanity_check_regions.R @@ -0,0 +1,31 @@ +library(testthat) + +test_that("sanity_check_regions throws error with no regions", { + expect_error(sanity_check_regions(), "No regions provided") +}) + +test_that("sanity_check_regions throws error with invalid projection", { + my_regions <- data.frame(chrom = c("chr1"), start = c(100), end = c(200)) + expect_error(sanity_check_regions(incoming_regions = my_regions, projection = "invalid"), "Invalid projection specified") +}) + +test_that("sanity_check_regions throws error when start is greater than end", { + my_regions <- data.frame(chrom = c("chr1"), start = c(200), end = c(100)) + expect_error(sanity_check_regions(incoming_regions = my_regions, projection = "hg38"), "start is greater than or equal to end") +}) + +test_that("sanity_check_regions throws error when start or end is outside chromosomal range", { + my_regions <- data.frame(chrom = c("chr1"), start = c(100), end = c(300000000)) + expect_error(sanity_check_regions(incoming_regions = my_regions, projection = "hg38"), "Specified start or end coordinates fall outside the actual chromosomal range") +}) + +test_that("sanity_check_regions runs successfully with valid input", { + my_regions <- data.frame(chrom = c("chr1"), start = c(100), end = c(200)) + expect_silent(sanity_check_regions(incoming_regions = my_regions, projection = "hg38")) +}) + +test_that("sanity_check_regions runs successfully with valid input", { + my_regions <- data.frame(chrom = c("1"), start = c(100), end = c(200)) + expect_silent(sanity_check_regions(incoming_regions = my_regions, projection = "grch37")) +}) + From 30ef315dec8cf566c666c15d2dd65ce002bcbfd0 Mon Sep 17 00:00:00 2001 From: mattssca Date: Mon, 5 Feb 2024 13:32:34 -0800 Subject: [PATCH 4/8] Updated README --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4286b52..80e9d5e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # BioMaesteR -A package with convenience functions for generic genomic analysis within R. -Standardized, generic functions as well as bundled data objects that can be -called in various settings in the scope of biological analysis in R. -This package is specialized to provide bioinformatics infrastructure that can be -used in a variety of analysis. \ No newline at end of file +This is BioMaesteR, an R package with convenience functions commonly requested in various types of genomic analysis within R. This package is specialized to provide bioinformatics infrastructure that can be +used in a variety of genomic analysis. + +This repo is also an ongoing project intended for demonstrating and following best-practices in development of R packages. This includes adequate package documentation (functions, bundled data objects, etc.), reproducible unit tests and vignettes. Upon Pull Requests, this repo also executes a GitAction workflow where the package is installed in various environments and thorough testing of the complete code base. \ No newline at end of file From 582829764c768b7e831fb505fe28b335e089080e Mon Sep 17 00:00:00 2001 From: mattssca Date: Mon, 5 Feb 2024 14:04:09 -0800 Subject: [PATCH 5/8] adding logo --- biomaesteR.png | Bin 0 -> 15709 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 biomaesteR.png diff --git a/biomaesteR.png b/biomaesteR.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e20392f3164ac7ee5be5d01c7c5228cbeeb4c2 GIT binary patch literal 15709 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 literal 0 HcmV?d00001 From ba8fc2669c9dd0986385470ac9e7e28217cc9809 Mon Sep 17 00:00:00 2001 From: mattssca Date: Mon, 5 Feb 2024 14:05:02 -0800 Subject: [PATCH 6/8] new line at the end of gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3a14286..23a20d4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ .Rproj.user .DS_Store -my_bed.bed \ No newline at end of file +my_bed.bed From 7216fe5265c4c50a211c779c314ed8d269b95105 Mon Sep 17 00:00:00 2001 From: mattssca Date: Mon, 5 Feb 2024 14:06:29 -0800 Subject: [PATCH 7/8] adding logo --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 80e9d5e..509dcfb 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +# # BioMaesteR This is BioMaesteR, an R package with convenience functions commonly requested in various types of genomic analysis within R. This package is specialized to provide bioinformatics infrastructure that can be used in a variety of genomic analysis. From 008bb0a7c605d9906574b230ce72a4f9b2d7a199 Mon Sep 17 00:00:00 2001 From: mattssca Date: Mon, 5 Feb 2024 14:07:24 -0800 Subject: [PATCH 8/8] Readme updates --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 509dcfb..a79e8b1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # -# BioMaesteR -This is BioMaesteR, an R package with convenience functions commonly requested in various types of genomic analysis within R. This package is specialized to provide bioinformatics infrastructure that can be +# biomaesteR +This is biomaesteR, an R package with convenience functions commonly requested in various types of genomic analysis within R. This package is specialized to provide bioinformatics infrastructure that can be used in a variety of genomic analysis. This repo is also an ongoing project intended for demonstrating and following best-practices in development of R packages. This includes adequate package documentation (functions, bundled data objects, etc.), reproducible unit tests and vignettes. Upon Pull Requests, this repo also executes a GitAction workflow where the package is installed in various environments and thorough testing of the complete code base. \ No newline at end of file