From c795c68f91fb4da0d136c78507917d4c82869013 Mon Sep 17 00:00:00 2001 From: Leonidas Zhak <70497898+LeonidasZhak@users.noreply.github.com> Date: Sun, 7 Jun 2026 15:23:33 +0800 Subject: [PATCH] tests: add edge-case tests for str_sort(), str_order(), and str_rank() Add tests for: - Empty input (character(0)) for all three functions - Single element input - All NA input - NA dropping with na_last = NA - Decreasing order - Mixed case sorting - Names preservation for str_order() - Single NA handling --- tests/testthat/test-sort.R | 77 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/tests/testthat/test-sort.R b/tests/testthat/test-sort.R index a1f418f8..75aa9a91 100644 --- a/tests/testthat/test-sort.R +++ b/tests/testthat/test-sort.R @@ -26,3 +26,80 @@ test_that("str_sort() preserves names", { out <- str_sort(x) expect_equal(names(out), c("A", "B", "C")) }) + +# Edge cases for data cleaning ------------------------------------------------ + +test_that("str_sort() handles empty input", { + expect_equal(str_sort(character()), character()) + expect_equal(str_sort(character(), numeric = TRUE), character()) +}) + +test_that("str_order() handles empty input", { + expect_equal(str_order(character()), integer()) + expect_equal(str_order(character(), numeric = TRUE), integer()) +}) + +test_that("str_rank() handles empty input", { + expect_equal(str_rank(character()), integer()) + expect_equal(str_rank(character(), numeric = TRUE), integer()) +}) + +test_that("str_sort() handles single element", { + expect_equal(str_sort("a"), "a") + expect_equal(str_sort("a", decreasing = TRUE), "a") +}) + +test_that("str_order() handles single element", { + expect_equal(str_order("a"), 1L) + expect_equal(str_order("a", decreasing = TRUE), 1L) +}) + +test_that("str_rank() handles single element", { + expect_equal(str_rank("a"), 1L) +}) + +test_that("str_sort() handles all NA input", { + expect_equal(str_sort(c(NA, NA, NA)), c(NA, NA, NA)) + expect_equal( + str_sort(c(NA, NA, NA), na_last = TRUE), + c(NA, NA, NA) + ) + expect_equal( + str_sort(c(NA, NA, NA), na_last = FALSE), + c(NA, NA, NA) + ) +}) + +test_that("str_sort() drops NAs when na_last = NA", { + x <- c("b", NA, "a") + expect_equal(str_sort(x, na_last = NA), c("a", "b")) +}) + +test_that("str_sort() handles decreasing order", { + x <- c("a", "b", "c") + expect_equal(str_sort(x, decreasing = TRUE), c("c", "b", "a")) +}) + +test_that("str_order() handles decreasing order", { + x <- c("a", "b", "c") + expect_equal(str_order(x, decreasing = TRUE), c(3L, 2L, 1L)) +}) + +test_that("str_sort() handles mixed case", { + x <- c("B", "a", "C") + # Default locale sorts case-sensitive (upper before lower in en locale) + out <- str_sort(x) + expect_equal(out[1], "a") +}) + +test_that("str_order() preserves names", { + x <- c(C = "3", B = "2", A = "1") + out <- str_order(x) + expect_equal(names(x[out]), c("A", "B", "C")) +}) + +test_that("str_sort() handles single NA", { + expect_equal(str_sort(NA_character_), NA_character_) + expect_equal(str_sort(c("a", NA, "b"), na_last = TRUE), c("a", "b", NA)) + expect_equal(str_sort(c("a", NA, "b"), na_last = FALSE), c(NA, "a", "b")) +})