Skip to content

Commit 16e0e57

Browse files
committed
Use serde to read JSON into custom types rather than serde_json::Value
1 parent 226e0a4 commit 16e0e57

File tree

2 files changed

+36
-51
lines changed

2 files changed

+36
-51
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ mime = "0.3"
99

1010
[dev-dependencies]
1111
rustc-test = "0.3"
12-
serde = "1.0"
12+
serde = {version = "1.0", features = ["derive"]}
1313
serde_json = "1.0"
1414

1515
[lib]

tests/wpt.rs

Lines changed: 35 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
extern crate data_url;
22
extern crate rustc_test;
3+
#[macro_use] extern crate serde;
34
extern crate serde_json;
45

56
fn run_data_url(input: String, expected_mime: Option<String>, expected_body: Option<Vec<u8>>) {
@@ -40,20 +41,19 @@ fn collect_data_url<F>(add_test: &mut F)
4041
"data:x/x;base64;charset=x;base64,WA",
4142
];
4243

43-
let json = include_str!("data-urls.json");
44-
let v: serde_json::Value = serde_json::from_str(json).unwrap();
45-
for test in v.as_array().unwrap() {
46-
let input = test.get(0).unwrap().as_str().unwrap().to_owned();
47-
48-
let expected_mime = test.get(1).unwrap();
49-
let expected_mime = if expected_mime.is_null() {
50-
None
51-
} else {
52-
Some(expected_mime.as_str().unwrap().to_owned())
44+
#[derive(Deserialize)]
45+
#[serde(untagged)]
46+
enum TestCase {
47+
Two(String, Option<String>),
48+
Three(String, Option<String>, Vec<u8>),
49+
};
50+
51+
let v: Vec<TestCase> = serde_json::from_str(include_str!("data-urls.json")).unwrap();
52+
for test in v {
53+
let (input, expected_mime, expected_body) = match test {
54+
TestCase::Two(i, m) => (i, m, None),
55+
TestCase::Three(i, m, b) => (i, m, Some(b)),
5356
};
54-
55-
let expected_body = test.get(2).map(json_byte_array);
56-
5757
let should_panic = known_failures.contains(&&*input);
5858
add_test(
5959
format!("data: URL {:?}", input),
@@ -81,17 +81,9 @@ fn collect_base64<F>(add_test: &mut F)
8181
{
8282
let known_failures = [];
8383

84-
let json = include_str!("base64.json");
85-
let v: serde_json::Value = serde_json::from_str(json).unwrap();
86-
for test in v.as_array().unwrap() {
87-
let input = test.get(0).unwrap().as_str().unwrap().to_owned();
88-
let expected = test.get(1).unwrap();
89-
let expected = if expected.is_null() {
90-
None
91-
} else {
92-
Some(json_byte_array(expected))
93-
};
94-
84+
let v: Vec<(String, Option<Vec<u8>>)> =
85+
serde_json::from_str(include_str!("base64.json")).unwrap();
86+
for (input, expected) in v {
9587
let should_panic = known_failures.contains(&&*input);
9688
add_test(
9789
format!("base64 {:?}", input),
@@ -120,34 +112,35 @@ fn collect_mime<F>(add_test: &mut F)
120112
// Many WPT tests fail with the mime crate’s parser,
121113
// since that parser is not written for the same spec.
122114
// Only run a few of them for now, since listing all the failures individually is not useful.
123-
let only_run_first_n_tests = 5;
115+
let only_run_first_n_entries = 5;
124116
let known_failures = [
125117
"text/html;charset=gbk(",
126118
];
127119

128-
let json = include_str!("mime-types.json");
129-
let json2 = include_str!("generated-mime-types.json");
130-
let v: serde_json::Value = serde_json::from_str(json).unwrap();
131-
let v2: serde_json::Value = serde_json::from_str(json2).unwrap();
132-
let tests = v.as_array().unwrap().iter().chain(v2.as_array().unwrap());
120+
#[derive(Deserialize)]
121+
#[serde(untagged)]
122+
enum Entry {
123+
Comment(String),
124+
TestCase { input: String, output: Option<String> }
125+
}
126+
127+
let v: Vec<Entry> = serde_json::from_str(include_str!("mime-types.json")).unwrap();
128+
let v2: Vec<Entry> = serde_json::from_str(include_str!("generated-mime-types.json")).unwrap();
129+
let entries = v.into_iter().chain(v2);
133130

134131
let mut last_comment = None;
135-
for test in tests.take(only_run_first_n_tests) {
136-
if let Some(s) = test.as_str() {
137-
last_comment = Some(s);
138-
continue
139-
}
140-
let input = test.get("input").unwrap().as_str().unwrap().to_owned();
141-
let expected = test.get("output").unwrap();
142-
let expected = if expected.is_null() {
143-
None
144-
} else {
145-
Some(expected.as_str().unwrap().to_owned())
132+
for entry in entries.take(only_run_first_n_entries) {
133+
let (input, expected) = match entry {
134+
Entry::TestCase { input, output } => (input, output),
135+
Entry::Comment(s) => {
136+
last_comment = Some(s);
137+
continue
138+
}
146139
};
147140

148141
let should_panic = known_failures.contains(&&*input);
149142
add_test(
150-
if let Some(s) = last_comment {
143+
if let Some(ref s) = last_comment {
151144
format!("MIME type {:?} {:?}", s, input)
152145
} else {
153146
format!("MIME type {:?}", input)
@@ -160,14 +153,6 @@ fn collect_mime<F>(add_test: &mut F)
160153
}
161154
}
162155

163-
fn json_byte_array(j: &serde_json::Value) -> Vec<u8> {
164-
j.as_array().unwrap().iter().map(|byte| {
165-
let byte = byte.as_u64().unwrap();
166-
assert!(byte <= 0xFF);
167-
byte as u8
168-
}).collect()
169-
}
170-
171156
fn main() {
172157
let mut tests = Vec::new();
173158
{

0 commit comments

Comments
 (0)