diff --git a/.gitmodules b/.gitmodules index 9973ce2c..880a752c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "html5lib-tests"] - path = html5ever/html5lib-tests + path = rcdom/html5lib-tests url = https://github.com/html5lib/html5lib-tests [submodule "xml5lib-tests"] - path = xml5ever/xml5lib-tests + path = rcdom/xml5lib-tests url = https://github.com/Ygg01/xml5lib-tests diff --git a/html5ever/Cargo.toml b/html5ever/Cargo.toml index 8abd1b12..919f45e2 100644 --- a/html5ever/Cargo.toml +++ b/html5ever/Cargo.toml @@ -11,33 +11,14 @@ build = "build.rs" categories = [ "parser-implementations", "web-programming" ] edition = "2018" -[lib] -name = "html5ever" - -doctest = true - -[[test]] -name = "tree_builder" -harness = false - -[[test]] -name = "tokenizer" -harness = false - -[[test]] -name = "serializer" - [dependencies] log = "0.4" mac = "0.1" markup5ever = { version = "0.10", path = "../markup5ever" } [dev-dependencies] -serde_json = "1.0" -rustc-test = "0.3" typed-arena = "1.3.0" criterion = "0.3" -markup5ever_rcdom = { version = "0.1", path = "../rcdom" } [build-dependencies] quote = "1" diff --git a/html5ever/benches/html5ever.rs b/html5ever/benches/html5ever.rs index 19e10b3a..14fec5fe 100644 --- a/html5ever/benches/html5ever.rs +++ b/html5ever/benches/html5ever.rs @@ -9,7 +9,7 @@ use criterion::{black_box, Criterion}; use html5ever::tendril::*; use html5ever::tokenizer::{ - BufferQueue, Token, TokenSink, TokenSinkResult, Tokenizer, TokenizerOpts, + BufferQueue, Token, TokenSink, TokenSinkResult, Tokenizer, }; struct Sink; diff --git a/html5ever/src/driver.rs b/html5ever/src/driver.rs index df7c6cd0..11a7a74d 100644 --- a/html5ever/src/driver.rs +++ b/html5ever/src/driver.rs @@ -134,26 +134,3 @@ impl Parser { Utf8LossyDecoder::new(self) } } - -#[cfg(test)] -mod tests { - extern crate markup5ever_rcdom; - use super::*; - use self::markup5ever_rcdom::{RcDom, SerializableHandle}; - use crate::serialize::serialize; - use tendril::TendrilSink; - - #[test] - fn from_utf8() { - let dom = parse_document(RcDom::default(), ParseOpts::default()) - .from_utf8() - .one("Test".as_bytes()); - let mut serialized = Vec::new(); - let document: SerializableHandle = dom.document.clone().into(); - serialize(&mut serialized, &document, Default::default()).unwrap(); - assert_eq!( - String::from_utf8(serialized).unwrap().replace(" ", ""), - "<html><head><title>Test" - ); - } -} diff --git a/html5ever/src/tree_builder/mod.rs b/html5ever/src/tree_builder/mod.rs index 6262947f..50b420ce 100644 --- a/html5ever/src/tree_builder/mod.rs +++ b/html5ever/src/tree_builder/mod.rs @@ -1679,171 +1679,3 @@ where } } } - -#[cfg(test)] -#[allow(non_snake_case)] -mod test { - extern crate markup5ever_rcdom as rcdom; - use markup5ever::interface::{AppendNode, AppendText, NodeOrText}; - use markup5ever::interface::{ElementFlags, Tracer, TreeSink}; - use markup5ever::interface::{LimitedQuirks, NoQuirks, Quirks, QuirksMode}; - - use super::types::*; - - use crate::tendril::stream::{TendrilSink, Utf8LossyDecoder}; - use crate::tendril::StrTendril; - use crate::ExpandedName; - use crate::QualName; - - use crate::tokenizer; - use crate::tokenizer::states as tok_state; - use crate::tokenizer::{Doctype, StartTag, Tag, TokenSink}; - use crate::tokenizer::{Tokenizer, TokenizerOpts}; - use crate::driver::*; - - use crate::util::str::is_ascii_whitespace; - - use std::borrow::Cow; - use std::borrow::Cow::Borrowed; - use std::collections::VecDeque; - use std::default::Default; - use std::mem::replace; - - use super::{TreeBuilder, TreeBuilderOpts}; - use markup5ever::{Attribute, local_name, namespace_url, ns}; - use self::rcdom::{Handle, Node, NodeData, RcDom}; - - pub struct LineCountingDOM { - pub line_vec: Vec<(QualName, u64)>, - pub current_line: u64, - pub rcdom: RcDom, - } - - impl TreeSink for LineCountingDOM { - type Output = Self; - - fn finish(self) -> Self { - self - } - - type Handle = Handle; - - fn parse_error(&mut self, msg: Cow<'static, str>) { - self.rcdom.parse_error(msg); - } - - fn get_document(&mut self) -> Handle { - self.rcdom.get_document() - } - - fn get_template_contents(&mut self, target: &Handle) -> Handle { - self.rcdom.get_template_contents(target) - } - - fn set_quirks_mode(&mut self, mode: QuirksMode) { - self.rcdom.set_quirks_mode(mode) - } - - fn same_node(&self, x: &Handle, y: &Handle) -> bool { - self.rcdom.same_node(x, y) - } - - fn elem_name<'a>(&'a self, target: &'a Handle) -> ExpandedName<'a> { - self.rcdom.elem_name(target) - } - - fn create_element( - &mut self, - name: QualName, - attrs: Vec, - flags: ElementFlags, - ) -> Handle { - self.line_vec.push((name.clone(), self.current_line)); - self.rcdom.create_element(name, attrs, flags) - } - - fn create_comment(&mut self, text: StrTendril) -> Handle { - self.rcdom.create_comment(text) - } - - fn create_pi(&mut self, target: StrTendril, content: StrTendril) -> Handle { - self.rcdom.create_pi(target, content) - } - - fn append(&mut self, parent: &Handle, child: NodeOrText) { - self.rcdom.append(parent, child) - } - - fn append_before_sibling(&mut self, sibling: &Handle, child: NodeOrText) { - self.rcdom.append_before_sibling(sibling, child) - } - - fn append_based_on_parent_node( - &mut self, - element: &Handle, - prev_element: &Handle, - child: NodeOrText, - ) { - self.rcdom - .append_based_on_parent_node(element, prev_element, child) - } - - fn append_doctype_to_document( - &mut self, - name: StrTendril, - public_id: StrTendril, - system_id: StrTendril, - ) { - self.rcdom - .append_doctype_to_document(name, public_id, system_id); - } - - fn add_attrs_if_missing(&mut self, target: &Handle, attrs: Vec) { - self.rcdom.add_attrs_if_missing(target, attrs); - } - - fn remove_from_parent(&mut self, target: &Handle) { - self.rcdom.remove_from_parent(target); - } - - fn reparent_children(&mut self, node: &Handle, new_parent: &Handle) { - self.rcdom.reparent_children(node, new_parent); - } - - fn mark_script_already_started(&mut self, target: &Handle) { - self.rcdom.mark_script_already_started(target); - } - - fn set_current_line(&mut self, line_number: u64) { - self.current_line = line_number; - } - } - - #[test] - fn check_four_lines() { - // Input - let sink = LineCountingDOM { - line_vec: vec![], - current_line: 1, - rcdom: RcDom::default(), - }; - let opts = ParseOpts::default(); - let mut resultTok = parse_document(sink, opts); - resultTok.process(StrTendril::from("\n")); - resultTok.process(StrTendril::from("\n")); - resultTok.process(StrTendril::from("\n")); - resultTok.process(StrTendril::from("")); - // Actual Output - let actual = resultTok.finish(); - // Expected Output - let expected = vec![ - (QualName::new(None, ns!(html), local_name!("html")), 1), - (QualName::new(None, ns!(html), local_name!("head")), 1), - (QualName::new(None, ns!(html), local_name!("body")), 1), - (QualName::new(None, ns!(html), local_name!("a")), 1), - (QualName::new(None, ns!(html), local_name!("b")), 3), - ]; - // Assertion - assert_eq!(actual.line_vec, expected); - } -} diff --git a/markup5ever/Cargo.toml b/markup5ever/Cargo.toml index bc235f06..c5867a74 100644 --- a/markup5ever/Cargo.toml +++ b/markup5ever/Cargo.toml @@ -25,6 +25,3 @@ phf_codegen = "0.8" serde = "1.0" serde_derive = "1.0" serde_json = "1.0" - -[dev-dependencies] -markup5ever_rcdom = { version = "0.1", path = "../rcdom" } \ No newline at end of file diff --git a/markup5ever/interface/tree_builder.rs b/markup5ever/interface/tree_builder.rs index 2a130f09..43361f36 100644 --- a/markup5ever/interface/tree_builder.rs +++ b/markup5ever/interface/tree_builder.rs @@ -80,32 +80,6 @@ pub struct ElementFlags { /// # Examples /// /// Create an element like `
`: -/// -/// ``` -/// # #[macro_use] extern crate markup5ever; -/// # extern crate markup5ever_rcdom as rcdom; -/// -/// # fn main() { -/// use markup5ever::{QualName, Attribute}; -/// use markup5ever::interface::create_element; -/// -/// let mut dom = rcdom::RcDom::default(); -/// let el = create_element(&mut dom, -/// // Namespaces and localnames use precomputed interned strings for -/// // speed. Use the macros ns! and local_name! to fetch them. -/// QualName::new(None, ns!(), local_name!("div")), -/// vec![ -/// Attribute { -/// name: QualName::new(None, ns!(), local_name!("class")), -/// // In real scenarios, you would use a view onto an existing -/// // string if possible to avoid allocation. Tendrils have utilities -/// // for avoiding allocation & copying wherever possible. -/// value: String::from("test-class-name").into() -/// } -/// ]); -/// # } -/// -/// ``` pub fn create_element(sink: &mut Sink, name: QualName, attrs: Vec) -> Sink::Handle where Sink: TreeSink, diff --git a/rcdom/Cargo.toml b/rcdom/Cargo.toml index 6a05338d..5a5c0aed 100644 --- a/rcdom/Cargo.toml +++ b/rcdom/Cargo.toml @@ -8,10 +8,34 @@ description = "Basic, unsupported DOM structure for use by tests in html5ever/xm readme = "README.md" documentation = "https://docs.rs/markup5ever_rcdom" categories = [ "parser-implementations", "web-programming" ] +edition = "2018" +publish = false [lib] path = "lib.rs" [dependencies] tendril = "0.4" -markup5ever = { version = "0.10", path = "../markup5ever" } \ No newline at end of file +html5ever = { version = "0.25", path = "../html5ever" } +markup5ever = { version = "0.10", path = "../markup5ever" } +xml5ever = { version = "0.16", path = "../xml5ever" } + +[dev-dependencies] +serde_json = "1.0" +rustc-test = "0.3" + +[[test]] +name = "html-tokenizer" +harness = false + +[[test]] +name = "html-tree-builder" +harness = false + +[[test]] +name = "xml-tree-builder" +harness = false + +[[test]] +name = "xml-tokenizer" +harness = false diff --git a/html5ever/data/test/ignore b/rcdom/data/test/ignore similarity index 100% rename from html5ever/data/test/ignore rename to rcdom/data/test/ignore diff --git a/xml5ever/examples/hello_xml.rs b/rcdom/examples/hello_xml.rs similarity index 100% rename from xml5ever/examples/hello_xml.rs rename to rcdom/examples/hello_xml.rs diff --git a/html5ever/examples/html2html.rs b/rcdom/examples/html2html.rs similarity index 100% rename from html5ever/examples/html2html.rs rename to rcdom/examples/html2html.rs diff --git a/html5ever/examples/print-rcdom.rs b/rcdom/examples/print-rcdom.rs similarity index 100% rename from html5ever/examples/print-rcdom.rs rename to rcdom/examples/print-rcdom.rs diff --git a/xml5ever/examples/xml_tree_printer.rs b/rcdom/examples/xml_tree_printer.rs similarity index 100% rename from xml5ever/examples/xml_tree_printer.rs rename to rcdom/examples/xml_tree_printer.rs diff --git a/html5ever/html5lib-tests b/rcdom/html5lib-tests similarity index 100% rename from html5ever/html5lib-tests rename to rcdom/html5lib-tests diff --git a/html5ever/tests/foreach_html5lib_test/mod.rs b/rcdom/tests/foreach_html5lib_test/mod.rs similarity index 100% rename from html5ever/tests/foreach_html5lib_test/mod.rs rename to rcdom/tests/foreach_html5lib_test/mod.rs diff --git a/rcdom/tests/html-driver.rs b/rcdom/tests/html-driver.rs new file mode 100644 index 00000000..78dcf1ff --- /dev/null +++ b/rcdom/tests/html-driver.rs @@ -0,0 +1,18 @@ +use html5ever::driver; +use html5ever::serialize; +use html5ever::tendril::TendrilSink; +use markup5ever_rcdom::{RcDom, SerializableHandle}; + +#[test] +fn from_utf8() { + let dom = driver::parse_document(RcDom::default(), Default::default()) + .from_utf8() + .one("Test".as_bytes()); + let mut serialized = Vec::new(); + let document: SerializableHandle = dom.document.clone().into(); + serialize::serialize(&mut serialized, &document, Default::default()).unwrap(); + assert_eq!( + String::from_utf8(serialized).unwrap().replace(" ", ""), + "<html><head><title>Test" + ); +} diff --git a/html5ever/tests/serializer.rs b/rcdom/tests/html-serializer.rs similarity index 97% rename from html5ever/tests/serializer.rs rename to rcdom/tests/html-serializer.rs index c99546a0..d599cbb8 100644 --- a/html5ever/tests/serializer.rs +++ b/rcdom/tests/html-serializer.rs @@ -7,18 +7,13 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -#[macro_use] -extern crate html5ever; -extern crate markup5ever_rcdom as rcdom; - -use std::default::Default; - use html5ever::driver::ParseOpts; use html5ever::serialize::{Serialize, SerializeOpts, Serializer, TraversalScope}; use html5ever::tendril::{SliceExt, StrTendril, TendrilSink}; use html5ever::tokenizer::{TagKind, Token, TokenSink, TokenSinkResult, Tokenizer}; use html5ever::{parse_document, parse_fragment, serialize, QualName}; -use rcdom::{RcDom, SerializableHandle}; +use markup5ever::{local_name, namespace_url, ns}; +use markup5ever_rcdom::{RcDom, SerializableHandle}; use std::io; @@ -258,7 +253,6 @@ fn deep_tree() { ); let src = String::from("".repeat(60_000)); let dom = parser.one(src); - let document = &dom.document; let opts = SerializeOpts::default(); let mut ret_val = Vec::new(); let document: SerializableHandle = dom.document.clone().into(); diff --git a/html5ever/tests/tokenizer.rs b/rcdom/tests/html-tokenizer.rs similarity index 97% rename from html5ever/tests/tokenizer.rs rename to rcdom/tests/html-tokenizer.rs index d87a3412..75f17773 100644 --- a/html5ever/tests/tokenizer.rs +++ b/rcdom/tests/html-tokenizer.rs @@ -7,33 +7,26 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -extern crate serde_json; -extern crate rustc_test as test; -#[macro_use] -extern crate html5ever; - mod foreach_html5lib_test; -use foreach_html5lib_test::foreach_html5lib_test; +use foreach_html5lib_test::foreach_html5lib_test; +use html5ever::{Attribute, LocalName, namespace_url, ns, QualName}; +use html5ever::tendril::*; +use html5ever::tokenizer::{CharacterTokens, EOFToken, NullCharacterToken, ParseError}; +use html5ever::tokenizer::{CommentToken, DoctypeToken, TagToken, Token}; +use html5ever::tokenizer::{Doctype, EndTag, StartTag, Tag}; +use html5ever::tokenizer::{TokenSink, TokenSinkResult, Tokenizer, TokenizerOpts}; +use html5ever::tokenizer::BufferQueue; +use html5ever::tokenizer::states::{Plaintext, RawData, Rawtext, Rcdata}; +use rustc_test::{DynTestFn, DynTestName, TestDesc, TestDescAndFn}; use serde_json::{Value, Map}; +use std::{char, env}; use std::borrow::Cow::Borrowed; use std::default::Default; use std::ffi::OsStr; use std::io::Read; use std::mem::replace; use std::path::Path; -use std::{char, env}; -use test::{DynTestFn, DynTestName, TestDesc, TestDescAndFn}; - -use html5ever::tendril::*; -use html5ever::tokenizer::states::{Plaintext, RawData, Rawtext, Rcdata}; -use html5ever::tokenizer::BufferQueue; -use html5ever::tokenizer::{CharacterTokens, EOFToken, NullCharacterToken, ParseError}; -use html5ever::tokenizer::{CommentToken, DoctypeToken, TagToken, Token}; -use html5ever::tokenizer::{Doctype, EndTag, StartTag, Tag}; -use html5ever::tokenizer::{TokenSink, TokenSinkResult, Tokenizer, TokenizerOpts}; -use html5ever::Attribute; -use html5ever::{LocalName, QualName}; // Return all ways of splitting the string into at most n // possibly-empty pieces. @@ -449,5 +442,5 @@ fn tests(src_dir: &Path) -> Vec { fn main() { let args: Vec<_> = env::args().collect(); - test::test_main(&args, tests(Path::new(env!("CARGO_MANIFEST_DIR")))); + rustc_test::test_main(&args, tests(Path::new(env!("CARGO_MANIFEST_DIR")))); } diff --git a/html5ever/tests/tree_builder.rs b/rcdom/tests/html-tree-builder.rs similarity index 100% rename from html5ever/tests/tree_builder.rs rename to rcdom/tests/html-tree-builder.rs diff --git a/rcdom/tests/html-tree-sink.rs b/rcdom/tests/html-tree-sink.rs new file mode 100644 index 00000000..267ddf7d --- /dev/null +++ b/rcdom/tests/html-tree-sink.rs @@ -0,0 +1,142 @@ +use html5ever::driver; +use html5ever::ExpandedName; +use html5ever::QualName; +use html5ever::tendril::stream::TendrilSink; +use html5ever::tendril::StrTendril; +use markup5ever_rcdom::{Handle, RcDom}; +use markup5ever::{Attribute, local_name, namespace_url, ns}; +use markup5ever::interface::{ElementFlags, NodeOrText, QuirksMode, TreeSink}; +use std::borrow::Cow; + +pub struct LineCountingDOM { + pub line_vec: Vec<(QualName, u64)>, + pub current_line: u64, + pub rcdom: RcDom, +} + +impl TreeSink for LineCountingDOM { + type Output = Self; + + fn finish(self) -> Self { + self + } + + type Handle = Handle; + + fn parse_error(&mut self, msg: Cow<'static, str>) { + self.rcdom.parse_error(msg); + } + + fn get_document(&mut self) -> Handle { + self.rcdom.get_document() + } + + fn get_template_contents(&mut self, target: &Handle) -> Handle { + self.rcdom.get_template_contents(target) + } + + fn set_quirks_mode(&mut self, mode: QuirksMode) { + self.rcdom.set_quirks_mode(mode) + } + + fn same_node(&self, x: &Handle, y: &Handle) -> bool { + self.rcdom.same_node(x, y) + } + + fn elem_name<'a>(&'a self, target: &'a Handle) -> ExpandedName<'a> { + self.rcdom.elem_name(target) + } + + fn create_element( + &mut self, + name: QualName, + attrs: Vec, + flags: ElementFlags, + ) -> Handle { + self.line_vec.push((name.clone(), self.current_line)); + self.rcdom.create_element(name, attrs, flags) + } + + fn create_comment(&mut self, text: StrTendril) -> Handle { + self.rcdom.create_comment(text) + } + + fn create_pi(&mut self, target: StrTendril, content: StrTendril) -> Handle { + self.rcdom.create_pi(target, content) + } + + fn append(&mut self, parent: &Handle, child: NodeOrText) { + self.rcdom.append(parent, child) + } + + fn append_before_sibling(&mut self, sibling: &Handle, child: NodeOrText) { + self.rcdom.append_before_sibling(sibling, child) + } + + fn append_based_on_parent_node( + &mut self, + element: &Handle, + prev_element: &Handle, + child: NodeOrText, + ) { + self.rcdom + .append_based_on_parent_node(element, prev_element, child) + } + + fn append_doctype_to_document( + &mut self, + name: StrTendril, + public_id: StrTendril, + system_id: StrTendril, + ) { + self.rcdom + .append_doctype_to_document(name, public_id, system_id); + } + + fn add_attrs_if_missing(&mut self, target: &Handle, attrs: Vec) { + self.rcdom.add_attrs_if_missing(target, attrs); + } + + fn remove_from_parent(&mut self, target: &Handle) { + self.rcdom.remove_from_parent(target); + } + + fn reparent_children(&mut self, node: &Handle, new_parent: &Handle) { + self.rcdom.reparent_children(node, new_parent); + } + + fn mark_script_already_started(&mut self, target: &Handle) { + self.rcdom.mark_script_already_started(target); + } + + fn set_current_line(&mut self, line_number: u64) { + self.current_line = line_number; + } +} + +#[test] +fn check_four_lines() { + // Input + let sink = LineCountingDOM { + line_vec: vec![], + current_line: 1, + rcdom: RcDom::default(), + }; + let mut result_tok = driver::parse_document(sink, Default::default()); + result_tok.process(StrTendril::from("\n")); + result_tok.process(StrTendril::from("\n")); + result_tok.process(StrTendril::from("\n")); + result_tok.process(StrTendril::from("")); + // Actual Output + let actual = result_tok.finish(); + // Expected Output + let expected = vec![ + (QualName::new(None, ns!(html), local_name!("html")), 1), + (QualName::new(None, ns!(html), local_name!("head")), 1), + (QualName::new(None, ns!(html), local_name!("body")), 1), + (QualName::new(None, ns!(html), local_name!("a")), 1), + (QualName::new(None, ns!(html), local_name!("b")), 3), + ]; + // Assertion + assert_eq!(actual.line_vec, expected); +} diff --git a/xml5ever/tests/util/find_tests.rs b/rcdom/tests/util/find_tests.rs similarity index 100% rename from xml5ever/tests/util/find_tests.rs rename to rcdom/tests/util/find_tests.rs diff --git a/rcdom/tests/xml-driver.rs b/rcdom/tests/xml-driver.rs new file mode 100644 index 00000000..7c819b3e --- /dev/null +++ b/rcdom/tests/xml-driver.rs @@ -0,0 +1,109 @@ +use markup5ever_rcdom::{RcDom, SerializableHandle}; +use xml5ever::driver; +use xml5ever::serialize; +use xml5ever::tendril::TendrilSink; + +#[test] +fn el_ns_serialize() { + assert_eq_serialization( + "Test", + driver::parse_document(RcDom::default(), Default::default()) + .from_utf8() + .one( + "Test" + .as_bytes(), + ), + ); +} + +#[test] +fn nested_ns_serialize() { + assert_eq_serialization("", + driver::parse_document(RcDom::default(), Default::default()) + .from_utf8() + .one("".as_bytes())); +} + +#[test] +fn def_ns_serialize() { + assert_eq_serialization( + "
", + driver::parse_document(RcDom::default(), Default::default()) + .from_utf8() + .one("
".as_bytes()), + ); +} + +#[test] +fn undefine_ns_serialize() { + assert_eq_serialization( + "", + driver::parse_document(RcDom::default(), Default::default()) + .from_utf8() + .one( + "" + .as_bytes(), + ), + ); +} + +#[test] +fn redefine_default_ns_serialize() { + assert_eq_serialization( + "", + driver::parse_document(RcDom::default(), Default::default()) + .from_utf8() + .one("".as_bytes()), + ); +} + +#[test] +fn attr_serialize() { + assert_serialization( + "Test", + driver::parse_document(RcDom::default(), Default::default()) + .from_utf8() + .one("Test".as_bytes()), + ); +} + +#[test] +fn from_utf8() { + assert_serialization( + "<title>Test", + driver::parse_document(RcDom::default(), Default::default()) + .from_utf8() + .one("Test".as_bytes()), + ); +} + +fn assert_eq_serialization(text: &'static str, dom: RcDom) { + let mut serialized = Vec::new(); + let document: SerializableHandle = dom.document.clone().into(); + serialize::serialize(&mut serialized, &document, Default::default()).unwrap(); + + let dom_from_text = driver::parse_document(RcDom::default(), Default::default()) + .from_utf8() + .one(text.as_bytes()); + + let mut reserialized = Vec::new(); + let document: SerializableHandle = dom_from_text.document.clone().into(); + serialize::serialize( + &mut reserialized, + &document, + Default::default(), + ) + .unwrap(); + + assert_eq!( + String::from_utf8(serialized).unwrap(), + String::from_utf8(reserialized).unwrap() + ); +} + +fn assert_serialization(text: &'static str, dom: RcDom) { + let mut serialized = Vec::new(); + let document: SerializableHandle = dom.document.clone().into(); + serialize::serialize(&mut serialized, &document, Default::default()).unwrap(); + assert_eq!(String::from_utf8(serialized).unwrap(), text); +} diff --git a/xml5ever/tests/tokenizer.rs b/rcdom/tests/xml-tokenizer.rs similarity index 97% rename from xml5ever/tests/tokenizer.rs rename to rcdom/tests/xml-tokenizer.rs index 5f8ffe44..68590b65 100644 --- a/xml5ever/tests/tokenizer.rs +++ b/rcdom/tests/xml-tokenizer.rs @@ -7,12 +7,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -extern crate markup5ever; -extern crate serde_json; -extern crate rustc_test as test; -#[macro_use] -extern crate xml5ever; - use serde_json::{Value, Map}; use std::borrow::Cow::Borrowed; use std::env; @@ -21,7 +15,7 @@ use std::ffi::OsStr; use std::mem::replace; use std::path::Path; -use test::{DynTestFn, DynTestName, TestDesc, TestDescAndFn}; +use rustc_test::{DynTestFn, DynTestName, TestDesc, TestDescAndFn}; use util::find_tests::foreach_xml5lib_test; use markup5ever::buffer_queue::BufferQueue; @@ -31,7 +25,7 @@ use xml5ever::tokenizer::{CommentToken, EmptyTag, EndTag, ShortTag, StartTag, Ta use xml5ever::tokenizer::{Doctype, DoctypeToken, PIToken, Pi}; use xml5ever::tokenizer::{EOFToken, XmlTokenizer, XmlTokenizerOpts}; use xml5ever::tokenizer::{NullCharacterToken, ParseError, TagToken}; -use xml5ever::{Attribute, LocalName, QualName}; +use xml5ever::{Attribute, LocalName, namespace_url, ns, QualName}; mod util { pub mod find_tests; @@ -383,8 +377,7 @@ fn tests(src_dir: &Path) -> Vec<TestDescAndFn> { tests } -#[test] -fn run() { +fn main() { let args: Vec<_> = env::args().collect(); - test::test_main(&args, tests(Path::new(env!("CARGO_MANIFEST_DIR")))); + rustc_test::test_main(&args, tests(Path::new(env!("CARGO_MANIFEST_DIR")))); } diff --git a/xml5ever/tests/tree_builder.rs b/rcdom/tests/xml-tree-builder.rs similarity index 96% rename from xml5ever/tests/tree_builder.rs rename to rcdom/tests/xml-tree-builder.rs index 2c2c80cd..d7697ed7 100644 --- a/xml5ever/tests/tree_builder.rs +++ b/rcdom/tests/xml-tree-builder.rs @@ -7,21 +7,16 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -extern crate markup5ever_rcdom as rcdom; -extern crate rustc_test as test; -#[macro_use] -extern crate xml5ever; - +use markup5ever::{namespace_url, ns}; +use markup5ever_rcdom::*; +use rustc_test::{DynTestFn, DynTestName, TestDesc, TestDescAndFn}; +use std::{env, fs, io}; use std::collections::{HashMap, HashSet}; use std::ffi::OsStr; use std::io::BufRead; use std::iter::repeat; use std::mem::replace; use std::path::Path; -use std::{env, fs, io}; - -use rcdom::*; -use test::{DynTestFn, DynTestName, TestDesc, TestDescAndFn}; use util::find_tests::foreach_xml5lib_test; use xml5ever::driver::parse_document; use xml5ever::tendril::TendrilSink; @@ -241,8 +236,7 @@ fn tests(src_dir: &Path, ignores: &HashSet<String>) -> Vec<TestDescAndFn> { tests } -#[test] -fn run() { +fn main() { let args: Vec<_> = env::args().collect(); let src_dir = Path::new(env!("CARGO_MANIFEST_DIR")); let mut ignores = HashSet::new(); @@ -253,5 +247,5 @@ fn run() { } } - test::test_main(&args, tests(src_dir, &ignores)); + rustc_test::test_main(&args, tests(src_dir, &ignores)); } diff --git a/xml5ever/xml5lib-tests b/rcdom/xml5lib-tests similarity index 100% rename from xml5ever/xml5lib-tests rename to rcdom/xml5lib-tests diff --git a/scripts/travis-build.sh b/scripts/travis-build.sh index 6d6559a7..4237737e 100755 --- a/scripts/travis-build.sh +++ b/scripts/travis-build.sh @@ -13,8 +13,7 @@ set -ex if [ $TRAVIS_RUST_VERSION = nightly ] then cargo bench --all - (cd html5ever && cargo test --features "rustc-test/capture") - (cd xml5ever && cargo test --features "rustc-test/capture") + (cd rcdom && cargo test --features "rustc-test/capture") else cargo bench --all cargo test --all diff --git a/xml5ever/Cargo.toml b/xml5ever/Cargo.toml index 9c77115b..146603b9 100644 --- a/xml5ever/Cargo.toml +++ b/xml5ever/Cargo.toml @@ -15,11 +15,6 @@ exclude = ["xml5lib-tests/*"] categories = [ "parser-implementations", "web-programming" ] edition = "2018" -[lib] -name = "xml5ever" - -doctest = true - [dependencies] time = "0.1" log = "0.4" @@ -27,10 +22,8 @@ mac = "0.1" markup5ever = {version = "0.10", path = "../markup5ever" } [dev-dependencies] -serde_json = "1.0" rustc-test = "0.3" -criterion = "0.2" -markup5ever_rcdom = {version = "0.1", path = "../rcdom" } +criterion = "0.3" [[bench]] name = "xml5ever" diff --git a/xml5ever/benches/xml5ever.rs b/xml5ever/benches/xml5ever.rs index 7a343ef5..a2dc33b0 100644 --- a/xml5ever/benches/xml5ever.rs +++ b/xml5ever/benches/xml5ever.rs @@ -10,7 +10,7 @@ use criterion::{black_box, Criterion}; use markup5ever::buffer_queue::BufferQueue; use xml5ever::tendril::*; -use xml5ever::tokenizer::{Token, TokenSink, XmlTokenizer, XmlTokenizerOpts}; +use xml5ever::tokenizer::{Token, TokenSink, XmlTokenizer}; struct Sink; diff --git a/xml5ever/src/driver.rs b/xml5ever/src/driver.rs index 517c7149..7f0845f7 100644 --- a/xml5ever/src/driver.rs +++ b/xml5ever/src/driver.rs @@ -86,117 +86,3 @@ impl<Sink: TreeSink> XmlParser<Sink> { Utf8LossyDecoder::new(self) } } - -#[cfg(test)] -mod tests { - extern crate markup5ever_rcdom; - use super::*; - use self::markup5ever_rcdom::{RcDom, SerializableHandle}; - use crate::serialize::serialize; - use tendril::TendrilSink; - - #[test] - fn el_ns_serialize() { - assert_eq_serialization( - "<a:title xmlns:a=\"http://www.foo.org/\" value=\"test\">Test</a:title>", - parse_document(RcDom::default(), XmlParseOpts::default()) - .from_utf8() - .one( - "<a:title xmlns:a=\"http://www.foo.org/\" value=\"test\">Test" - .as_bytes(), - ), - ); - } - - #[test] - fn nested_ns_serialize() { - assert_eq_serialization("", - parse_document(RcDom::default(), XmlParseOpts::default()) - .from_utf8() - .one("".as_bytes())); - } - - #[test] - fn def_ns_serialize() { - assert_eq_serialization( - "
", - parse_document(RcDom::default(), XmlParseOpts::default()) - .from_utf8() - .one("
".as_bytes()), - ); - } - - #[test] - fn undefine_ns_serialize() { - assert_eq_serialization( - "", - parse_document(RcDom::default(), XmlParseOpts::default()) - .from_utf8() - .one( - "" - .as_bytes(), - ), - ); - } - - #[test] - fn redefine_default_ns_serialize() { - assert_eq_serialization( - "", - parse_document(RcDom::default(), XmlParseOpts::default()) - .from_utf8() - .one("".as_bytes()), - ); - } - - #[test] - fn attr_serialize() { - assert_serialization( - "Test", - parse_document(RcDom::default(), XmlParseOpts::default()) - .from_utf8() - .one("Test".as_bytes()), - ); - } - - #[test] - fn from_utf8() { - assert_serialization( - "<title>Test", - parse_document(RcDom::default(), XmlParseOpts::default()) - .from_utf8() - .one("Test".as_bytes()), - ); - } - - fn assert_eq_serialization(text: &'static str, dom: RcDom) { - let mut serialized = Vec::new(); - let document: SerializableHandle = dom.document.clone().into(); - serialize(&mut serialized, &document, Default::default()).unwrap(); - - let dom_from_text = parse_document(RcDom::default(), XmlParseOpts::default()) - .from_utf8() - .one(text.as_bytes()); - - let mut reserialized = Vec::new(); - let document: SerializableHandle = dom_from_text.document.clone().into(); - serialize( - &mut reserialized, - &document, - Default::default(), - ) - .unwrap(); - - assert_eq!( - String::from_utf8(serialized).unwrap(), - String::from_utf8(reserialized).unwrap() - ); - } - - fn assert_serialization(text: &'static str, dom: RcDom) { - let mut serialized = Vec::new(); - let document: SerializableHandle = dom.document.clone().into(); - serialize(&mut serialized, &document, Default::default()).unwrap(); - assert_eq!(String::from_utf8(serialized).unwrap(), text); - } -}