Skip to content

Commit

Permalink
Actually check that .error_position() is correct
Browse files Browse the repository at this point in the history
Check position for zero actually doe not check anything because this is start
position before parse. We move position by 1 by using Text event

failures (36):
    syntax::tag::unclosed3::ns_reader::async_tokio
    syntax::tag::unclosed3::ns_reader::borrowed
    syntax::tag::unclosed3::ns_reader::buffered
    syntax::tag::unclosed3::reader::async_tokio
    syntax::tag::unclosed3::reader::borrowed
    syntax::tag::unclosed3::reader::buffered
    syntax::tag::unclosed4::ns_reader::async_tokio
    syntax::tag::unclosed4::ns_reader::borrowed
    syntax::tag::unclosed4::ns_reader::buffered
    syntax::tag::unclosed4::reader::async_tokio
    syntax::tag::unclosed4::reader::borrowed
    syntax::tag::unclosed4::reader::buffered
    syntax::tag::unclosed5::ns_reader::async_tokio
    syntax::tag::unclosed5::ns_reader::borrowed
    syntax::tag::unclosed5::ns_reader::buffered
    syntax::tag::unclosed5::reader::async_tokio
    syntax::tag::unclosed5::reader::borrowed
    syntax::tag::unclosed5::reader::buffered
    syntax::tag::unclosed6::ns_reader::async_tokio
    syntax::tag::unclosed6::ns_reader::borrowed
    syntax::tag::unclosed6::ns_reader::buffered
    syntax::tag::unclosed6::reader::async_tokio
    syntax::tag::unclosed6::reader::borrowed
    syntax::tag::unclosed6::reader::buffered
    syntax::tag::unclosed7::ns_reader::async_tokio
    syntax::tag::unclosed7::ns_reader::borrowed
    syntax::tag::unclosed7::ns_reader::buffered
    syntax::tag::unclosed7::reader::async_tokio
    syntax::tag::unclosed7::reader::borrowed
    syntax::tag::unclosed7::reader::buffered
    syntax::tag::unclosed8::ns_reader::async_tokio
    syntax::tag::unclosed8::ns_reader::borrowed
    syntax::tag::unclosed8::ns_reader::buffered
    syntax::tag::unclosed8::reader::async_tokio
    syntax::tag::unclosed8::reader::borrowed
    syntax::tag::unclosed8::reader::buffered
  • Loading branch information
