-// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
+// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Only run tests that match this filter
pub filter: Option<Regex>,
+ // Precompiled regex for finding expected errors in cfail
+ pub cfail_regex: Regex,
+
// Write out a parseable log of tests that were run
pub logfile: Option<Path>,
// Explain what's going on
pub verbose: bool
-
}
-// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
use common::Config;
use common::{Pretty, DebugInfoGdb, Codegen};
use util::logv;
+use regex::Regex;
pub mod procsrv;
pub mod util;
.as_slice()).expect("invalid mode"),
run_ignored: matches.opt_present("ignored"),
filter: filter,
+ cfail_regex: Regex::new(errors::EXPECTED_PATTERN).unwrap(),
logfile: matches.opt_str("logfile").map(|s| Path::new(s)),
save_metrics: matches.opt_str("save-metrics").map(|s| Path::new(s)),
ratchet_metrics:
-// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// except according to those terms.
use std::io::{BufferedReader, File};
+use regex::Regex;
pub struct ExpectedError {
pub line: uint,
pub msg: StrBuf,
}
-// Load any test directives embedded in the file
-pub fn load_errors(testfile: &Path) -> Vec<ExpectedError> {
+pub static EXPECTED_PATTERN : &'static str = r"//~(?P<adjusts>\^*)\s*(?P<kind>\S*)\s*(?P<msg>.*)";
- let mut error_patterns = Vec::new();
+// Load any test directives embedded in the file
+pub fn load_errors(re: &Regex, testfile: &Path) -> Vec<ExpectedError> {
let mut rdr = BufferedReader::new(File::open(testfile).unwrap());
- let mut line_num = 1u;
- for ln in rdr.lines() {
- error_patterns.push_all_move(parse_expected(line_num,
- ln.unwrap().to_strbuf()));
- line_num += 1u;
- }
- return error_patterns;
-}
-
-fn parse_expected(line_num: uint, line: StrBuf) -> Vec<ExpectedError> {
- let line = line.as_slice().trim().to_strbuf();
- let error_tag = "//~".to_strbuf();
- let mut idx;
- match line.as_slice().find_str(error_tag.as_slice()) {
- None => return Vec::new(),
- Some(nn) => { idx = (nn as uint) + error_tag.len(); }
- }
-
- // "//~^^^ kind msg" denotes a message expected
- // three lines above current line:
- let mut adjust_line = 0u;
- let len = line.len();
- while idx < len && line.as_slice()[idx] == ('^' as u8) {
- adjust_line += 1u;
- idx += 1u;
- }
- // Extract kind:
- while idx < len && line.as_slice()[idx] == (' ' as u8) {
- idx += 1u;
- }
- let start_kind = idx;
- while idx < len && line.as_slice()[idx] != (' ' as u8) {
- idx += 1u;
- }
-
- let kind = line.as_slice().slice(start_kind, idx);
- let kind = kind.to_ascii().to_lower().into_str().to_strbuf();
-
- // Extract msg:
- while idx < len && line.as_slice()[idx] == (' ' as u8) {
- idx += 1u;
- }
- let msg = line.as_slice().slice(idx, len).to_strbuf();
-
- debug!("line={} kind={} msg={}", line_num - adjust_line, kind, msg);
+ rdr.lines().enumerate().filter_map(|(line_no, ln)| {
+ parse_expected(line_no + 1, ln.unwrap(), re)
+ }).collect()
+}
- return vec!(ExpectedError{
- line: line_num - adjust_line,
- kind: kind,
- msg: msg,
- });
+fn parse_expected(line_num: uint, line: &str, re: &Regex) -> Option<ExpectedError> {
+ re.captures(line).and_then(|caps| {
+ let adjusts = caps.name("adjusts").len();
+ let kind = caps.name("kind").to_ascii().to_lower().into_str().to_strbuf();
+ let msg = caps.name("msg").trim().to_strbuf();
+
+ debug!("line={} kind={} msg={}", line_num, kind, msg);
+ Some(ExpectedError {
+ line: line_num - adjusts,
+ kind: kind,
+ msg: msg,
+ })
+ })
}
-// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
+// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
check_correct_failure_status(&proc_res);
- let expected_errors = errors::load_errors(testfile);
+ let expected_errors = errors::load_errors(&config.cfail_regex, testfile);
if !expected_errors.is_empty() {
if !props.error_patterns.is_empty() {
fatal("both error pattern and expected errors \