From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- third_party/rust/idna/tests/punycode.rs | 114 ++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 third_party/rust/idna/tests/punycode.rs (limited to 'third_party/rust/idna/tests/punycode.rs') diff --git a/third_party/rust/idna/tests/punycode.rs b/third_party/rust/idna/tests/punycode.rs new file mode 100644 index 0000000000..2867e4966e --- /dev/null +++ b/third_party/rust/idna/tests/punycode.rs @@ -0,0 +1,114 @@ +// Copyright 2013 The rust-url developers. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use crate::test::TestFn; +use idna::punycode::{decode, encode_str}; +use serde_json::map::Map; +use serde_json::Value; +use std::panic::catch_unwind; +use std::str::FromStr; + +fn one_test(decoded: &str, encoded: &str) { + match decode(encoded) { + None => panic!("Decoding {} failed.", encoded), + Some(result) => { + let result = result.into_iter().collect::(); + assert!( + result == decoded, + "Incorrect decoding of \"{}\":\n \"{}\"\n!= \"{}\"\n", + encoded, + result, + decoded + ) + } + } + + match encode_str(decoded) { + None => panic!("Encoding {} failed.", decoded), + Some(result) => assert!( + result == encoded, + "Incorrect encoding of \"{}\":\n \"{}\"\n!= \"{}\"\n", + decoded, + result, + encoded + ), + } +} + +fn one_bad_test(encode: &str) { + let result = catch_unwind(|| encode_str(encode)); + assert!( + matches!(&result, Ok(None)), + "Should neither panic nor return Some result, but got {:?}", + result + ) +} + +fn get_string<'a>(map: &'a Map, key: &str) -> &'a str { + match map.get(&key.to_string()) { + Some(Value::String(s)) => s, + None => "", + _ => panic!(), + } +} + +pub fn collect_tests(add_test: &mut F) { + match Value::from_str(include_str!("punycode_tests.json")) { + Ok(Value::Array(tests)) => { + for (i, test) in tests.into_iter().enumerate() { + match test { + Value::Object(o) => { + let test_name = { + let desc = get_string(&o, "description"); + if desc.is_empty() { + format!("Punycode {}", i + 1) + } else { + format!("Punycode {}: {}", i + 1, desc) + } + }; + add_test( + test_name, + TestFn::DynTestFn(Box::new(move || { + one_test(get_string(&o, "decoded"), get_string(&o, "encoded")) + })), + ) + } + _ => panic!(), + } + } + } + other => panic!("{:?}", other), + } + + match Value::from_str(include_str!("bad_punycode_tests.json")) { + Ok(Value::Array(tests)) => { + for (i, test) in tests.into_iter().enumerate() { + match test { + Value::Object(o) => { + let test_name = { + let desc = get_string(&o, "description"); + if desc.is_empty() { + format!("Bad Punycode {}", i + 1) + } else { + format!("Bad Punycode {}: {}", i + 1, desc) + } + }; + add_test( + test_name, + TestFn::DynTestFn(Box::new(move || { + one_bad_test(get_string(&o, "decoded")) + })), + ) + } + _ => panic!(), + } + } + } + other => panic!("{:?}", other), + } +} -- cgit v1.2.3