Mingun committed Jul 4, 2024
1 parent 2d5c175 commit e4b5e12
Showing 1 changed file with 130 additions and 89 deletions.
219 changes: 130 additions & 89 deletions tests/reader-errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,16 @@ mod syntax {
#[test]
fn borrowed() {
let mut reader = Reader::from_str($xml);
assert_eq!(
reader
.read_event()
.expect("parser should return `Event::Text`"),
Event::Text(BytesText::new("."))
);
match reader.read_event() {
Err(Error::Syntax(cause)) => assert_eq!(
(cause, reader.error_position(), reader.buffer_position()),
($cause, 0, $pos),
($cause, 1, $pos),
),
x => panic!("Expected `Err(Syntax(_))`, but got {:?}", x),
}
Expand All @@ -120,10 +126,16 @@ mod syntax {
fn buffered() {
let mut buf = Vec::new();
let mut reader = Reader::from_str($xml);
assert_eq!(
reader
.read_event_into(&mut buf)
.expect("parser should return `Event::Text`"),
Event::Text(BytesText::new("."))
);
match reader.read_event_into(&mut buf) {
Err(Error::Syntax(cause)) => assert_eq!(
(cause, reader.error_position(), reader.buffer_position()),
($cause, 0, $pos),
($cause, 1, $pos),
),
x => panic!("Expected `Err(Syntax(_))`, but got {:?}", x),
}
Expand All @@ -140,10 +152,17 @@ mod syntax {
async fn async_tokio() {
let mut buf = Vec::new();
let mut reader = Reader::from_str($xml);
assert_eq!(
reader
.read_event_into_async(&mut buf)
.await
.expect("parser should return `Event::Text`"),
Event::Text(BytesText::new("."))
);
match reader.read_event_into_async(&mut buf).await {
Err(Error::Syntax(cause)) => assert_eq!(
(cause, reader.error_position(), reader.buffer_position()),
($cause, 0, $pos),
($cause, 1, $pos),
),
x => panic!("Expected `Err(Syntax(_))`, but got {:?}", x),
}
Expand All @@ -164,10 +183,17 @@ mod syntax {
#[test]
fn borrowed() {
let mut reader = NsReader::from_str($xml);
assert_eq!(
reader
.read_resolved_event()
.expect("parser should return `Event::Text`")
.1,
Event::Text(BytesText::new("."))
);
match reader.read_resolved_event() {
Err(Error::Syntax(cause)) => assert_eq!(
(cause, reader.error_position(), reader.buffer_position()),
($cause, 0, $pos),
($cause, 1, $pos),
),
x => panic!("Expected `Err(Syntax(_))`, but got {:?}", x),
}
Expand All @@ -184,10 +210,17 @@ mod syntax {
fn buffered() {
let mut buf = Vec::new();
let mut reader = NsReader::from_str($xml);
assert_eq!(
reader
.read_resolved_event_into(&mut buf)
.expect("parser should return `Event::Text`")
.1,
Event::Text(BytesText::new("."))
);
match reader.read_resolved_event_into(&mut buf) {
Err(Error::Syntax(cause)) => assert_eq!(
(cause, reader.error_position(), reader.buffer_position()),
($cause, 0, $pos),
($cause, 1, $pos),
),
x => panic!("Expected `Err(Syntax(_))`, but got {:?}", x),
}
Expand All @@ -205,10 +238,18 @@ mod syntax {
async fn async_tokio() {
let mut buf = Vec::new();
let mut reader = NsReader::from_str($xml);
assert_eq!(
reader
.read_resolved_event_into_async(&mut buf)
.await
.expect("parser should return `Event::Text`")
.1,
Event::Text(BytesText::new("."))
);
match reader.read_resolved_event_into_async(&mut buf).await {
Err(Error::Syntax(cause)) => assert_eq!(
(cause, reader.error_position(), reader.buffer_position()),
($cause, 0, $pos),
($cause, 1, $pos),
),
x => panic!("Expected `Err(Syntax(_))`, but got {:?}", x),
}
Expand All @@ -232,14 +273,14 @@ mod syntax {
mod tag {
use super::*;

err!(unclosed1("<") => SyntaxError::UnclosedTag);
err!(unclosed2("</") => SyntaxError::UnclosedTag);
err!(unclosed3("<x") => SyntaxError::UnclosedTag);
err!(unclosed4("< ") => SyntaxError::UnclosedTag);
err!(unclosed5("<\t") => SyntaxError::UnclosedTag);
err!(unclosed6("<\r") => SyntaxError::UnclosedTag);
err!(unclosed7("<\n") => SyntaxError::UnclosedTag);
err!(unclosed8("< \t\r\nx") => SyntaxError::UnclosedTag);
err!(unclosed1(".<") => SyntaxError::UnclosedTag);
err!(unclosed2(".</") => SyntaxError::UnclosedTag);
err!(unclosed3(".<x") => SyntaxError::UnclosedTag);
err!(unclosed4(".< ") => SyntaxError::UnclosedTag);
err!(unclosed5(".<\t") => SyntaxError::UnclosedTag);
err!(unclosed6(".<\r") => SyntaxError::UnclosedTag);
err!(unclosed7(".<\n") => SyntaxError::UnclosedTag);
err!(unclosed8(".< \t\r\nx") => SyntaxError::UnclosedTag);

/// Closed tags can be tested only in pair with open tags, because otherwise
/// `IllFormedError::UnmatchedEndTag` will be raised
Expand Down Expand Up @@ -289,25 +330,25 @@ mod syntax {
}

// Incorrect after-bang symbol is detected early, so buffer_position() stay at `!`
err!(unclosed_bang1("<!") => 1, SyntaxError::InvalidBangMarkup);
err!(unclosed_bang2("<!>") => 1, SyntaxError::InvalidBangMarkup);
err!(unclosed_bang3("<!a") => 1, SyntaxError::InvalidBangMarkup);
err!(unclosed_bang4("<!a>") => 1, SyntaxError::InvalidBangMarkup);
err!(unclosed_bang1(".<!") => 2, SyntaxError::InvalidBangMarkup);
err!(unclosed_bang2(".<!>") => 2, SyntaxError::InvalidBangMarkup);
err!(unclosed_bang3(".<!a") => 2, SyntaxError::InvalidBangMarkup);
err!(unclosed_bang4(".<!a>") => 2, SyntaxError::InvalidBangMarkup);

/// https://www.w3.org/TR/xml11/#NT-Comment
mod comment {
use super::*;

err!(unclosed01("<!-") => SyntaxError::UnclosedComment);
err!(unclosed02("<!--") => SyntaxError::UnclosedComment);
err!(unclosed03("<!->") => SyntaxError::UnclosedComment);
err!(unclosed04("<!-a") => SyntaxError::UnclosedComment);
err!(unclosed05("<!---") => SyntaxError::UnclosedComment);
err!(unclosed06("<!-->") => SyntaxError::UnclosedComment);
err!(unclosed07("<!--b") => SyntaxError::UnclosedComment);
err!(unclosed08("<!----") => SyntaxError::UnclosedComment);
err!(unclosed09("<!--->") => SyntaxError::UnclosedComment);
err!(unclosed10("<!---c") => SyntaxError::UnclosedComment);
err!(unclosed01(".<!-") => SyntaxError::UnclosedComment);
err!(unclosed02(".<!--") => SyntaxError::UnclosedComment);
err!(unclosed03(".<!->") => SyntaxError::UnclosedComment);
err!(unclosed04(".<!-a") => SyntaxError::UnclosedComment);
err!(unclosed05(".<!---") => SyntaxError::UnclosedComment);
err!(unclosed06(".<!-->") => SyntaxError::UnclosedComment);
err!(unclosed07(".<!--b") => SyntaxError::UnclosedComment);
err!(unclosed08(".<!----") => SyntaxError::UnclosedComment);
err!(unclosed09(".<!--->") => SyntaxError::UnclosedComment);
err!(unclosed10(".<!---c") => SyntaxError::UnclosedComment);

ok!(normal1("<!---->") => 7: Event::Comment(BytesText::new("")));
ok!(normal2("<!---->rest") => 7: Event::Comment(BytesText::new("")));
Expand All @@ -317,31 +358,31 @@ mod syntax {
mod cdata {
use super::*;

err!(unclosed01("<![") => SyntaxError::UnclosedCData);
err!(unclosed02("<![C") => SyntaxError::UnclosedCData);
err!(unclosed03("<![a") => SyntaxError::UnclosedCData);
err!(unclosed04("<![>") => SyntaxError::UnclosedCData);
err!(unclosed05("<![CD") => SyntaxError::UnclosedCData);
err!(unclosed06("<![Cb") => SyntaxError::UnclosedCData);
err!(unclosed07("<![C>") => SyntaxError::UnclosedCData);
err!(unclosed08("<![CDA") => SyntaxError::UnclosedCData);
err!(unclosed09("<![CDc") => SyntaxError::UnclosedCData);
err!(unclosed10("<![CD>") => SyntaxError::UnclosedCData);
err!(unclosed11("<![CDAT") => SyntaxError::UnclosedCData);
err!(unclosed12("<![CDAd") => SyntaxError::UnclosedCData);
err!(unclosed13("<![CDA>") => SyntaxError::UnclosedCData);
err!(unclosed14("<![CDATA") => SyntaxError::UnclosedCData);
err!(unclosed15("<![CDATe") => SyntaxError::UnclosedCData);
err!(unclosed16("<![CDAT>") => SyntaxError::UnclosedCData);
err!(unclosed17("<![CDATA[") => SyntaxError::UnclosedCData);
err!(unclosed18("<![CDATAf") => SyntaxError::UnclosedCData);
err!(unclosed19("<![CDATA>") => SyntaxError::UnclosedCData);
err!(unclosed20("<![CDATA[]") => SyntaxError::UnclosedCData);
err!(unclosed21("<![CDATA[g") => SyntaxError::UnclosedCData);
err!(unclosed22("<![CDATA[>") => SyntaxError::UnclosedCData);
err!(unclosed23("<![CDATA[]]") => SyntaxError::UnclosedCData);
err!(unclosed24("<![CDATA[]h") => SyntaxError::UnclosedCData);
err!(unclosed25("<![CDATA[]>") => SyntaxError::UnclosedCData);
err!(unclosed01(".<![") => SyntaxError::UnclosedCData);
err!(unclosed02(".<![C") => SyntaxError::UnclosedCData);
err!(unclosed03(".<![a") => SyntaxError::UnclosedCData);
err!(unclosed04(".<![>") => SyntaxError::UnclosedCData);
err!(unclosed05(".<![CD") => SyntaxError::UnclosedCData);
err!(unclosed06(".<![Cb") => SyntaxError::UnclosedCData);
err!(unclosed07(".<![C>") => SyntaxError::UnclosedCData);
err!(unclosed08(".<![CDA") => SyntaxError::UnclosedCData);
err!(unclosed09(".<![CDc") => SyntaxError::UnclosedCData);
err!(unclosed10(".<![CD>") => SyntaxError::UnclosedCData);
err!(unclosed11(".<![CDAT") => SyntaxError::UnclosedCData);
err!(unclosed12(".<![CDAd") => SyntaxError::UnclosedCData);
err!(unclosed13(".<![CDA>") => SyntaxError::UnclosedCData);
err!(unclosed14(".<![CDATA") => SyntaxError::UnclosedCData);
err!(unclosed15(".<![CDATe") => SyntaxError::UnclosedCData);
err!(unclosed16(".<![CDAT>") => SyntaxError::UnclosedCData);
err!(unclosed17(".<![CDATA[") => SyntaxError::UnclosedCData);
err!(unclosed18(".<![CDATAf") => SyntaxError::UnclosedCData);
err!(unclosed19(".<![CDATA>") => SyntaxError::UnclosedCData);
err!(unclosed20(".<![CDATA[]") => SyntaxError::UnclosedCData);
err!(unclosed21(".<![CDATA[g") => SyntaxError::UnclosedCData);
err!(unclosed22(".<![CDATA[>") => SyntaxError::UnclosedCData);
err!(unclosed23(".<![CDATA[]]") => SyntaxError::UnclosedCData);
err!(unclosed24(".<![CDATA[]h") => SyntaxError::UnclosedCData);
err!(unclosed25(".<![CDATA[]>") => SyntaxError::UnclosedCData);

ok!(normal1("<![CDATA[]]>") => 12: Event::CData(BytesCData::new("")));
ok!(normal2("<![CDATA[]]>rest") => 12: Event::CData(BytesCData::new("")));
Expand All @@ -353,29 +394,29 @@ mod syntax {
mod doctype {
use super::*;

err!(unclosed01("<!D") => SyntaxError::UnclosedDoctype);
err!(unclosed02("<!DO") => SyntaxError::UnclosedDoctype);
err!(unclosed03("<!Da") => SyntaxError::UnclosedDoctype);
err!(unclosed04("<!D>") => SyntaxError::UnclosedDoctype);
err!(unclosed05("<!DOC") => SyntaxError::UnclosedDoctype);
err!(unclosed06("<!DOb") => SyntaxError::UnclosedDoctype);
err!(unclosed07("<!DO>") => SyntaxError::UnclosedDoctype);
err!(unclosed08("<!DOCT") => SyntaxError::UnclosedDoctype);
err!(unclosed09("<!DOCc") => SyntaxError::UnclosedDoctype);
err!(unclosed10("<!DOC>") => SyntaxError::UnclosedDoctype);
err!(unclosed11("<!DOCTY") => SyntaxError::UnclosedDoctype);
err!(unclosed12("<!DOCTd") => SyntaxError::UnclosedDoctype);
err!(unclosed13("<!DOCT>") => SyntaxError::UnclosedDoctype);
err!(unclosed14("<!DOCTYP") => SyntaxError::UnclosedDoctype);
err!(unclosed15("<!DOCTYe") => SyntaxError::UnclosedDoctype);
err!(unclosed16("<!DOCTY>") => SyntaxError::UnclosedDoctype);
err!(unclosed17("<!DOCTYPE") => SyntaxError::UnclosedDoctype);
err!(unclosed18("<!DOCTYPf") => SyntaxError::UnclosedDoctype);
err!(unclosed19("<!DOCTYP>") => SyntaxError::UnclosedDoctype);
err!(unclosed20("<!DOCTYPE ") => SyntaxError::UnclosedDoctype);
err!(unclosed21("<!DOCTYPEg") => SyntaxError::UnclosedDoctype);
err!(unclosed01(".<!D") => SyntaxError::UnclosedDoctype);
err!(unclosed02(".<!DO") => SyntaxError::UnclosedDoctype);
err!(unclosed03(".<!Da") => SyntaxError::UnclosedDoctype);
err!(unclosed04(".<!D>") => SyntaxError::UnclosedDoctype);
err!(unclosed05(".<!DOC") => SyntaxError::UnclosedDoctype);
err!(unclosed06(".<!DOb") => SyntaxError::UnclosedDoctype);
err!(unclosed07(".<!DO>") => SyntaxError::UnclosedDoctype);
err!(unclosed08(".<!DOCT") => SyntaxError::UnclosedDoctype);
err!(unclosed09(".<!DOCc") => SyntaxError::UnclosedDoctype);
err!(unclosed10(".<!DOC>") => SyntaxError::UnclosedDoctype);
err!(unclosed11(".<!DOCTY") => SyntaxError::UnclosedDoctype);
err!(unclosed12(".<!DOCTd") => SyntaxError::UnclosedDoctype);
err!(unclosed13(".<!DOCT>") => SyntaxError::UnclosedDoctype);
err!(unclosed14(".<!DOCTYP") => SyntaxError::UnclosedDoctype);
err!(unclosed15(".<!DOCTYe") => SyntaxError::UnclosedDoctype);
err!(unclosed16(".<!DOCTY>") => SyntaxError::UnclosedDoctype);
err!(unclosed17(".<!DOCTYPE") => SyntaxError::UnclosedDoctype);
err!(unclosed18(".<!DOCTYPf") => SyntaxError::UnclosedDoctype);
err!(unclosed19(".<!DOCTYP>") => SyntaxError::UnclosedDoctype);
err!(unclosed20(".<!DOCTYPE ") => SyntaxError::UnclosedDoctype);
err!(unclosed21(".<!DOCTYPEg") => SyntaxError::UnclosedDoctype);
// <!DOCTYPE> results in IllFormed(MissingDoctypeName), checked below
err!(unclosed22("<!DOCTYPE e") => SyntaxError::UnclosedDoctype);
err!(unclosed22(".<!DOCTYPE e") => SyntaxError::UnclosedDoctype);

// According to the grammar, XML declaration MUST contain at least one space
// and an element name, but we do not consider this as a _syntax_ error.
Expand All @@ -387,16 +428,16 @@ mod syntax {
mod pi {
use super::*;

err!(unclosed1("<?") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed2("<??") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed3("<?>") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed4("<?<") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed5("<?&") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed6("<?p") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed7("<? ") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed8("<?\t") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed9("<?\r") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed10("<?\n") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed01(".<?") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed02(".<??") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed03(".<?>") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed04(".<?<") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed05(".<?&") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed06(".<?p") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed07(".<? ") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed08(".<?\t") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed09(".<?\r") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed10(".<?\n") => SyntaxError::UnclosedPIOrXmlDecl);

// According to the grammar, processing instruction MUST contain a non-empty
// target name, but we do not consider this as a _syntax_ error.
Expand All @@ -410,10 +451,10 @@ mod syntax {
mod decl {
use super::*;

err!(unclosed1("<?x") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed2("<?xm") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed3("<?xml") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed4("<?xml?") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed1(".<?x") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed2(".<?xm") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed3(".<?xml") => SyntaxError::UnclosedPIOrXmlDecl);
err!(unclosed4(".<?xml?") => SyntaxError::UnclosedPIOrXmlDecl);

// According to the grammar, XML declaration MUST contain at least one space
// and `version` attribute, but we do not consider this as a _syntax_ error.
Expand Down

0 comments on commit e4b5e12

Please sign in to comment.