@@ -27,12 +27,10 @@ expect_setequal <- function(object, expected) {
2727 act <- quasi_label(enquo(object ))
2828 exp <- quasi_label(enquo(expected ))
2929
30- if (! is_vector(act $ val ) || ! is_vector(exp $ val )) {
31- abort(" `object` and `expected` must both be vectors" )
32- }
33-
30+ check_vector(object )
31+ check_vector(expected )
3432 if (! is.null(names(act $ val )) && ! is.null(names(exp $ val ))) {
35- warn (" expect_setequal() ignores names" )
33+ testthat_warn (" expect_setequal() ignores names" )
3634 }
3735
3836 act_miss <- unique(act $ val [! act $ val %in% exp $ val ])
@@ -79,24 +77,22 @@ expect_mapequal <- function(object, expected) {
7977 act <- quasi_label(enquo(object ))
8078 exp <- quasi_label(enquo(expected ))
8179
82- if (! is_vector(act $ val ) || ! is_vector(exp $ val )) {
83- abort(" `object` and `expected` must both be vectors" )
84- }
80+ check_vector(object )
81+ check_map_names(object )
82+ check_vector(expected )
83+ check_map_names(expected )
8584
8685 # Length-0 vectors are OK whether named or unnamed.
8786 if (length(act $ val ) == 0 && length(exp $ val ) == 0 ) {
88- warn (" `object` and `expected` are empty lists" )
87+ testthat_warn (" `object` and `expected` are empty lists" )
8988 return (pass(act $ val ))
9089 }
9190
9291 act_nms <- names(act $ val )
9392 exp_nms <- names(exp $ val )
94-
95- check_names_ok(act_nms , " object" )
96- check_names_ok(exp_nms , " expected" )
97-
9893 if (setequal(act_nms , exp_nms )) {
99- return (expect_equal(act $ val [exp_nms ], exp $ val ))
94+ act <- labelled_value(act $ val [exp_nms ], act $ lab )
95+ return (expect_waldo_equal_(" equal" , act , exp ))
10096 }
10197
10298 act_miss <- setdiff(exp_nms , act_nms )
@@ -114,27 +110,16 @@ expect_mapequal <- function(object, expected) {
114110 pass(act $ val )
115111}
116112
117- check_names_ok <- function (x , label ) {
118- if (anyDuplicated(x )) {
119- stop(" Duplicate names in `" , label , " `: " , unique(x [duplicated(x )]))
120- }
121- if (any(x == " " )) {
122- stop(" All elements in `" , label , " ` must be named" )
123- }
124- }
125-
126113# ' @export
127114# ' @rdname expect_setequal
128115expect_contains <- function (object , expected ) {
129116 act <- quasi_label(enquo(object ))
130117 exp <- quasi_label(enquo(expected ))
131118
132- if (! is_vector(act $ val ) || ! is_vector(exp $ val )) {
133- abort(" `object` and `expected` must both be vectors" )
134- }
119+ check_vector(object )
120+ check_vector(expected )
135121
136122 exp_miss <- ! exp $ val %in% act $ val
137-
138123 if (any(exp_miss )) {
139124 return (fail(paste0(
140125 act $ lab ,
@@ -155,12 +140,10 @@ expect_in <- function(object, expected) {
155140 act <- quasi_label(enquo(object ))
156141 exp <- quasi_label(enquo(expected ))
157142
158- if (! is_vector(act $ val ) || ! is_vector(exp $ val )) {
159- abort(" `object` and `expected` must both be vectors" )
160- }
143+ check_vector(object )
144+ check_vector(expected )
161145
162146 act_miss <- ! act $ val %in% exp $ val
163-
164147 if (any(act_miss )) {
165148 return (fail(paste0(
166149 act $ lab ,
@@ -174,3 +157,44 @@ expect_in <- function(object, expected) {
174157
175158 pass(act $ val )
176159}
160+
161+ # Helpers ----------------------------------------------------------------------
162+
163+ check_map_names <- function (
164+ x ,
165+ error_arg = caller_arg(x ),
166+ error_call = caller_env()
167+ ) {
168+ nms <- names2(x )
169+
170+ if (anyDuplicated(nms )) {
171+ dups <- unique(nms [duplicated(nms )])
172+ cli :: cli_abort(
173+ c(
174+ " All elements in {.arg {error_arg}} must have unique names." ,
175+ x = " Duplicate names: {.str {dups}}"
176+ ),
177+ call = error_call
178+ )
179+ }
180+ if (any(nms == " " )) {
181+ empty <- which(nms == " " )
182+ cli :: cli_abort(
183+ c(
184+ " All elements in {.arg {error_arg}} must have names." ,
185+ x = " Empty names at position{?s}: {empty}"
186+ ),
187+ call = error_call
188+ )
189+ }
190+ }
191+
192+ check_vector <- function (
193+ x ,
194+ error_arg = caller_arg(x ),
195+ error_call = caller_env()
196+ ) {
197+ if (! is_vector(x )) {
198+ stop_input_type(x , " a vector" , arg = error_arg , call = error_call )
199+ }
200+ }
0 commit comments