mirror of
https://github.com/rust-lang/cargo.git
synced 2025-10-01 11:30:39 +00:00
Improve test output
This commit is contained in:
parent
4e6c3bd10a
commit
51432d488a
@ -1 +1 @@
|
|||||||
Subproject commit 3e6218afdc17dcdd456f7ad2be38e2fbba493983
|
Subproject commit c085c639ac06909301707721b174e83f40bbac70
|
@ -1 +1 @@
|
|||||||
Subproject commit 76cf3d1d3ef0fb21ade21d313d8b67b65ed7e8ac
|
Subproject commit a3c7f2c38ef795ad34e225ca54fa6bf625e8a842
|
@ -14,7 +14,7 @@ use cargo::ops;
|
|||||||
use cargo::{execute_main_without_stdin};
|
use cargo::{execute_main_without_stdin};
|
||||||
use cargo::core::{MultiShell};
|
use cargo::core::{MultiShell};
|
||||||
use cargo::util;
|
use cargo::util;
|
||||||
use cargo::util::{CliResult, CliError, CargoError};
|
use cargo::util::{CliResult, CliError, human};
|
||||||
use cargo::util::important_paths::find_project_manifest;
|
use cargo::util::important_paths::find_project_manifest;
|
||||||
|
|
||||||
#[deriving(PartialEq,Clone,Decodable)]
|
#[deriving(PartialEq,Clone,Decodable)]
|
||||||
@ -62,9 +62,7 @@ fn execute(options: Options, shell: &mut MultiShell) -> CliResult<Option<()>> {
|
|||||||
for file in test_executables.iter() {
|
for file in test_executables.iter() {
|
||||||
try!(util::process(test_dir.join(file.as_slice()))
|
try!(util::process(test_dir.join(file.as_slice()))
|
||||||
.args(options.rest.as_slice())
|
.args(options.rest.as_slice())
|
||||||
.exec().map_err(|e| {
|
.exec().map_err(|_| CliError::from_boxed(human(""), 1)));
|
||||||
CliError::from_boxed(e.box_error(), 1)
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(None)
|
Ok(None)
|
||||||
|
@ -196,7 +196,8 @@ fn rustc(package: &Package, target: &Target,
|
|||||||
} else {
|
} else {
|
||||||
log!(5, "executing deps");
|
log!(5, "executing deps");
|
||||||
try!(rustc.exec_with_output().and(Ok(())).map_err(|err| {
|
try!(rustc.exec_with_output().and(Ok(())).map_err(|err| {
|
||||||
caused_human(format!("Could not compile `{}`.\n{}", name, err.output().unwrap()), err)
|
caused_human(format!("Could not compile `{}`.\n{}",
|
||||||
|
name, err.output().unwrap()), err)
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
Ok(Vec::new())
|
Ok(Vec::new())
|
||||||
|
@ -296,13 +296,38 @@ impl Execs {
|
|||||||
Some(actual) => {
|
Some(actual) => {
|
||||||
// Let's not deal with \r\n vs \n on windows...
|
// Let's not deal with \r\n vs \n on windows...
|
||||||
let actual = actual.replace("\r", "");
|
let actual = actual.replace("\r", "");
|
||||||
|
let actual = actual.replace("\t", "<tab>");
|
||||||
|
|
||||||
|
let a = actual.as_slice().lines();
|
||||||
|
let e = out.lines();
|
||||||
|
|
||||||
|
let diffs = zip_all(a, e).enumerate();
|
||||||
|
let mut diffs = diffs.filter_map(|(i, (a,e))| {
|
||||||
|
match (a, e) {
|
||||||
|
(Some(a), Some(e)) => {
|
||||||
|
if e.as_slice().equiv(&a.as_slice()) {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(format!("{:3} - |{}|\n + |{}|\n", i, e, a))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
(Some(a), None) => {
|
||||||
|
Some(format!("{:3} -\n + |{}|\n", i, a))
|
||||||
|
},
|
||||||
|
(None, Some(e)) => {
|
||||||
|
Some(format!("{:3} - |{}|\n +\n", i, e))
|
||||||
|
},
|
||||||
|
(None, None) => fail!("Cannot get here")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let diffs = diffs.collect::<Vec<String>>().connect("\n");
|
||||||
|
|
||||||
ham::expect(actual.as_slice() == out,
|
ham::expect(actual.as_slice() == out,
|
||||||
format!("{} was:\n\
|
format!("differences:\n\
|
||||||
`{}`\n\n\
|
{}\n\n\
|
||||||
expected:\n\
|
|
||||||
`{}`\n\n\
|
|
||||||
other output:\n\
|
other output:\n\
|
||||||
`{}`", description, actual, out,
|
`{}`", diffs,
|
||||||
String::from_utf8_lossy(extra)))
|
String::from_utf8_lossy(extra)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -311,6 +336,30 @@ impl Execs {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ZipAll<T, I1, I2> {
|
||||||
|
first: I1,
|
||||||
|
second: I2,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T, I1: Iterator<T>, I2: Iterator<T>> Iterator<(Option<T>, Option<T>)> for ZipAll<T, I1, I2> {
|
||||||
|
fn next(&mut self) -> Option<(Option<T>, Option<T>)> {
|
||||||
|
let first = self.first.next();
|
||||||
|
let second = self.second.next();
|
||||||
|
|
||||||
|
match (first, second) {
|
||||||
|
(None, None) => None,
|
||||||
|
(a, b) => Some((a, b))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn zip_all<T, I1: Iterator<T>, I2: Iterator<T>>(a: I1, b: I2) -> ZipAll<T, I1, I2> {
|
||||||
|
ZipAll {
|
||||||
|
first: a,
|
||||||
|
second: b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl ham::SelfDescribing for Execs {
|
impl ham::SelfDescribing for Execs {
|
||||||
fn describe(&self) -> String {
|
fn describe(&self) -> String {
|
||||||
"execs".to_string()
|
"execs".to_string()
|
||||||
|
@ -35,7 +35,47 @@ test!(cargo_test_simple {
|
|||||||
execs().with_stdout(format!("{} foo v0.5.0 (file:{})\n\n\
|
execs().with_stdout(format!("{} foo v0.5.0 (file:{})\n\n\
|
||||||
running 1 test\n\
|
running 1 test\n\
|
||||||
test test_hello ... ok\n\n\
|
test test_hello ... ok\n\n\
|
||||||
test result: ok. 1 passed; 0 failed; \
|
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured\n\n",
|
||||||
|
COMPILING, p.root().display())));
|
||||||
|
|
||||||
|
assert_that(&p.bin("test/foo"), existing_file());
|
||||||
|
})
|
||||||
|
|
||||||
|
test!(cargo_test_failing_test {
|
||||||
|
let p = project("foo")
|
||||||
|
.file("Cargo.toml", basic_bin_manifest("foo").as_slice())
|
||||||
|
.file("src/foo.rs", r#"
|
||||||
|
fn hello() -> &'static str {
|
||||||
|
"hello"
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
println!("{}", hello())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_hello() {
|
||||||
|
assert_eq!(hello(), "nope")
|
||||||
|
}"#);
|
||||||
|
|
||||||
|
assert_that(p.cargo_process("cargo-build"), execs());
|
||||||
|
assert_that(&p.bin("foo"), existing_file());
|
||||||
|
|
||||||
|
assert_that(
|
||||||
|
process(p.bin("foo")),
|
||||||
|
execs().with_stdout("hello\n"));
|
||||||
|
|
||||||
|
assert_that(p.process(cargo_dir().join("cargo-test")),
|
||||||
|
execs().with_stdout(format!("{} foo v0.5.0 (file:{})\n\n\
|
||||||
|
running 1 test\n\
|
||||||
|
test test_hello ... FAILED\n\n\
|
||||||
|
failures:\n\n\
|
||||||
|
---- test_hello stdout ----\n<tab>\
|
||||||
|
task 'test_hello' failed at 'assertion failed: \
|
||||||
|
`(left == right) && (right == left)` (left: \
|
||||||
|
`hello`, right: `nope`)', src/foo.rs:12\n<tab>\n<tab>\n\n\
|
||||||
|
failures:\n test_hello\n\n\
|
||||||
|
test result: FAILED. 0 passed; 1 failed; \
|
||||||
0 ignored; 0 measured\n\n",
|
0 ignored; 0 measured\n\n",
|
||||||
COMPILING, p.root().display())));
|
COMPILING, p.root().display())));
|
||||||
|
|
||||||
@ -85,7 +125,6 @@ test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured";
|
|||||||
let head = format!("{compiling} foo v0.0.1 (file:{dir})",
|
let head = format!("{compiling} foo v0.0.1 (file:{dir})",
|
||||||
compiling = COMPILING, dir = p.root().display());
|
compiling = COMPILING, dir = p.root().display());
|
||||||
|
|
||||||
println!("{}", out);
|
|
||||||
assert!(out == format!("{}\n\n{}\n\n\n{}\n\n", head, bin, lib).as_slice() ||
|
assert!(out == format!("{}\n\n{}\n\n\n{}\n\n", head, bin, lib).as_slice() ||
|
||||||
out == format!("{}\n\n{}\n\n\n{}\n\n", head, lib, bin).as_slice());
|
out == format!("{}\n\n{}\n\n\n{}\n\n", head, lib, bin).as_slice());
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user