diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-05-31 12:37:05 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-05-31 12:37:05 +0200 |
| commit | 9bbebd69ddb4a7d7da98c3a79ff7d0cb187873fd (patch) | |
| tree | 0fc651f43337d65e13cccb2bbe85ab1b79666725 /tests | |
| parent | 08a6188123ad0806986fa4f5477b728a07d081cc (diff) | |
Numbered spans
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/typeset.rs | 64 |
1 files changed, 37 insertions, 27 deletions
diff --git a/tests/typeset.rs b/tests/typeset.rs index 2eb847ce..56cde751 100644 --- a/tests/typeset.rs +++ b/tests/typeset.rs @@ -9,7 +9,7 @@ use tiny_skia as sk; use unscanny::Scanner; use walkdir::WalkDir; -use typst::diag::Error; +use typst::diag::ErrorPos; use typst::eval::{Smart, Value}; use typst::frame::{Element, Frame}; use typst::geom::{Length, RgbaColor, Sides}; @@ -18,7 +18,6 @@ use typst::library::text::{TextNode, TextSize}; use typst::loading::FsLoader; use typst::model::StyleMap; use typst::source::SourceFile; -use typst::syntax::Span; use typst::{bail, Config, Context}; const TYP_DIR: &str = "./typ"; @@ -301,7 +300,7 @@ fn test_part( ok &= test_reparse(ctx.sources.get(id).src(), i, rng); - let (mut frames, mut errors) = match typst::typeset(ctx, id) { + let (mut frames, errors) = match typst::typeset(ctx, id) { Ok(frames) => (frames, vec![]), Err(errors) => (vec![], *errors), }; @@ -311,15 +310,24 @@ fn test_part( frames.clear(); } - // TODO: Also handle errors from other files. - errors.retain(|error| error.span.source == id); - for error in &mut errors { - error.trace.clear(); - } + // Map errors to range and message format, discard traces and errors from + // other files. + let mut errors: Vec<_> = errors + .into_iter() + .filter(|error| error.span.source() == id) + .map(|error| { + let mut range = ctx.sources.range(error.span); + match error.pos { + ErrorPos::Start => range.end = range.start, + ErrorPos::Full => {} + ErrorPos::End => range.start = range.end, + } + (range, error.message) + }) + .collect(); - // The comparison never fails since all spans are from the same source file. - ref_errors.sort_by(|a, b| a.span.partial_cmp(&b.span).unwrap()); - errors.sort_by(|a, b| a.span.partial_cmp(&b.span).unwrap()); + errors.sort_by_key(|error| error.0.start); + ref_errors.sort_by_key(|error| error.0.start); if errors != ref_errors { println!(" Subtest {i} does not match expected errors. ❌"); @@ -327,7 +335,7 @@ fn test_part( let source = ctx.sources.get(id); for error in errors.iter() { - if error.span.source == id && !ref_errors.contains(error) { + if !ref_errors.contains(error) { print!(" Not annotated | "); print_error(&source, line, error); } @@ -344,7 +352,7 @@ fn test_part( (ok, compare_ref, frames) } -fn parse_metadata(source: &SourceFile) -> (Option<bool>, Vec<Error>) { +fn parse_metadata(source: &SourceFile) -> (Option<bool>, Vec<(Range<usize>, String)>) { let mut compare_ref = None; let mut errors = vec![]; @@ -382,23 +390,24 @@ fn parse_metadata(source: &SourceFile) -> (Option<bool>, Vec<Error>) { let mut s = Scanner::new(rest); let start = pos(&mut s); let end = if s.eat_if('-') { pos(&mut s) } else { start }; - let span = Span::new(source.id(), start, end); + let range = start .. end; - errors.push(Error::new(span, s.after().trim())); + errors.push((range, s.after().trim().to_string())); } (compare_ref, errors) } -fn print_error(source: &SourceFile, line: usize, error: &Error) { - let start_line = 1 + line + source.byte_to_line(error.span.start).unwrap(); - let start_col = 1 + source.byte_to_column(error.span.start).unwrap(); - let end_line = 1 + line + source.byte_to_line(error.span.end).unwrap(); - let end_col = 1 + source.byte_to_column(error.span.end).unwrap(); - println!( - "Error: {start_line}:{start_col}-{end_line}:{end_col}: {}", - error.message, - ); +fn print_error( + source: &SourceFile, + line: usize, + (range, message): &(Range<usize>, String), +) { + let start_line = 1 + line + source.byte_to_line(range.start).unwrap(); + let start_col = 1 + source.byte_to_column(range.start).unwrap(); + let end_line = 1 + line + source.byte_to_line(range.end).unwrap(); + let end_col = 1 + source.byte_to_column(range.end).unwrap(); + println!("Error: {start_line}:{start_col}-{end_line}:{end_col}: {message}"); } /// Pseudorandomly edit the source file and test whether a reparse produces the @@ -487,10 +496,11 @@ fn test_reparse(src: &str, i: usize, rng: &mut LinearShift) -> bool { ok &= apply(start .. end, supplement); } - let leafs = typst::parse::parse(src).leafs(); - let leaf_start = leafs[pick(0 .. leafs.len())].span().start; + let source = SourceFile::detached(src); + let leafs = source.root().leafs(); + let start = source.range(leafs[pick(0 .. leafs.len())].span()).start; let supplement = supplements[pick(0 .. supplements.len())]; - ok &= apply(leaf_start .. leaf_start, supplement); + ok &= apply(start .. start, supplement); ok } |
