@@ -71,32 +71,64 @@ expect_messages = function (object, has = NULL, has_not = NULL, info = NULL, lab
7171 act = withCallingHandlers(
7272 testthat :: quasi_label(rlang :: enquo(object ), label , arg = ' object' ),
7373 message = function (m ) {
74- self $ messages = c(self $ messages , m $ message )
74+ self $ messages = c(self $ messages , sub( ' \\ n$ ' , ' ' , conditionMessage( m )) )
7575 invokeRestart(' muffleMessage' )
7676 }
7777 )
7878
79- pretty_messages = paste(' *' , messages , collapse = ' ' )
80-
81- find = function (pattern , x ) any(grepl(pattern , x ))
82-
83- testthat :: expect(
84- all(vapply(has , find , logical (1L ), messages )),
85- sprintf(
86- ' %s did not produce the expected message(s). It produced:\n %s' ,
87- act $ lab , pretty_messages
88- ),
89- info = info
79+ pretty_messages = function (which ) {
80+ paste(' *' , vapply(messages [which ], deparse , character (1L )), collapse = ' \n ' )
81+ }
82+
83+ if (! is.null(has ) && length(has ) != length(messages )) {
84+ testthat :: expect(
85+ FALSE ,
86+ sprintf(
87+ ' %s did not produce %s message(s). It produced:\n %s\n\n Expected:\n %s' ,
88+ act $ lab ,
89+ length(messages ),
90+ pretty_messages(TRUE ),
91+ paste(' *' , vapply(has [TRUE ], deparse , character (1L )), collapse = ' \n ' )
92+ ),
93+ info = info
94+ )
95+ }
96+
97+ expected = unlist(box ::: map(grepl , has , messages ))
98+
99+ if (! all(expected )) {
100+ # We can’t use `testthat::expect(all(expected), …)` here, since that will cause the subsequent assertion to
101+ # be ignored inside a nested assertion, such as when used inside `expect_failure`. This caused the test of
102+ # this helper itself to fail.
103+ testthat :: expect(
104+ FALSE ,
105+ sprintf(
106+ ' %s did not produce the expected message(s). It produced:\n %s\n\n Expected:\n %s' ,
107+ act $ lab ,
108+ pretty_messages(! expected ),
109+ paste(' *' , vapply(has [! expected ], deparse , character (1L )), collapse = ' \n ' )
110+ ),
111+ info = info
112+ )
113+ }
114+
115+ unexpected = vapply(
116+ messages ,
117+ function (m ) any(vapply(has_not , grepl , logical (1L ), m )),
118+ logical (1L )
90119 )
91120
92- testthat :: expect(
93- ! any(vapply(has_not , find , logical (1L ), messages )),
94- sprintf(
95- ' %s produces unexpected message(s). It produced:\n %s' ,
96- act $ lab , pretty_messages
97- ),
98- info = info
99- )
121+ if (any(unexpected )) {
122+ testthat :: expect(
123+ FALSE ,
124+ sprintf(
125+ ' %s produced unwanted message(s):\n %s' ,
126+ act $ lab ,
127+ pretty_messages(unexpected )
128+ ),
129+ info = info
130+ )
131+ }
100132}
101133
102134in_globalenv = function (expr ) {
0 commit comments