changed termination_trait's bound from Error to Debug; added compiletest header command and appropriate tests

This commit is contained in:
Brad Gibson
2018-02-11 16:38:26 -08:00
parent 0bb8935136
commit 7948afdc53
11 changed files with 77 additions and 18 deletions

View File

@@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
use error::Error; use fmt::Debug;
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
mod exit { mod exit {
pub const SUCCESS: i32 = 0; pub const SUCCESS: i32 = 0;
@@ -45,27 +45,18 @@ impl Termination for () {
} }
#[unstable(feature = "termination_trait", issue = "43301")] #[unstable(feature = "termination_trait", issue = "43301")]
impl<T: Termination, E: Error> Termination for Result<T, E> { impl<T: Termination, E: Debug> Termination for Result<T, E> {
fn report(self) -> i32 { fn report(self) -> i32 {
match self { match self {
Ok(val) => val.report(), Ok(val) => val.report(),
Err(err) => { Err(err) => {
print_error(err); eprintln!("Error: {:?}", err);
exit::FAILURE exit::FAILURE
} }
} }
} }
} }
#[unstable(feature = "termination_trait", issue = "43301")]
fn print_error<E: Error>(err: E) {
eprintln!("Error: {}", err.description());
if let Some(ref err) = err.cause() {
eprintln!("Caused by: {}", err.description());
}
}
#[unstable(feature = "termination_trait", issue = "43301")] #[unstable(feature = "termination_trait", issue = "43301")]
impl Termination for ! { impl Termination for ! {
fn report(self) -> i32 { unreachable!(); } fn report(self) -> i32 { unreachable!(); }

View File

@@ -0,0 +1,20 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// must-compile-successfully
// failure-status: 1
#![feature(termination_trait)]
use std::io::{Error, ErrorKind};
fn main() -> Result<(), Box<Error>> {
Err(Box::new(Error::new(ErrorKind::Other, "returned Box<Error> from main()")))
}

View File

@@ -0,0 +1,17 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(termination_trait)]
use std::io::Error;
fn main() -> Result<(), Box<Error>> {
Ok(())
}

View File

@@ -0,0 +1,17 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(termination_trait)]
use std::io::Error;
fn main() -> Result<(), Box<Error>> {
Ok(())
}

View File

@@ -232,6 +232,7 @@ pub struct TestProps {
// customized normalization rules // customized normalization rules
pub normalize_stdout: Vec<(String, String)>, pub normalize_stdout: Vec<(String, String)>,
pub normalize_stderr: Vec<(String, String)>, pub normalize_stderr: Vec<(String, String)>,
pub failure_status: i32,
} }
impl TestProps { impl TestProps {
@@ -260,6 +261,7 @@ impl TestProps {
run_pass: false, run_pass: false,
normalize_stdout: vec![], normalize_stdout: vec![],
normalize_stderr: vec![], normalize_stderr: vec![],
failure_status: 101,
} }
} }
@@ -383,6 +385,10 @@ impl TestProps {
if let Some(rule) = config.parse_custom_normalization(ln, "normalize-stderr") { if let Some(rule) = config.parse_custom_normalization(ln, "normalize-stderr") {
self.normalize_stderr.push(rule); self.normalize_stderr.push(rule);
} }
if let Some(code) = config.parse_failure_status(ln) {
self.failure_status = code;
}
}); });
for key in &["RUST_TEST_NOCAPTURE", "RUST_TEST_THREADS"] { for key in &["RUST_TEST_NOCAPTURE", "RUST_TEST_THREADS"] {
@@ -488,6 +494,13 @@ impl Config {
self.parse_name_directive(line, "pretty-compare-only") self.parse_name_directive(line, "pretty-compare-only")
} }
fn parse_failure_status(&self, line: &str) -> Option<i32> {
match self.parse_name_value_directive(line, "failure-status") {
Some(code) => code.trim().parse::<i32>().ok(),
_ => None,
}
}
fn parse_must_compile_successfully(&self, line: &str) -> bool { fn parse_must_compile_successfully(&self, line: &str) -> bool {
self.parse_name_directive(line, "must-compile-successfully") self.parse_name_directive(line, "must-compile-successfully")
} }

View File

@@ -295,11 +295,14 @@ impl<'test> TestCx<'test> {
} }
fn check_correct_failure_status(&self, proc_res: &ProcRes) { fn check_correct_failure_status(&self, proc_res: &ProcRes) {
// The value the rust runtime returns on failure let expected_status = Some(self.props.failure_status);
const RUST_ERR: i32 = 101; let received_status = proc_res.status.code();
if proc_res.status.code() != Some(RUST_ERR) {
if expected_status != received_status {
self.fatal_proc_rec( self.fatal_proc_rec(
&format!("failure produced the wrong error: {}", proc_res.status), &format!("Error: expected failure status ({:?}) but received status {:?}.",
expected_status,
received_status),
proc_res, proc_res,
); );
} }
@@ -320,7 +323,6 @@ impl<'test> TestCx<'test> {
); );
let proc_res = self.exec_compiled_test(); let proc_res = self.exec_compiled_test();
if !proc_res.status.success() { if !proc_res.status.success() {
self.fatal_proc_rec("test run failed!", &proc_res); self.fatal_proc_rec("test run failed!", &proc_res);
} }
@@ -499,7 +501,6 @@ impl<'test> TestCx<'test> {
expected, expected,
actual actual
); );
panic!();
} }
} }