| use common::config; |
| use io::ReaderUtil; |
| |
| export load_errors; |
| export expected_error; |
| |
| type expected_error = { line: uint, kind: ~str, msg: ~str }; |
| |
| // Load any test directives embedded in the file |
| fn load_errors(testfile: &Path) -> ~[expected_error] { |
| let mut error_patterns = ~[]; |
| let rdr = io::file_reader(testfile).get(); |
| let mut line_num = 1u; |
| while !rdr.eof() { |
| let ln = rdr.read_line(); |
| error_patterns += parse_expected(line_num, ln); |
| line_num += 1u; |
| } |
| return error_patterns; |
| } |
| |
| fn parse_expected(line_num: uint, line: ~str) -> ~[expected_error] unsafe { |
| let error_tag = ~"//~"; |
| let mut idx; |
| match str::find_str(line, error_tag) { |
| option::None => return ~[], |
| option::Some(nn) => { idx = (nn as uint) + str::len(error_tag); } |
| } |
| |
| // "//~^^^ kind msg" denotes a message expected |
| // three lines above current line: |
| let mut adjust_line = 0u; |
| let len = str::len(line); |
| while idx < len && line[idx] == ('^' as u8) { |
| adjust_line += 1u; |
| idx += 1u; |
| } |
| |
| // Extract kind: |
| while idx < len && line[idx] == (' ' as u8) { idx += 1u; } |
| let start_kind = idx; |
| while idx < len && line[idx] != (' ' as u8) { idx += 1u; } |
| let kind = str::to_lower(str::slice(line, start_kind, idx)); |
| |
| // Extract msg: |
| while idx < len && line[idx] == (' ' as u8) { idx += 1u; } |
| let msg = str::slice(line, idx, len); |
| |
| debug!("line=%u kind=%s msg=%s", line_num - adjust_line, kind, msg); |
| |
| return ~[{line: line_num - adjust_line, kind: kind, msg: msg}]; |
| } |