use std::collections::{HashMap, HashSet};
use std::env;
use std::fs;
-use std::io::{self, BufRead, BufReader, Read};
+use std::io::{self, BufRead, BufReader, Read, Write};
use std::iter::{Enumerate, Peekable};
use std::path::{Path, PathBuf};
use std::str::Chars;
-use config::summary::Summary;
-use config::{Color, Config, ReportTactic};
-use rustfmt_diff::*;
-use *;
+use config::{Color, Config, EmitMode, FileName, ReportTactic};
+use filemap;
+use formatting::{FileMap, ModifiedChunk, Summary};
+use rustfmt_diff::{make_diff, print_diff, DiffLine, Mismatch, OutputWriter};
+use {FormatReport, Input, Session};
const DIFF_CONTEXT_SIZE: usize = 3;
const CONFIGURATIONS_FILE_NAME: &str = "Configurations.md";
#[test]
fn modified_test() {
+ use std::io::BufRead;
+
// Test "modified" output
let filename = "tests/writemode/source/modified.rs";
- let result = get_modified_lines(Input::File(filename.into()), &Config::default()).unwrap();
- assert_eq!(
- result,
- ModifiedLines {
- chunks: vec![
- ModifiedChunk {
- line_number_orig: 4,
- lines_removed: 4,
- lines: vec!["fn blah() {}".into()],
- },
- ModifiedChunk {
- line_number_orig: 9,
- lines_removed: 6,
- lines: vec!["#[cfg(a, b)]".into(), "fn main() {}".into()],
- },
- ],
+ let mut data = Vec::new();
+ let mut config = Config::default();
+ config.set().emit_mode(::config::EmitMode::ModifiedLines);
+
+ {
+ let mut session = Session::new(config, Some(&mut data));
+ session.format(Input::File(filename.into())).unwrap();
+ }
+
+ let mut lines = data.lines();
+ let mut chunks = Vec::new();
+ while let Some(Ok(header)) = lines.next() {
+ // Parse the header line
+ let values: Vec<_> = header
+ .split(' ')
+ .map(|s| s.parse::<u32>().unwrap())
+ .collect();
+ assert_eq!(values.len(), 3);
+ let line_number_orig = values[0];
+ let lines_removed = values[1];
+ let num_added = values[2];
+ let mut added_lines = Vec::new();
+ for _ in 0..num_added {
+ added_lines.push(lines.next().unwrap().unwrap());
}
+ chunks.push(ModifiedChunk {
+ line_number_orig,
+ lines_removed,
+ lines: added_lines,
+ });
+ }
+
+ assert_eq!(
+ chunks,
+ vec![
+ ModifiedChunk {
+ line_number_orig: 4,
+ lines_removed: 4,
+ lines: vec!["fn blah() {}".into()],
+ },
+ ModifiedChunk {
+ line_number_orig: 9,
+ lines_removed: 6,
+ lines: vec!["#[cfg(a, b)]".into(), "fn main() {}".into()],
+ },
+ ],
);
}
// to a known output file generated by one of the write modes.
fn assert_output(source: &Path, expected_filename: &Path) {
let config = read_config(source);
- let (_error_summary, file_map, _report) = format_file(source, &config);
+ let (_, file_map, _) = format_file(source, config.clone());
// Populate output by writing to a vec.
let mut out = vec![];
let mut config = Config::default();
config.set().emit_mode(EmitMode::Stdout);
let mut buf: Vec<u8> = vec![];
- let (error_summary, _) = format_input(input, &config, Some(&mut buf)).unwrap();
- assert!(error_summary.has_no_errors());
+ {
+ let mut session = Session::new(config, Some(&mut buf));
+ session.format(input).unwrap();
+ assert!(session.summary.has_no_errors());
+ }
//eprintln!("{:?}", );
+ #[cfg(not(windows))]
assert_eq!(buf, "fn main() {}\n".as_bytes());
+ #[cfg(windows)]
+ assert_eq!(buf, "fn main() {}\r\n".as_bytes());
}
// FIXME(#1990) restore this test
let input = Input::Text(format!("fn {}() {{}}", long_identifier));
let mut config = Config::default();
config.set().error_on_line_overflow(true);
- let (error_summary, _) = format_input::<io::Stdout>(input, &config, None).unwrap();
- assert!(error_summary.has_formatting_errors());
+ let mut session = Session::<io::Stdout>::new(config, None);
+ session.format(input).unwrap();
+ assert!(session.summary.has_formatting_errors());
}
#[test]
let mut config = Config::default();
config.set().error_on_line_overflow(true);
config.set().hard_tabs(true);
- let (error_summary, _) = format_input::<io::Stdout>(input, &config, None).unwrap();
- assert!(error_summary.has_formatting_errors());
+ let mut session = Session::<io::Stdout>::new(config, None);
+ session.format(input).unwrap();
+ assert!(session.summary.has_formatting_errors());
}
// For each file, run rustfmt and collect the output.
config
}
-fn format_file<P: Into<PathBuf>>(filepath: P, config: &Config) -> (Summary, FileMap, FormatReport) {
+fn format_file<P: Into<PathBuf>>(filepath: P, config: Config) -> (bool, FileMap, FormatReport) {
let filepath = filepath.into();
let input = Input::File(filepath);
- //format_input::<io::Stdout>(input, config, None).unwrap()
- syntax::with_globals(|| format_input_inner::<io::Stdout>(input, config, None)).unwrap()
+ let mut session = Session::<io::Stdout>::new(config, None);
+ syntax::with_globals(|| {
+ let result = session.format_input_inner(input).unwrap();
+ let parsing_errors = session.summary.has_parsing_errors();
+ (parsing_errors, result.0, result.1)
+ })
}
enum IdempotentCheckError {
} else {
read_config(filename)
};
- let (error_summary, file_map, format_report) = format_file(filename, &config);
- if error_summary.has_parsing_errors() {
+ let (parsing_errors, file_map, format_report) = format_file(filename, config);
+ if parsing_errors {
return Err(IdempotentCheckError::Parse);
}
.unwrap()
.split('\n')
.nth(0)
- .unwrap_or("") == "#![rustfmt::skip]";
+ .unwrap_or("")
+ == "#![rustfmt::skip]";
if self.config_name.is_none() && !fmt_skip {
write_message(&format!(
config.set().emit_mode(EmitMode::Stdout);
let mut buf: Vec<u8> = vec![];
- let (error_summary, _) = format_input(input, &config, Some(&mut buf)).unwrap();
+ {
+ let mut session = Session::new(config, Some(&mut buf));
+ session.format(input).unwrap();
+ if self.has_parsing_errors(session.summary) {
+ return false;
+ }
+ }
- !self.has_parsing_errors(error_summary)
- && !self.formatted_has_diff(&String::from_utf8(buf).unwrap())
+ !self.formatted_has_diff(&String::from_utf8(buf).unwrap())
}
// Extract a code block from the iterator. Behavior: