@@ -22,6 +22,33 @@ fn string_to_parser(ps: &ParseSess, source_str: String) -> Parser<'_> {
22
22
new_parser_from_source_str ( ps, PathBuf :: from ( "bogofile" ) . into ( ) , source_str)
23
23
}
24
24
25
+ fn create_test_handler ( ) -> ( Handler , Lrc < SourceMap > , Arc < Mutex < Vec < u8 > > > ) {
26
+ let output = Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ;
27
+ let source_map = Lrc :: new ( SourceMap :: new ( FilePathMapping :: empty ( ) ) ) ;
28
+ let fallback_bundle = rustc_errors:: fallback_fluent_bundle (
29
+ vec ! [ crate :: DEFAULT_LOCALE_RESOURCE , rustc_parse:: DEFAULT_LOCALE_RESOURCE ] ,
30
+ false ,
31
+ ) ;
32
+ let emitter = EmitterWriter :: new (
33
+ Box :: new ( Shared { data : output. clone ( ) } ) ,
34
+ Some ( source_map. clone ( ) ) ,
35
+ None ,
36
+ fallback_bundle,
37
+ false ,
38
+ false ,
39
+ false ,
40
+ Some ( 140 ) ,
41
+ false ,
42
+ false ,
43
+ TerminalUrl :: No ,
44
+ ) ;
45
+ let handler = Handler :: with_emitter ( true , None , Box :: new ( emitter) , None ) ;
46
+ ( handler, source_map, output)
47
+ }
48
+
49
+ /// Returns the result of parsing the given string via the given callback.
50
+ ///
51
+ /// If there are any errors, this will panic.
25
52
pub ( crate ) fn with_error_checking_parse < ' a , T , F > ( s : String , ps : & ' a ParseSess , f : F ) -> T
26
53
where
27
54
F : FnOnce ( & mut Parser < ' a > ) -> PResult < ' a , T > ,
32
59
x
33
60
}
34
61
62
+ /// Verifies that parsing the given string using the given callback will
63
+ /// generate an error that contains the given text.
64
+ pub ( crate ) fn with_expected_parse_error < T , F > ( source_str : & str , expected_output : & str , f : F )
65
+ where
66
+ F : for < ' a > FnOnce ( & mut Parser < ' a > ) -> PResult < ' a , T > ,
67
+ {
68
+ let ( handler, source_map, output) = create_test_handler ( ) ;
69
+ let ps = ParseSess :: with_span_handler ( handler, source_map) ;
70
+ let mut p = string_to_parser ( & ps, source_str. to_string ( ) ) ;
71
+ let result = f ( & mut p) ;
72
+ assert ! ( result. is_ok( ) ) ;
73
+
74
+ let bytes = output. lock ( ) . unwrap ( ) ;
75
+ let actual_output = str:: from_utf8 ( & bytes) . unwrap ( ) ;
76
+ println ! ( "expected output:\n ------\n {}------" , expected_output) ;
77
+ println ! ( "actual output:\n ------\n {}------" , actual_output) ;
78
+
79
+ assert ! ( actual_output. contains( expected_output) )
80
+ }
81
+
35
82
/// Maps a string to tts, using a made-up filename.
36
83
pub ( crate ) fn string_to_stream ( source_str : String ) -> TokenStream {
37
84
let ps = ParseSess :: new (
@@ -130,13 +177,7 @@ impl<T: Write> Write for Shared<T> {
130
177
131
178
fn test_harness ( file_text : & str , span_labels : Vec < SpanLabel > , expected_output : & str ) {
132
179
create_default_session_if_not_set_then ( |_| {
133
- let output = Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ;
134
-
135
- let fallback_bundle = rustc_errors:: fallback_fluent_bundle (
136
- vec ! [ crate :: DEFAULT_LOCALE_RESOURCE , rustc_parse:: DEFAULT_LOCALE_RESOURCE ] ,
137
- false ,
138
- ) ;
139
- let source_map = Lrc :: new ( SourceMap :: new ( FilePathMapping :: empty ( ) ) ) ;
180
+ let ( handler, source_map, output) = create_test_handler ( ) ;
140
181
source_map. new_source_file ( Path :: new ( "test.rs" ) . to_owned ( ) . into ( ) , file_text. to_owned ( ) ) ;
141
182
142
183
let primary_span = make_span ( & file_text, & span_labels[ 0 ] . start , & span_labels[ 0 ] . end ) ;
@@ -148,20 +189,6 @@ fn test_harness(file_text: &str, span_labels: Vec<SpanLabel>, expected_output: &
148
189
println ! ( "text: {:?}" , source_map. span_to_snippet( span) ) ;
149
190
}
150
191
151
- let emitter = EmitterWriter :: new (
152
- Box :: new ( Shared { data : output. clone ( ) } ) ,
153
- Some ( source_map. clone ( ) ) ,
154
- None ,
155
- fallback_bundle,
156
- false ,
157
- false ,
158
- false ,
159
- None ,
160
- false ,
161
- false ,
162
- TerminalUrl :: No ,
163
- ) ;
164
- let handler = Handler :: with_emitter ( true , None , Box :: new ( emitter) , None ) ;
165
192
#[ allow( rustc:: untranslatable_diagnostic) ]
166
193
handler. span_err ( msp, "foo" ) ;
167
194
0 commit comments