@@ -7,12 +7,12 @@ use crate::results::{
7
7
use std:: collections:: BTreeSet ;
8
8
use std:: collections:: HashMap ;
9
9
10
- #[ derive( PartialEq ) ]
11
10
pub enum ReportConfig {
12
11
Simple ,
13
12
Complete { toolchain : usize } ,
14
13
}
15
14
15
+ #[ cfg_attr( test, derive( Debug , PartialEq ) ) ]
16
16
#[ derive( Clone ) ]
17
17
pub enum ReportCrates {
18
18
Plain ( Vec < CrateResult > ) ,
@@ -22,6 +22,7 @@ pub enum ReportCrates {
22
22
} ,
23
23
}
24
24
25
+ #[ cfg_attr( test, derive( Debug , PartialEq ) ) ]
25
26
pub struct TestResults {
26
27
pub categories : HashMap < Comparison , ReportCrates > ,
27
28
pub info : HashMap < Comparison , u32 > ,
@@ -93,3 +94,161 @@ pub fn analyze_report(test: RawTestResults) -> TestResults {
93
94
94
95
TestResults { categories, info }
95
96
}
97
+
98
+ #[ cfg( test) ]
99
+ mod tests {
100
+ use super :: * ;
101
+ use crate :: config:: Config ;
102
+ use crate :: crates:: { Crate , RegistryCrate } ;
103
+ use crate :: experiments:: { CapLints , Experiment , Mode , Status } ;
104
+ use crate :: report:: { generate_report, Comparison } ;
105
+ use crate :: results:: { DummyDB , FailureReason :: * } ;
106
+ use crate :: toolchain:: { MAIN_TOOLCHAIN , TEST_TOOLCHAIN } ;
107
+ use failure:: Fallible ;
108
+
109
+ #[ test]
110
+ fn test_report_analysis ( ) -> Fallible < ( ) > {
111
+ macro_rules! reg {
112
+ ( $name: expr) => {
113
+ Crate :: Registry ( RegistryCrate {
114
+ name: $name. into( ) ,
115
+ version: "0.0.1" . into( ) ,
116
+ } )
117
+ } ;
118
+ }
119
+
120
+ macro_rules! record_crates {
121
+ ( $db: expr, $ex: expr, $( $name: expr => ( $tc1: expr, $tc2: expr) ) ,* ) => {
122
+ {
123
+ let mut crates = Vec :: new( ) ;
124
+ $(
125
+ let krate = reg!( $name) ;
126
+ $db. add_dummy_result(
127
+ & $ex,
128
+ krate. clone( ) ,
129
+ MAIN_TOOLCHAIN . clone( ) ,
130
+ $tc1,
131
+ ) ;
132
+ $db. add_dummy_result(
133
+ & $ex,
134
+ krate. clone( ) ,
135
+ TEST_TOOLCHAIN . clone( ) ,
136
+ $tc2,
137
+ ) ;
138
+ crates. push( krate) ;
139
+ ) *
140
+ crates
141
+ }
142
+ } ;
143
+ }
144
+
145
+ let config = Config :: default ( ) ;
146
+ let mut db = DummyDB :: default ( ) ;
147
+ let ex = Experiment {
148
+ name : "foo" . to_string ( ) ,
149
+ toolchains : [ MAIN_TOOLCHAIN . clone ( ) , TEST_TOOLCHAIN . clone ( ) ] ,
150
+ mode : Mode :: BuildAndTest ,
151
+ cap_lints : CapLints :: Forbid ,
152
+ priority : 0 ,
153
+ created_at : :: chrono:: Utc :: now ( ) ,
154
+ started_at : None ,
155
+ completed_at : None ,
156
+ github_issue : None ,
157
+ status : Status :: GeneratingReport ,
158
+ assigned_to : None ,
159
+ report_url : None ,
160
+ ignore_blacklist : false ,
161
+ requirement : None ,
162
+ } ;
163
+
164
+ let crates = record_crates ! { db, ex,
165
+ "test-pass" => ( TestResult :: TestPass , TestResult :: TestPass ) ,
166
+ "ce-1" => ( TestResult :: TestPass , TestResult :: BuildFail ( CompilerError ( btreeset![ "001" . parse( ) ?, "002" . parse( ) ?] ) ) ) ,
167
+ "ce-2" => ( TestResult :: TestPass , TestResult :: BuildFail ( CompilerError ( btreeset![ "002" . parse( ) ?] ) ) ) ,
168
+ "unknown" => ( TestResult :: TestPass , TestResult :: BuildFail ( Unknown ) ) ,
169
+ "dep-1" => ( TestResult :: TestPass , TestResult :: BuildFail ( DependsOn ( btreeset![ reg!( "ce-1" ) , reg!( "unknown" ) ] ) ) ) ,
170
+ "dep-2" => ( TestResult :: TestPass , TestResult :: BuildFail ( DependsOn ( btreeset![ reg!( "ce-1" ) , reg!( "ce-2" ) ] ) ) ) ,
171
+ "fix-1" => ( TestResult :: BuildFail ( DependsOn ( btreeset![ reg!( "ce-1" ) , reg!( "ce-2" ) ] ) ) , TestResult :: TestPass ) ,
172
+ "fix-2" => ( TestResult :: BuildFail ( Unknown ) , TestResult :: TestPass )
173
+ } ;
174
+
175
+ let raw = generate_report ( & db, & config, & ex, & crates) ?;
176
+ let mut crates = raw
177
+ . crates
178
+ . clone ( )
179
+ . into_iter ( )
180
+ . map ( |krate| {
181
+ if let Crate :: Registry ( ref registry_krate) = krate. krate {
182
+ ( registry_krate. name . clone ( ) , krate)
183
+ } else {
184
+ panic ! ( "invalid crate type" )
185
+ }
186
+ } )
187
+ . collect :: < HashMap < _ , _ > > ( ) ;
188
+ let analyzed = analyze_report ( raw) ;
189
+
190
+ let mut info = HashMap :: new ( ) ;
191
+ info. insert ( Comparison :: Regressed , 5 ) ;
192
+ info. insert ( Comparison :: Fixed , 2 ) ;
193
+ info. insert ( Comparison :: SameTestPass , 1 ) ;
194
+
195
+ macro_rules! create_results {
196
+ ( $src: expr, $( $key: expr => ( $( $krate: expr) ,* ) ) ,* ) => {
197
+ {
198
+ let mut map = HashMap :: new( ) ;
199
+ $(
200
+ let mut crates = Vec :: new( ) ;
201
+ $(
202
+ crates. push( $src. get( $krate) . unwrap( ) . clone( ) ) ;
203
+ ) *
204
+ map. insert( $key, crates) ;
205
+ ) *
206
+ map
207
+ }
208
+ }
209
+ }
210
+
211
+ let regr_tree = create_results ! { crates,
212
+ reg!( "ce-1" ) => ( "dep-1" , "dep-2" ) ,
213
+ reg!( "ce-2" ) => ( "dep-2" ) ,
214
+ reg!( "unknown" ) => ( "dep-1" )
215
+ } ;
216
+
217
+ let regr_root = create_results ! { crates,
218
+ TestResult :: BuildFail ( CompilerError ( btreeset![ "001" . parse( ) ?] ) ) => ( "ce-1" ) ,
219
+ TestResult :: BuildFail ( CompilerError ( btreeset![ "002" . parse( ) ?] ) ) => ( "ce-1" , "ce-2" ) ,
220
+ TestResult :: BuildFail ( Unknown ) => ( "unknown" )
221
+ } ;
222
+
223
+ let regressed = ReportCrates :: Complete {
224
+ tree : regr_tree,
225
+ results : regr_root,
226
+ } ;
227
+
228
+ let fix_tree = create_results ! { crates,
229
+ reg!( "ce-1" ) => ( "fix-1" ) ,
230
+ reg!( "ce-2" ) => ( "fix-1" )
231
+ } ;
232
+
233
+ let fix_root = create_results ! { crates,
234
+ TestResult :: BuildFail ( Unknown ) => ( "fix-2" )
235
+ } ;
236
+
237
+ let fixed = ReportCrates :: Complete {
238
+ tree : fix_tree,
239
+ results : fix_root,
240
+ } ;
241
+
242
+ let test_pass = ReportCrates :: Plain ( vec ! [ crates. remove( "test-pass" ) . unwrap( ) ] ) ;
243
+
244
+ let mut categories = HashMap :: new ( ) ;
245
+ categories. insert ( Comparison :: Regressed , regressed) ;
246
+ categories. insert ( Comparison :: Fixed , fixed) ;
247
+ categories. insert ( Comparison :: SameTestPass , test_pass) ;
248
+
249
+ let expected = TestResults { categories, info } ;
250
+ assert_eq ! ( expected, analyzed) ;
251
+
252
+ Ok ( ( ) )
253
+ }
254
+ }
0 commit comments