Skip to content

Commit

Permalink
Add a --color flag to test binaries
Browse files Browse the repository at this point in the history
It uses the same behavior as rustc's.
  • Loading branch information
sfackler authored and alexcrichton committed Jun 10, 2014
1 parent 9faf5a3 commit 5eb4d19
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 4 deletions.
1 change: 1 addition & 0 deletions src/compiletest/compiletest.rs
Expand Up @@ -292,6 +292,7 @@ pub fn test_opts(config: &Config) -> test::TestOpts {
save_metrics: config.save_metrics.clone(),
test_shard: config.test_shard.clone(),
nocapture: false,
color: test::AutoColor,
}
}

Expand Down
35 changes: 31 additions & 4 deletions src/libtest/lib.rs
Expand Up @@ -271,6 +271,12 @@ pub fn test_main_static_x(args: &[~str], tests: &[TestDescAndFn]) {
tests)
}

pub enum ColorConfig {
AutoColor,
AlwaysColor,
NeverColor,
}

pub struct TestOpts {
pub filter: Option<Regex>,
pub run_ignored: bool,
Expand All @@ -282,6 +288,7 @@ pub struct TestOpts {
pub test_shard: Option<(uint,uint)>,
pub logfile: Option<Path>,
pub nocapture: bool,
pub color: ColorConfig,
}

impl TestOpts {
Expand All @@ -298,6 +305,7 @@ impl TestOpts {
test_shard: None,
logfile: None,
nocapture: false,
color: AutoColor,
}
}
}
Expand All @@ -324,7 +332,11 @@ fn optgroups() -> Vec<getopts::OptGroup> {
getopts::optopt("", "test-shard", "run shard A, of B shards, worth of the testsuite",
"A.B"),
getopts::optflag("", "nocapture", "don't capture stdout/stderr of each \
task, allow printing directly"))
task, allow printing directly"),
getopts::optopt("", "color", "Configure coloring of output:
auto = colorize if stdout is a tty and tests are run on serially (default);
always = always colorize output;
never = never colorize output;", "auto|always|never"))
}

fn usage(binary: &str) {
Expand Down Expand Up @@ -406,6 +418,16 @@ pub fn parse_opts(args: &[String]) -> Option<OptRes> {
nocapture = os::getenv("RUST_TEST_NOCAPTURE").is_some();
}

let color = match matches.opt_str("color").as_ref().map(|s| s.as_slice()) {
Some("auto") | None => AutoColor,
Some("always") => AlwaysColor,
Some("never") => NeverColor,

Some(v) => return Some(Err(format!("argument for --color must be \
auto, always, or never (was {})",
v))),
};

let test_opts = TestOpts {
filter: filter,
run_ignored: run_ignored,
Expand All @@ -417,6 +439,7 @@ pub fn parse_opts(args: &[String]) -> Option<OptRes> {
test_shard: test_shard,
logfile: logfile,
nocapture: nocapture,
color: color,
};

Some(Ok(test_opts))
Expand Down Expand Up @@ -492,7 +515,7 @@ impl<T: Writer> ConsoleTestState<T> {
Ok(ConsoleTestState {
out: out,
log_out: log_out,
use_color: use_color(),
use_color: use_color(opts),
total: 0u,
passed: 0u,
failed: 0u,
Expand Down Expand Up @@ -867,8 +890,12 @@ fn should_sort_failures_before_printing_them() {
assert!(apos < bpos);
}

fn use_color() -> bool {
get_concurrency() == 1 && io::stdout().get_ref().isatty()
fn use_color(opts: &TestOpts) -> bool {
match opts.color {
AutoColor => get_concurrency() == 1 && io::stdout().get_ref().isatty(),
AlwaysColor => true,
NeverColor => false,
}
}

#[deriving(Clone)]
Expand Down

0 comments on commit 5eb4d19

Please sign in to comment.