Skip to content

Commit a3338ef

Browse files
authored
Remove rustc-test dependency (#528)
* xml5ever: remove unused rust-test dev-dependency This isn't actually used by any code in the crate. * rcdom: port tests/xml-tree-builder to a custom runner This doesn't distribute the individual tests across the build-in harness, hurting parallelism and process isolation. On the other hand it's a minimal change to port off the rustc-test dependency which hasn't been actively maintained and currently doesn't compile. * rcdom: Port remaining tests to a custom runner Move the custom test runner into its own `util::runner` module and use it instead of rustc_test for the other test files. This allows `cargo test` to complete under rust 1.77.1. * github actions: Remove rustc-test/capture feature check This is no longer available since the depdendency has been removed.
1 parent 99c7011 commit a3338ef

File tree

8 files changed

+93
-61
lines changed

8 files changed

+93
-61
lines changed

.github/workflows/main.yml

-5
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,6 @@ jobs:
3030
env:
3131
RUSTFLAGS: --cfg bench
3232

33-
- name: Test "rustc-test/capture" feature
34-
if: matrix.version == 'nightly'
35-
working-directory: rcdom
36-
run: cargo test --features "rustc-test/capture"
37-
3833
- name: Cargo test
3934
if: matrix.version != 'nightly'
4035
run: cargo test --all

rcdom/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ xml5ever = { version = "0.18", path = "../xml5ever" }
2222

2323
[dev-dependencies]
2424
serde_json = "1.0"
25-
rustc-test = "0.3"
2625

2726
[[test]]
2827
name = "html-tokenizer"

rcdom/tests/html-tokenizer.rs

+17-10
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,19 @@ use html5ever::tokenizer::{CommentToken, DoctypeToken, TagToken, Token};
2020
use html5ever::tokenizer::{Doctype, EndTag, StartTag, Tag};
2121
use html5ever::tokenizer::{TokenSink, TokenSinkResult, Tokenizer, TokenizerOpts};
2222
use html5ever::{namespace_url, ns, Attribute, LocalName, QualName};
23-
use rustc_test::{DynTestFn, DynTestName, TestDesc, TestDescAndFn};
2423
use serde_json::{Map, Value};
2524
use std::ffi::OsStr;
2625
use std::fs::File;
2726
use std::io::Read;
2827
use std::path::Path;
2928
use std::{char, env, mem};
3029

30+
use util::runner::Test;
31+
32+
mod util {
33+
pub mod runner;
34+
}
35+
3136
#[derive(Debug)]
3237
struct TestError;
3338

@@ -334,10 +339,11 @@ fn mk_test(
334339
expect: Value,
335340
expect_errors: Vec<Value>,
336341
opts: TokenizerOpts,
337-
) -> TestDescAndFn {
338-
TestDescAndFn {
339-
desc: TestDesc::new(DynTestName(desc)),
340-
testfn: DynTestFn(Box::new(move || {
342+
) -> Test {
343+
Test {
344+
name: desc,
345+
skip: false,
346+
test: Box::new(move || {
341347
// Split up the input at different points to test incremental tokenization.
342348
let insplits = splits(&input, 3);
343349
for input in insplits.into_iter() {
@@ -354,11 +360,11 @@ fn mk_test(
354360
);
355361
}
356362
}
357-
})),
363+
}),
358364
}
359365
}
360366

361-
fn mk_tests(tests: &mut Vec<TestDescAndFn>, filename: &str, js: &Value) {
367+
fn mk_tests(tests: &mut Vec<Test>, filename: &str, js: &Value) {
362368
let obj = js.get_obj();
363369
let mut input = js.find("input").get_str();
364370
let mut expect = js.find("output").clone();
@@ -437,7 +443,7 @@ fn mk_tests(tests: &mut Vec<TestDescAndFn>, filename: &str, js: &Value) {
437443
}
438444
}
439445

440-
fn tests(src_dir: &Path) -> Vec<TestDescAndFn> {
446+
fn tests(src_dir: &Path) -> Vec<Test> {
441447
let mut tests = vec![];
442448

443449
let mut add_test = |path: &Path, mut file: File| {
@@ -474,6 +480,7 @@ fn tests(src_dir: &Path) -> Vec<TestDescAndFn> {
474480
}
475481

476482
fn main() {
477-
let args: Vec<_> = env::args().collect();
478-
rustc_test::test_main(&args, tests(Path::new(env!("CARGO_MANIFEST_DIR"))));
483+
for test in tests(Path::new(env!("CARGO_MANIFEST_DIR"))) {
484+
test.run();
485+
}
479486
}

rcdom/tests/html-tree-builder.rs

+18-16
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// except according to those terms.
99

1010
extern crate markup5ever_rcdom as rcdom;
11-
extern crate rustc_test as test;
1211
#[macro_use]
1312
extern crate html5ever;
1413

@@ -20,12 +19,16 @@ use std::ffi::OsStr;
2019
use std::io::BufRead;
2120
use std::path::Path;
2221
use std::{env, fs, io, iter, mem};
23-
use test::{DynTestName, TestDesc, TestDescAndFn, TestFn};
2422

2523
use html5ever::tendril::{StrTendril, TendrilSink};
2624
use html5ever::{parse_document, parse_fragment, ParseOpts};
2725
use html5ever::{LocalName, QualName};
2826
use rcdom::{Handle, NodeData, RcDom};
27+
use util::runner::Test;
28+
29+
mod util {
30+
pub mod runner;
31+
}
2932

3033
fn parse_tests<It: Iterator<Item = String>>(mut lines: It) -> Vec<HashMap<String, String>> {
3134
let mut tests = vec![];
@@ -159,7 +162,7 @@ fn serialize(buf: &mut String, indent: usize, handle: Handle) {
159162
}
160163

161164
fn make_test(
162-
tests: &mut Vec<TestDescAndFn>,
165+
tests: &mut Vec<Test>,
163166
ignores: &HashSet<String>,
164167
filename: &str,
165168
idx: usize,
@@ -185,7 +188,7 @@ fn make_test_desc_with_scripting_flag(
185188
name: &str,
186189
fields: &HashMap<String, String>,
187190
scripting_enabled: bool,
188-
) -> TestDescAndFn {
191+
) -> Test {
189192
let get_field = |key| {
190193
let field = fields.get(key).expect("missing field");
191194
field.trim_end_matches('\n').to_string()
@@ -197,24 +200,22 @@ fn make_test_desc_with_scripting_flag(
197200
let context = fields
198201
.get("document-fragment")
199202
.map(|field| context_name(field.trim_end_matches('\n')));
200-
let ignore = ignores.contains(name);
203+
let skip = ignores.contains(name);
201204
let mut name = name.to_owned();
202205
if scripting_enabled {
203206
name.push_str(" (scripting enabled)");
204207
} else {
205208
name.push_str(" (scripting disabled)");
206209
};
207-
let mut opts: ParseOpts = Default::default();
208-
opts.tree_builder.scripting_enabled = scripting_enabled;
209210

210-
TestDescAndFn {
211-
desc: TestDesc {
212-
ignore,
213-
..TestDesc::new(DynTestName(name))
214-
},
215-
testfn: TestFn::dyn_test_fn(move || {
211+
Test {
212+
name,
213+
skip,
214+
test: Box::new(move || {
216215
// Do this here because Tendril isn't Send.
217216
let data = StrTendril::from_slice(&data);
217+
let mut opts: ParseOpts = Default::default();
218+
opts.tree_builder.scripting_enabled = scripting_enabled;
218219
let mut result = String::new();
219220
match context {
220221
None => {
@@ -258,7 +259,7 @@ fn context_name(context: &str) -> QualName {
258259
}
259260
}
260261

261-
fn tests(src_dir: &Path, ignores: &HashSet<String>) -> Vec<TestDescAndFn> {
262+
fn tests(src_dir: &Path, ignores: &HashSet<String>) -> Vec<Test> {
262263
let mut tests = vec![];
263264

264265
foreach_html5lib_test(
@@ -286,7 +287,6 @@ fn tests(src_dir: &Path, ignores: &HashSet<String>) -> Vec<TestDescAndFn> {
286287
}
287288

288289
fn main() {
289-
let args: Vec<_> = env::args().collect();
290290
let src_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
291291
let mut ignores = HashSet::new();
292292
{
@@ -297,5 +297,7 @@ fn main() {
297297
}
298298
}
299299

300-
test::test_main(&args, tests(src_dir, &ignores));
300+
for test in tests(src_dir, &ignores) {
301+
test.run();
302+
}
301303
}

rcdom/tests/util/runner.rs

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright 2024 The html5ever Project Developers. See the
2+
// COPYRIGHT file at the top-level directory of this distribution.
3+
//
4+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
5+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
7+
// option. This file may not be copied, modified, or distributed
8+
// except according to those terms.
9+
10+
/// Simple container for storing tests for later execution
11+
pub struct Test {
12+
pub name: String,
13+
pub skip: bool,
14+
pub test: Box<dyn Fn()>,
15+
}
16+
17+
impl Test {
18+
/// Invoke the stored test function
19+
///
20+
/// A status message is printed if the wrapped closure completes
21+
/// or is marked as skipped. The test should panic to report
22+
/// failure.
23+
pub fn run(&self) {
24+
print!("test {} ...", self.name);
25+
if self.skip {
26+
println!(" SKIPPED");
27+
} else {
28+
(self.test)();
29+
println!(" ok");
30+
}
31+
}
32+
}

rcdom/tests/xml-tokenizer.rs

+13-15
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use std::io::Read;
1414
use std::path::Path;
1515
use std::{env, mem};
1616

17-
use rustc_test::{DynTestFn, DynTestName, TestDesc, TestDescAndFn};
1817
use util::find_tests::foreach_xml5lib_test;
18+
use util::runner::Test;
1919

2020
use markup5ever::buffer_queue::BufferQueue;
2121
use xml5ever::tendril::{SliceExt, StrTendril};
@@ -28,6 +28,7 @@ use xml5ever::{namespace_url, ns, Attribute, LocalName, QualName};
2828

2929
mod util {
3030
pub mod find_tests;
31+
pub mod runner;
3132
}
3233

3334
// Return all ways of splitting the string into at most n
@@ -279,15 +280,11 @@ fn json_to_tokens(js: &Value, exact_errors: bool) -> Vec<Token> {
279280
sink.get_tokens()
280281
}
281282

282-
fn mk_xml_test(
283-
desc: String,
284-
input: String,
285-
expect: Value,
286-
opts: XmlTokenizerOpts,
287-
) -> TestDescAndFn {
288-
TestDescAndFn {
289-
desc: TestDesc::new(DynTestName(desc)),
290-
testfn: DynTestFn(Box::new(move || {
283+
fn mk_xml_test(name: String, input: String, expect: Value, opts: XmlTokenizerOpts) -> Test {
284+
Test {
285+
name,
286+
skip: false,
287+
test: Box::new(move || {
291288
// Split up the input at different points to test incremental tokenization.
292289
let insplits = splits(&input, 3);
293290
for input in insplits.into_iter() {
@@ -304,11 +301,11 @@ fn mk_xml_test(
304301
);
305302
}
306303
}
307-
})),
304+
}),
308305
}
309306
}
310307

311-
fn mk_xml_tests(tests: &mut Vec<TestDescAndFn>, filename: &str, js: &Value) {
308+
fn mk_xml_tests(tests: &mut Vec<Test>, filename: &str, js: &Value) {
312309
let input: &str = &js.find("input").get_str();
313310
let expect = js.find("output");
314311
let desc = format!("tok: {}: {}", filename, js.find("description").get_str());
@@ -346,7 +343,7 @@ fn mk_xml_tests(tests: &mut Vec<TestDescAndFn>, filename: &str, js: &Value) {
346343
}
347344
}
348345

349-
fn tests(src_dir: &Path) -> Vec<TestDescAndFn> {
346+
fn tests(src_dir: &Path) -> Vec<Test> {
350347
let mut tests = vec![];
351348
foreach_xml5lib_test(
352349
src_dir,
@@ -373,6 +370,7 @@ fn tests(src_dir: &Path) -> Vec<TestDescAndFn> {
373370
}
374371

375372
fn main() {
376-
let args: Vec<_> = env::args().collect();
377-
rustc_test::test_main(&args, tests(Path::new(env!("CARGO_MANIFEST_DIR"))));
373+
for test in tests(Path::new(env!("CARGO_MANIFEST_DIR"))) {
374+
test.run();
375+
}
378376
}

rcdom/tests/xml-tree-builder.rs

+13-13
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,19 @@
99

1010
use markup5ever::{namespace_url, ns};
1111
use markup5ever_rcdom::*;
12-
use rustc_test::{DynTestFn, DynTestName, TestDesc, TestDescAndFn};
1312
use std::collections::{HashMap, HashSet};
1413
use std::ffi::OsStr;
1514
use std::io::BufRead;
1615
use std::path::Path;
1716
use std::{env, fs, io, iter, mem};
1817
use util::find_tests::foreach_xml5lib_test;
18+
use util::runner::Test;
1919
use xml5ever::driver::parse_document;
2020
use xml5ever::tendril::TendrilSink;
2121

2222
mod util {
2323
pub mod find_tests;
24+
pub mod runner;
2425
}
2526

2627
fn parse_tests<It: Iterator<Item = String>>(mut lines: It) -> Vec<HashMap<String, String>> {
@@ -158,7 +159,7 @@ fn serialize(buf: &mut String, indent: usize, handle: Handle) {
158159
static IGNORE_SUBSTRS: &[&str] = &["<template"];
159160

160161
fn make_xml_test(
161-
tests: &mut Vec<TestDescAndFn>,
162+
tests: &mut Vec<Test>,
162163
ignores: &HashSet<String>,
163164
filename: &str,
164165
idx: usize,
@@ -172,14 +173,12 @@ fn make_xml_test(
172173
let data = get_field("data");
173174
let expected = get_field("document");
174175
let name = format!("tb: {}-{}", filename, idx);
175-
let ignore = ignores.contains(&name) || IGNORE_SUBSTRS.iter().any(|&ig| data.contains(ig));
176+
let skip = ignores.contains(&name) || IGNORE_SUBSTRS.iter().any(|&ig| data.contains(ig));
176177

177-
tests.push(TestDescAndFn {
178-
desc: TestDesc {
179-
ignore,
180-
..TestDesc::new(DynTestName(name))
181-
},
182-
testfn: DynTestFn(Box::new(move || {
178+
tests.push(Test {
179+
name,
180+
skip,
181+
test: Box::new(move || {
183182
let mut result = String::new();
184183

185184
let dom = parse_document(RcDom::default(), Default::default()).one(data.clone());
@@ -196,11 +195,11 @@ fn make_xml_test(
196195
data, result, expected
197196
);
198197
}
199-
})),
198+
}),
200199
});
201200
}
202201

203-
fn tests(src_dir: &Path, ignores: &HashSet<String>) -> Vec<TestDescAndFn> {
202+
fn tests(src_dir: &Path, ignores: &HashSet<String>) -> Vec<Test> {
204203
let mut tests = vec![];
205204

206205
foreach_xml5lib_test(
@@ -228,7 +227,6 @@ fn tests(src_dir: &Path, ignores: &HashSet<String>) -> Vec<TestDescAndFn> {
228227
}
229228

230229
fn main() {
231-
let args: Vec<_> = env::args().collect();
232230
let src_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
233231
let mut ignores = HashSet::new();
234232
if let Ok(f) = fs::File::open(src_dir.join("data/test/ignore")) {
@@ -238,5 +236,7 @@ fn main() {
238236
}
239237
}
240238

241-
rustc_test::test_main(&args, tests(src_dir, &ignores));
239+
for test in tests(src_dir, &ignores) {
240+
test.run();
241+
}
242242
}

xml5ever/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ markup5ever = {version = "0.12", path = "../markup5ever" }
2222

2323
[dev-dependencies]
2424
criterion = "0.3"
25-
rustc-test = "0.3"
2625

2726
[[bench]]
2827
name = "xml5ever"

0 commit comments

Comments
 (0)