160 lines
4.8 KiB
R
160 lines
4.8 KiB
R
test_that("reorder_by works with character columns", {
|
|
test_data <- data.frame(
|
|
category = c("B", "A", "D", "C", "E"),
|
|
value = c(25, 40, 15, 35, 30),
|
|
group = c("Group 1", "Group 2", "Group 1", "Group 2", "Group 1"),
|
|
stringsAsFactors = FALSE
|
|
)
|
|
|
|
# Test order by values (y)
|
|
result <- reorder_by(test_data, "category", "value", order = "y")
|
|
expected_order <- c("D", "B", "E", "C", "A")
|
|
expect_equal(as.character(result$category), expected_order)
|
|
|
|
# Test reversed order
|
|
result_rev <- reorder_by(
|
|
test_data,
|
|
"category",
|
|
"value",
|
|
order = "y",
|
|
dir_order = -1
|
|
)
|
|
expect_equal(as.character(result_rev$category), rev(expected_order))
|
|
|
|
# Test alphabetical order
|
|
result_alpha <- reorder_by(test_data, "category", "value", order = "x")
|
|
expect_equal(as.character(result_alpha$category), c("A", "B", "C", "D", "E"))
|
|
})
|
|
|
|
test_that("reorder_by works with factor columns", {
|
|
test_data <- data.frame(
|
|
category = factor(c("B", "A", "D", "C", "E")),
|
|
value = c(25, 40, 15, 35, 30),
|
|
group = factor(c("Group 1", "Group 2", "Group 1", "Group 2", "Group 1"))
|
|
)
|
|
|
|
# Test order by values (y)
|
|
result <- reorder_by(test_data, "category", "value", order = "y")
|
|
expect_true(is.factor(result$category))
|
|
expect_equal(as.character(result$category), c("D", "B", "E", "C", "A"))
|
|
|
|
# Test factor levels
|
|
expect_equal(levels(result$category), c("D", "B", "E", "C", "A"))
|
|
})
|
|
|
|
test_that("reorder_by handles grouped ordering correctly", {
|
|
test_data <- data.frame(
|
|
category = c("B", "A", "D", "C", "E"),
|
|
value = c(25, 40, 15, 35, 30),
|
|
group = c("Group 1", "Group 2", "Group 1", "Group 2", "Group 1"),
|
|
stringsAsFactors = FALSE
|
|
)
|
|
|
|
# Test grouped_y ordering
|
|
result <- reorder_by(
|
|
test_data,
|
|
"category",
|
|
"value",
|
|
group = "group",
|
|
order = "grouped_y"
|
|
)
|
|
|
|
# Group 1 items should be ordered by value within Group 1
|
|
group1_items <- result[result$group == "Group 1", "category"]
|
|
group1_values <- result[result$group == "Group 1", "value"]
|
|
expect_true(all(group1_values == sort(group1_values)))
|
|
|
|
# Group 2 items should be ordered by value within Group 2
|
|
group2_items <- result[result$group == "Group 2", "category"]
|
|
group2_values <- result[result$group == "Group 2", "value"]
|
|
expect_true(all(group2_values == sort(group2_values)))
|
|
|
|
# Test grouped_x ordering
|
|
result_x <- reorder_by(
|
|
test_data,
|
|
"category",
|
|
"value",
|
|
group = "group",
|
|
order = "grouped_x"
|
|
)
|
|
|
|
# Groups should remain intact, and items should be ordered alphabetically within groups
|
|
group1_items_x <- as.character(result_x[
|
|
result_x$group == "Group 1",
|
|
"category"
|
|
])
|
|
expect_equal(group1_items_x, sort(group1_items_x))
|
|
})
|
|
|
|
test_that("reorder_by handles fallback cases", {
|
|
test_data <- data.frame(
|
|
category = c("B", "A", "D", "C", "E"),
|
|
value = c(25, 40, 15, 35, 30),
|
|
stringsAsFactors = FALSE
|
|
)
|
|
|
|
# Test empty group with grouped_y
|
|
expect_warning(
|
|
result <- reorder_by(
|
|
test_data,
|
|
"category",
|
|
"value",
|
|
group = "",
|
|
order = "grouped_y"
|
|
),
|
|
"Group is empty"
|
|
)
|
|
# Should fall back to ordering by y
|
|
expect_equal(as.character(result$category), c("D", "B", "E", "C", "A"))
|
|
|
|
# Test empty group with grouped_x
|
|
expect_warning(
|
|
result_x <- reorder_by(
|
|
test_data,
|
|
"category",
|
|
"value",
|
|
group = "",
|
|
order = "grouped_x"
|
|
),
|
|
"Group is empty"
|
|
)
|
|
# Should fall back to alphabetical ordering
|
|
expect_equal(as.character(result_x$category), c("A", "B", "C", "D", "E"))
|
|
})
|
|
|
|
test_that("reorder_by preserves row data correctly", {
|
|
test_data <- data.frame(
|
|
category = c("B", "A", "D", "C", "E"),
|
|
value = c(25, 40, 15, 35, 30),
|
|
extra = c("x1", "x2", "x3", "x4", "x5"),
|
|
stringsAsFactors = FALSE
|
|
)
|
|
|
|
# Test that reordering preserves all columns and their associations
|
|
result <- reorder_by(test_data, "category", "value", order = "y")
|
|
|
|
# Values should correspond to the correct categories
|
|
expect_equal(result$value[result$category == "A"], 40)
|
|
expect_equal(result$value[result$category == "B"], 25)
|
|
expect_equal(result$value[result$category == "C"], 35)
|
|
expect_equal(result$value[result$category == "D"], 15)
|
|
expect_equal(result$value[result$category == "E"], 30)
|
|
|
|
# Extra column should maintain its associations
|
|
expect_equal(result$extra[result$category == "A"], "x2")
|
|
expect_equal(result$extra[result$category == "B"], "x1")
|
|
})
|
|
|
|
test_that("reorder_by handles no reordering case", {
|
|
test_data <- data.frame(
|
|
category = c("B", "A", "D", "C", "E"),
|
|
value = c(25, 40, 15, 35, 30),
|
|
stringsAsFactors = FALSE
|
|
)
|
|
|
|
# Test no reordering
|
|
result <- reorder_by(test_data, "category", "value", order = "none")
|
|
|
|
# Order should be preserved from the original data
|
|
expect_equal(as.character(result$category), c("B", "A", "D", "C", "E"))
|
|
})
|