@@ -8,7 +8,7 @@ extern crate shlex;
8
8
9
9
use std:: env;
10
10
use std:: fs;
11
- use std:: io:: { BufRead , BufReader , Error , ErrorKind , Read } ;
11
+ use std:: io:: { BufRead , BufReader , Error , ErrorKind , Read , Write } ;
12
12
use std:: path:: { Path , PathBuf } ;
13
13
14
14
#[ path="../../src/options.rs" ]
@@ -36,11 +36,18 @@ fn compare_generated_header(header: &PathBuf,
36
36
} ;
37
37
38
38
let mut buffer = String :: new ( ) ;
39
- let f = try!( fs:: File :: open ( & expected) ) ;
40
- let _ = try!( BufReader :: new ( f) . read_to_string ( & mut buffer) ) ;
39
+ {
40
+ if let Ok ( expected_file) = fs:: File :: open ( & expected) {
41
+ try!( BufReader :: new ( expected_file) . read_to_string ( & mut buffer) ) ;
42
+ }
43
+ }
41
44
42
45
if output == buffer {
43
- return Ok ( ( ) ) ;
46
+ if !output. is_empty ( ) {
47
+ return Ok ( ( ) ) ;
48
+ }
49
+ return Err ( Error :: new ( ErrorKind :: Other ,
50
+ "Something's gone really wrong!" ) )
44
51
}
45
52
46
53
println ! ( "diff expected generated" ) ;
@@ -54,21 +61,34 @@ fn compare_generated_header(header: &PathBuf,
54
61
diff:: Result :: Right ( r) => println ! ( "+{}" , r) ,
55
62
}
56
63
}
64
+
65
+ // Override the diff.
66
+ {
67
+ let mut expected_file = try!( fs:: File :: create ( & expected) ) ;
68
+ try!( expected_file. write_all ( output. as_bytes ( ) ) ) ;
69
+ }
70
+
57
71
Err ( Error :: new ( ErrorKind :: Other , "Header and binding differ!" ) )
58
72
}
59
73
60
74
fn create_bindgen_builder ( header : & PathBuf )
61
- -> Result < libbindgen:: Builder , Error > {
75
+ -> Result < Option < libbindgen:: Builder > , Error > {
62
76
let source = try!( fs:: File :: open ( header) ) ;
63
77
let reader = BufReader :: new ( source) ;
64
78
65
79
// Scoop up bindgen-flags from test header
66
- let line: String = try!( reader. lines ( ) . take ( 1 ) . collect ( ) ) ;
67
- let flags: Vec < String > = if line. contains ( "bindgen-flags:" ) {
68
- line. split ( "bindgen-flags:" ) . last ( ) . and_then ( shlex:: split)
69
- } else {
70
- None
71
- } . unwrap_or ( Vec :: with_capacity ( 2 ) ) ;
80
+ let mut flags = Vec :: with_capacity ( 2 ) ;
81
+
82
+ for line in reader. lines ( ) . take ( 2 ) {
83
+ let line = try!( line) ;
84
+ if line. contains ( "bindgen-flags: " ) {
85
+ let extra_flags = line. split ( "bindgen-flags: " )
86
+ . last ( ) . and_then ( shlex:: split) . unwrap ( ) ;
87
+ flags. extend ( extra_flags. into_iter ( ) ) ;
88
+ } else if line. contains ( "bindgen-unstable" ) && !cfg ! ( feature = "llvm_stable" ) {
89
+ return Ok ( None )
90
+ }
91
+ }
72
92
73
93
// Fool builder_from_flags() into believing it has real env::args_os...
74
94
// - add "bindgen" as executable name 0th element
@@ -90,7 +110,8 @@ fn create_bindgen_builder(header: &PathBuf)
90
110
. map ( ToString :: to_string)
91
111
. chain ( flags. into_iter ( ) ) ;
92
112
93
- builder_from_flags ( args) . map ( |( builder, _) | builder. no_unstable_rust ( ) )
113
+ builder_from_flags ( args)
114
+ . map ( |( builder, _) | Some ( builder. no_unstable_rust ( ) ) )
94
115
}
95
116
96
117
#[ test]
@@ -123,16 +144,23 @@ fn run_bindgen_tests() {
123
144
let failures: Vec < _ > = headers. iter ( )
124
145
. filter_map ( |header| {
125
146
create_bindgen_builder ( header)
126
- . and_then ( |builder| compare_generated_header ( header, builder) )
147
+ . and_then ( |builder| {
148
+ if let Some ( builder) = builder {
149
+ compare_generated_header ( header, builder)
150
+ } else {
151
+ Ok ( ( ) )
152
+ }
153
+ } )
127
154
. err ( )
128
155
} )
129
156
. collect ( ) ;
130
157
131
158
let num_failures = failures. len ( ) ;
132
159
133
160
if num_failures > 0 {
134
- panic ! ( "{} test{} failed!" ,
161
+ panic ! ( "{} test{} failed! {:?} " ,
135
162
num_failures,
136
- if num_failures > 1 { "s" } else { "" } ) ;
163
+ if num_failures > 1 { "s" } else { "" } ,
164
+ failures) ;
137
165
}
138
166
}
0 commit comments