Skip to content

Commit 1980b17

Browse files
committed
Improve expect_setequal() implementation
To help improve failures on CRAN
1 parent 886527d commit 1980b17

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

R/expect-setequal.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ expect_setequal <- function(object, expected) {
3535
warn("expect_setequal() ignores names")
3636
}
3737

38-
act_miss <- setdiff(act$val, exp$val)
39-
exp_miss <- setdiff(exp$val, act$val)
38+
act_miss <- unique(act$val[!act$val %in% exp$val])
39+
exp_miss <- unique(exp$val[!exp$val %in% act$val])
4040

4141
if (length(exp_miss) || length(act_miss)) {
4242
fail(paste0(

tests/testthat/_snaps/expect-setequal.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@
2424
* Only in `expected`: 3
2525

2626

27+
---
28+
29+
c("a", "a") (`actual`) and c("b", "b", "b") (`expected`) don't have the same values.
30+
* Only in `actual`: "a"
31+
* Only in `expected`: "b"
32+
33+
2734
# truncates long vectors
2835

2936
1:2 (`actual`) and 1:50 (`expected`) don't have the same values.

tests/testthat/test-expect-setequal.R

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ test_that("truncates long differences", {
1515
expect_match(cnd$message, "...")
1616
})
1717

18+
test_that("can compare data frames", {
19+
# this isn't really a legit use case but one package does it
20+
df <- data.frame(x = 1:10, y = 10:1)
21+
expect_success(expect_setequal(unname(df), unname(df)))
22+
})
23+
1824
test_that("warns if both inputs are named", {
1925
expect_warning(expect_setequal(c(a = 1), c(b = 1)), "ignores names")
2026
})
@@ -29,6 +35,9 @@ test_that("useful message on failure", {
2935
expect_snapshot_failure(expect_setequal(1:2, 2))
3036
expect_snapshot_failure(expect_setequal(2, 2:3))
3137
expect_snapshot_failure(expect_setequal(1:2, 2:3))
38+
39+
# doesn't repeat values
40+
expect_snapshot_failure(expect_setequal(c("a", "a"), c("b", "b", "b")))
3241
})
3342

3443
test_that("truncates long vectors", {

0 commit comments

Comments
 (0)