1
1
use environment:: Environment ;
2
2
use error_chain:: ChainedError ;
3
3
use errors:: * ;
4
- use output:: { OutputAssertion , OutputKind } ;
4
+ use output:: { Output , OutputKind , OutputPredicate } ;
5
5
use std:: default;
6
6
use std:: ffi:: { OsStr , OsString } ;
7
7
use std:: io:: Write ;
@@ -18,7 +18,7 @@ pub struct Assert {
18
18
current_dir : Option < PathBuf > ,
19
19
expect_success : Option < bool > ,
20
20
expect_exit_code : Option < i32 > ,
21
- expect_output : Vec < OutputAssertion > ,
21
+ expect_output : Vec < OutputPredicate > ,
22
22
stdin_contents : Option < String > ,
23
23
}
24
24
@@ -289,7 +289,6 @@ impl Assert {
289
289
OutputAssertionBuilder {
290
290
assertion : self ,
291
291
kind : OutputKind :: StdOut ,
292
- expected_result : true ,
293
292
}
294
293
}
295
294
@@ -310,7 +309,6 @@ impl Assert {
310
309
OutputAssertionBuilder {
311
310
assertion : self ,
312
311
kind : OutputKind :: StdErr ,
313
- expected_result : true ,
314
312
}
315
313
}
316
314
@@ -327,10 +325,10 @@ impl Assert {
327
325
/// assert!(test.is_ok());
328
326
/// ```
329
327
pub fn execute ( self ) -> Result < ( ) > {
330
- let cmd = & self . cmd [ 0 ] ;
328
+ let bin = & self . cmd [ 0 ] ;
331
329
332
330
let args: Vec < _ > = self . cmd . iter ( ) . skip ( 1 ) . collect ( ) ;
333
- let mut command = Command :: new ( cmd ) ;
331
+ let mut command = Command :: new ( bin ) ;
334
332
let command = command
335
333
. stdin ( Stdio :: piped ( ) )
336
334
. stdout ( Stdio :: piped ( ) )
@@ -361,30 +359,23 @@ impl Assert {
361
359
if expect_success != output. status . success ( ) {
362
360
let out = String :: from_utf8_lossy ( & output. stdout ) . to_string ( ) ;
363
361
let err = String :: from_utf8_lossy ( & output. stderr ) . to_string ( ) ;
364
- bail ! ( ErrorKind :: StatusMismatch (
365
- self . cmd. clone( ) ,
366
- expect_success,
367
- out,
368
- err,
369
- ) ) ;
362
+ let err: Error = ErrorKind :: StatusMismatch ( expect_success, out, err) . into ( ) ;
363
+ bail ! ( err. chain_err( || ErrorKind :: AssertionFailed ( self . cmd. clone( ) ) ) ) ;
370
364
}
371
365
}
372
366
373
367
if self . expect_exit_code . is_some ( ) && self . expect_exit_code != output. status . code ( ) {
374
368
let out = String :: from_utf8_lossy ( & output. stdout ) . to_string ( ) ;
375
369
let err = String :: from_utf8_lossy ( & output. stderr ) . to_string ( ) ;
376
- bail ! ( ErrorKind :: ExitCodeMismatch (
377
- self . cmd. clone( ) ,
378
- self . expect_exit_code,
379
- output. status. code( ) ,
380
- out,
381
- err,
382
- ) ) ;
370
+ let err: Error =
371
+ ErrorKind :: ExitCodeMismatch ( self . expect_exit_code , output. status . code ( ) , out, err)
372
+ . into ( ) ;
373
+ bail ! ( err. chain_err( || ErrorKind :: AssertionFailed ( self . cmd. clone( ) ) ) ) ;
383
374
}
384
375
385
376
self . expect_output
386
377
. iter ( )
387
- . map ( |a| a. execute ( & output, & self . cmd ) )
378
+ . map ( |a| a. verify_output ( & output) . chain_err ( || ErrorKind :: AssertionFailed ( self . cmd . clone ( ) ) ) )
388
379
. collect :: < Result < Vec < ( ) > > > ( ) ?;
389
380
390
381
Ok ( ( ) )
@@ -414,28 +405,9 @@ impl Assert {
414
405
pub struct OutputAssertionBuilder {
415
406
assertion : Assert ,
416
407
kind : OutputKind ,
417
- expected_result : bool ,
418
408
}
419
409
420
410
impl OutputAssertionBuilder {
421
- /// Negate the assertion predicate
422
- ///
423
- /// # Examples
424
- ///
425
- /// ```rust
426
- /// extern crate assert_cli;
427
- ///
428
- /// assert_cli::Assert::command(&["echo", "42"])
429
- /// .stdout().not().contains("73")
430
- /// .unwrap();
431
- /// ```
432
- // No clippy, we don't want to implement std::ops::Not :)
433
- #[ cfg_attr( feature = "cargo-clippy" , allow( should_implement_trait) ) ]
434
- pub fn not ( mut self ) -> Self {
435
- self . expected_result = !self . expected_result ;
436
- self
437
- }
438
-
439
411
/// Expect the command's output to **contain** `output`.
440
412
///
441
413
/// # Examples
@@ -448,12 +420,8 @@ impl OutputAssertionBuilder {
448
420
/// .unwrap();
449
421
/// ```
450
422
pub fn contains < O : Into < String > > ( mut self , output : O ) -> Assert {
451
- self . assertion . expect_output . push ( OutputAssertion {
452
- expect : output. into ( ) ,
453
- fuzzy : true ,
454
- expected_result : self . expected_result ,
455
- kind : self . kind ,
456
- } ) ;
423
+ let pred = OutputPredicate :: new ( self . kind , Output :: contains ( output) ) ;
424
+ self . assertion . expect_output . push ( pred) ;
457
425
self . assertion
458
426
}
459
427
@@ -469,12 +437,8 @@ impl OutputAssertionBuilder {
469
437
/// .unwrap();
470
438
/// ```
471
439
pub fn is < O : Into < String > > ( mut self , output : O ) -> Assert {
472
- self . assertion . expect_output . push ( OutputAssertion {
473
- expect : output. into ( ) ,
474
- fuzzy : false ,
475
- expected_result : self . expected_result ,
476
- kind : self . kind ,
477
- } ) ;
440
+ let pred = OutputPredicate :: new ( self . kind , Output :: is ( output) ) ;
441
+ self . assertion . expect_output . push ( pred) ;
478
442
self . assertion
479
443
}
480
444
@@ -489,8 +453,10 @@ impl OutputAssertionBuilder {
489
453
/// .stdout().doesnt_contain("73")
490
454
/// .unwrap();
491
455
/// ```
492
- pub fn doesnt_contain < O : Into < String > > ( self , output : O ) -> Assert {
493
- self . not ( ) . contains ( output)
456
+ pub fn doesnt_contain < O : Into < String > > ( mut self , output : O ) -> Assert {
457
+ let pred = OutputPredicate :: new ( self . kind , Output :: doesnt_contain ( output) ) ;
458
+ self . assertion . expect_output . push ( pred) ;
459
+ self . assertion
494
460
}
495
461
496
462
/// Expect the command to output to not be **exactly** this `output`.
@@ -504,8 +470,10 @@ impl OutputAssertionBuilder {
504
470
/// .stdout().isnt("73")
505
471
/// .unwrap();
506
472
/// ```
507
- pub fn isnt < O : Into < String > > ( self , output : O ) -> Assert {
508
- self . not ( ) . is ( output)
473
+ pub fn isnt < O : Into < String > > ( mut self , output : O ) -> Assert {
474
+ let pred = OutputPredicate :: new ( self . kind , Output :: isnt ( output) ) ;
475
+ self . assertion . expect_output . push ( pred) ;
476
+ self . assertion
509
477
}
510
478
}
511
479
@@ -522,7 +490,7 @@ mod test {
522
490
fn take_ownership ( ) {
523
491
let x = Environment :: inherit ( ) ;
524
492
525
- command ( ) . with_env ( x. clone ( ) ) . with_env ( & x) . with_env ( x) ;
493
+ command ( ) . with_env ( x. clone ( ) ) . with_env ( & x) . with_env ( x) . unwrap ( ) ;
526
494
}
527
495
528
496
#[ test]
@@ -564,8 +532,7 @@ mod test {
564
532
command ( )
565
533
. with_env ( y)
566
534
. stdout ( )
567
- . not ( )
568
- . contains ( "key=value" )
535
+ . doesnt_contain ( "key=value" )
569
536
. execute ( )
570
537
. unwrap ( ) ;
571
538
}
0 commit comments