|
8 | 8 |
|
9 | 9 | //! Data-driven tests imported from web-platform-tests
|
10 | 10 |
|
| 11 | +use serde_json::Value; |
11 | 12 | use std::collections::HashMap;
|
12 | 13 | use std::fmt::Write;
|
13 |
| -use std::panic; |
14 |
| - |
15 |
| -use serde_json::Value; |
| 14 | +#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] |
| 15 | +use std::sync::Mutex; |
16 | 16 | use url::Url;
|
17 | 17 |
|
| 18 | +// https://rustwasm.github.io/wasm-bindgen/wasm-bindgen-test/usage.html |
| 19 | +#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] |
| 20 | +use wasm_bindgen_test::{console_log, wasm_bindgen_test, wasm_bindgen_test_configure}; |
| 21 | +#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] |
| 22 | +wasm_bindgen_test_configure!(run_in_browser); |
| 23 | + |
| 24 | +// wpt has its own test driver, but we shoe-horn this into wasm_bindgen_test |
| 25 | +// which will discard stdout and stderr. So, we make println! go to |
| 26 | +// console.log(), so we see failures that do not result in panics. |
| 27 | + |
| 28 | +#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] |
| 29 | +static PRINT_BUF: Mutex<Option<String>> = Mutex::new(None); |
| 30 | + |
| 31 | +#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] |
| 32 | +macro_rules! print { |
| 33 | + ($($arg:tt)*) => { |
| 34 | + let v = format!($($arg)*); |
| 35 | + { |
| 36 | + let mut buf = PRINT_BUF.lock().unwrap(); |
| 37 | + if let Some(buf) = buf.as_mut() { |
| 38 | + buf.push_str(&v); |
| 39 | + } else { |
| 40 | + *buf = Some(v); |
| 41 | + } |
| 42 | + } |
| 43 | + }; |
| 44 | +} |
| 45 | + |
| 46 | +#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] |
| 47 | +macro_rules! println { |
| 48 | + () => { |
| 49 | + let buf = PRINT_BUF.lock().unwrap().take(); |
| 50 | + match buf { |
| 51 | + Some(buf) => console_log!("{buf}"), |
| 52 | + None => console_log!(""), |
| 53 | + } |
| 54 | + }; |
| 55 | + ($($arg:tt)*) => { |
| 56 | + let buf = PRINT_BUF.lock().unwrap().take(); |
| 57 | + match buf { |
| 58 | + Some(buf) => { |
| 59 | + let v = format!($($arg)*); |
| 60 | + console_log!("{buf}{v}"); |
| 61 | + }, |
| 62 | + None => console_log!($($arg)*), |
| 63 | + } |
| 64 | + } |
| 65 | +} |
| 66 | + |
18 | 67 | #[derive(Debug, serde::Deserialize)]
|
19 | 68 | struct UrlTest {
|
20 | 69 | input: String,
|
@@ -71,6 +120,7 @@ struct SetterTestExpected {
|
71 | 120 | hash: Option<String>,
|
72 | 121 | }
|
73 | 122 |
|
| 123 | +#[cfg_attr(all(target_arch = "wasm32", target_os = "unknown"), wasm_bindgen_test)] |
74 | 124 | fn main() {
|
75 | 125 | let mut filter = None;
|
76 | 126 | let mut args = std::env::args().skip(1);
|
@@ -228,16 +278,16 @@ fn run_url_test(
|
228 | 278 | ) -> Result<(), String> {
|
229 | 279 | let base = match base {
|
230 | 280 | Some(base) => {
|
231 |
| - let base = panic::catch_unwind(|| Url::parse(&base)) |
232 |
| - .map_err(|_| "panicked while parsing base".to_string())? |
233 |
| - .map_err(|e| format!("errored while parsing base: {}", e))?; |
| 281 | + let base = |
| 282 | + Url::parse(&base).map_err(|e| format!("errored while parsing base: {}", e))?; |
234 | 283 | Some(base)
|
235 | 284 | }
|
236 | 285 | None => None,
|
237 | 286 | };
|
238 | 287 |
|
239 |
| - let res = panic::catch_unwind(move || Url::options().base_url(base.as_ref()).parse(&input)) |
240 |
| - .map_err(|_| "panicked while parsing input".to_string())? |
| 288 | + let res = Url::options() |
| 289 | + .base_url(base.as_ref()) |
| 290 | + .parse(&input) |
241 | 291 | .map_err(|e| format!("errored while parsing input: {}", e));
|
242 | 292 |
|
243 | 293 | match result {
|
@@ -340,38 +390,34 @@ fn run_setter_test(
|
340 | 390 | expected,
|
341 | 391 | }: SetterTest,
|
342 | 392 | ) -> Result<(), String> {
|
343 |
| - let mut url = panic::catch_unwind(|| Url::parse(&href)) |
344 |
| - .map_err(|_| "panicked while parsing href".to_string())? |
345 |
| - .map_err(|e| format!("errored while parsing href: {}", e))?; |
346 |
| - |
347 |
| - let url = panic::catch_unwind(move || { |
348 |
| - match kind { |
349 |
| - "protocol" => { |
350 |
| - url::quirks::set_protocol(&mut url, &new_value).ok(); |
351 |
| - } |
352 |
| - "username" => { |
353 |
| - url::quirks::set_username(&mut url, &new_value).ok(); |
354 |
| - } |
355 |
| - "password" => { |
356 |
| - url::quirks::set_password(&mut url, &new_value).ok(); |
357 |
| - } |
358 |
| - "host" => { |
359 |
| - url::quirks::set_host(&mut url, &new_value).ok(); |
360 |
| - } |
361 |
| - "hostname" => { |
362 |
| - url::quirks::set_hostname(&mut url, &new_value).ok(); |
363 |
| - } |
364 |
| - "port" => { |
365 |
| - url::quirks::set_port(&mut url, &new_value).ok(); |
366 |
| - } |
367 |
| - "pathname" => url::quirks::set_pathname(&mut url, &new_value), |
368 |
| - "search" => url::quirks::set_search(&mut url, &new_value), |
369 |
| - "hash" => url::quirks::set_hash(&mut url, &new_value), |
370 |
| - _ => panic!("unknown setter kind: {:?}", kind), |
371 |
| - }; |
372 |
| - url |
373 |
| - }) |
374 |
| - .map_err(|_| "panicked while setting value".to_string())?; |
| 393 | + let mut url = Url::parse(&href).map_err(|e| format!("errored while parsing href: {}", e))?; |
| 394 | + |
| 395 | + match kind { |
| 396 | + "protocol" => { |
| 397 | + url::quirks::set_protocol(&mut url, &new_value).ok(); |
| 398 | + } |
| 399 | + "username" => { |
| 400 | + url::quirks::set_username(&mut url, &new_value).ok(); |
| 401 | + } |
| 402 | + "password" => { |
| 403 | + url::quirks::set_password(&mut url, &new_value).ok(); |
| 404 | + } |
| 405 | + "host" => { |
| 406 | + url::quirks::set_host(&mut url, &new_value).ok(); |
| 407 | + } |
| 408 | + "hostname" => { |
| 409 | + url::quirks::set_hostname(&mut url, &new_value).ok(); |
| 410 | + } |
| 411 | + "port" => { |
| 412 | + url::quirks::set_port(&mut url, &new_value).ok(); |
| 413 | + } |
| 414 | + "pathname" => url::quirks::set_pathname(&mut url, &new_value), |
| 415 | + "search" => url::quirks::set_search(&mut url, &new_value), |
| 416 | + "hash" => url::quirks::set_hash(&mut url, &new_value), |
| 417 | + _ => { |
| 418 | + return Err(format!("unknown setter kind: {:?}", kind)); |
| 419 | + } |
| 420 | + } |
375 | 421 |
|
376 | 422 | if let Some(expected_href) = expected.href {
|
377 | 423 | let href = url::quirks::href(&url);
|
|
0 commit comments