use idna::uts46::AsciiDenyList;
use idna::uts46::DnsLength;
use idna::uts46::Hyphens;
/// https://github.com/servo/rust-url/issues/373
#[ test]
fn test_punycode_prefix_with_length_check() {
let config = idna::uts46::Uts46::new();
assert!(config
.to_ascii(
b
"xn--" ,
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify
)
.is_err());
assert!(config
.to_ascii(
b
"xn---" ,
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify
)
.is_err());
assert!(config
.to_ascii(
b
"xn-----" ,
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
assert!(config
.to_ascii(
b
"xn--." ,
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify
)
.is_err());
assert!(config
.to_ascii(
b
"xn--..." ,
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
assert!(config
.to_ascii(
b
".xn--" ,
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
assert!(config
.to_ascii(
b
"...xn--" ,
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
assert!(config
.to_ascii(
b
"xn--.xn--" ,
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
assert!(config
.to_ascii(
b
"xn--.example.org" ,
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
}
/// https://github.com/servo/rust-url/issues/373
#[ test]
fn test_punycode_prefix_without_length_check() {
let config = idna::uts46::Uts46::new();
assert!(config
.to_ascii(
b
"xn--" ,
AsciiDenyList::URL,
Hyphens::Allow,
DnsLength::Ignore
)
.is_err());
assert!(config
.to_ascii(
b
"xn---" ,
AsciiDenyList::URL,
Hyphens::Allow,
DnsLength::Ignore
)
.is_err());
assert!(config
.to_ascii(
b
"xn-----" ,
AsciiDenyList::URL,
Hyphens::Allow,
DnsLength::Ignore
)
.is_err());
assert!(config
.to_ascii(
b
"xn--." ,
AsciiDenyList::URL,
Hyphens::Allow,
DnsLength::Ignore
)
.is_err());
assert!(config
.to_ascii(
b
"xn--..." ,
AsciiDenyList::URL,
Hyphens::Allow,
DnsLength::Ignore
)
.is_err());
assert!(config
.to_ascii(
b
".xn--" ,
AsciiDenyList::URL,
Hyphens::Allow,
DnsLength::Ignore
)
.is_err());
assert!(config
.to_ascii(
b
"...xn--" ,
AsciiDenyList::URL,
Hyphens::Allow,
DnsLength::Ignore
)
.is_err());
assert!(config
.to_ascii(
b
"xn--.xn--" ,
AsciiDenyList::URL,
Hyphens::Allow,
DnsLength::Ignore
)
.is_err());
assert!(config
.to_ascii(
b
"xn--.example.org" ,
AsciiDenyList::URL,
Hyphens::Allow,
DnsLength::Ignore
)
.is_err());
}
/*
// http://www.unicode.org/reports/tr46/#Table_Example_Processing
# [ test ]
fn test_examples ( ) {
let codec = idna : : uts46bis : : Uts46 : : new ( ) ;
let mut out = String : : new ( ) ;
assert_matches ! ( codec . to_unicode ( " Blo ß . de " , & mut out ) , Ok ( ( ) ) ) ;
assert_eq ! ( out , " blo ß . de " ) ;
out . clear ( ) ;
assert_matches ! ( codec . to_unicode ( " xn - - blo - 7 ka . de " , & mut out ) , Ok ( ( ) ) ) ;
assert_eq ! ( out , " blo ß . de " ) ;
out . clear ( ) ;
assert_matches ! ( codec . to_unicode ( " u \ u { 308 } . com " , & mut out ) , Ok ( ( ) ) ) ;
assert_eq ! ( out , " ü . com " ) ;
out . clear ( ) ;
assert_matches ! ( codec . to_unicode ( " xn - - tda . com " , & mut out ) , Ok ( ( ) ) ) ;
assert_eq ! ( out , " ü . com " ) ;
out . clear ( ) ;
assert_matches ! ( codec . to_unicode ( " xn - - u - ccb . com " , & mut out ) , Err ( _ ) ) ;
out . clear ( ) ;
assert_matches ! ( codec . to_unicode ( " a ⒈ com " , & mut out ) , Err ( _ ) ) ;
out . clear ( ) ;
assert_matches ! ( codec . to_unicode ( " xn - - a - ecp . ru " , & mut out ) , Err ( _ ) ) ;
out . clear ( ) ;
assert_matches ! ( codec . to_unicode ( " xn - - 0 . pt " , & mut out ) , Err ( _ ) ) ;
out . clear ( ) ;
assert_matches ! ( codec . to_unicode ( " 日 本 語 。 J P " , & mut out ) , Ok ( ( ) ) ) ;
assert_eq ! ( out , " 日 本 語 . jp " ) ;
out . clear ( ) ;
assert_matches ! ( codec . to_unicode ( " ☕ . us " , & mut out ) , Ok ( ( ) ) ) ;
assert_eq ! ( out , " ☕ . us " ) ;
}
*/
#[ test]
fn test_v5() {
let config = idna::uts46::Uts46::new();
// IdnaTest:784 蔏。
assert!(config
.to_ascii(
"\u{11C3A}" .as_bytes(),
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
assert!(config
.to_ascii(
"\u{850f}.\u{11C3A}" .as_bytes(),
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
assert!(config
.to_ascii(
"\u{850f}\u{ff61}\u{11C3A}" .as_bytes(),
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
}
#[ test]
fn test_v8_bidi_rules() {
let config = idna::uts46::Uts46::new();
assert_eq!(
config
.to_ascii(
b
"abc" ,
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.unwrap(),
"abc"
);
assert_eq!(
config
.to_ascii(
b
"123" ,
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.unwrap(),
"123"
);
assert_eq!(
config
.to_ascii(
"אבּג" .as_bytes(),
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.unwrap(),
"xn--kdb3bdf"
);
assert_eq!(
config
.to_ascii(
"ابج" .as_bytes(),
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.unwrap(),
"xn--mgbcm"
);
assert_eq!(
config
.to_ascii(
"abc.ابج" .as_bytes(),
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.unwrap(),
"abc.xn--mgbcm"
);
assert_eq!(
config
.to_ascii(
"אבּג.ابج" .as_bytes(),
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.unwrap(),
"xn--kdb3bdf.xn--mgbcm"
);
// Bidi domain names cannot start with digits
assert!(config
.to_ascii(
"0a.\u{05D0}" .as_bytes(),
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
assert!(config
.to_ascii(
"0à.\u{05D0}" .as_bytes(),
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
// Bidi chars may be punycode-encoded
assert!(config
.to_ascii(
b
"xn--0ca24w" ,
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
}
#[ test]
fn emoji_domains() {
// HOT BEVERAGE is allowed here...
let config = idna::uts46::Uts46::new();
assert_eq!(
config
.to_ascii(
"☕.com" .as_bytes(),
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.unwrap(),
"xn--53h.com"
);
}
#[ test]
fn unicode_before_delimiter() {
let config = idna::uts46::Uts46::new();
assert!(config
.to_ascii(
"xn--f\u{34a}-PTP" .as_bytes(),
AsciiDenyList::STD3,
Hyphens::Check,
DnsLength::Verify,
)
.is_err());
}
#[ test]
fn upper_case_ascii_in_punycode() {
let config = idna::uts46::Uts46::new();
let (unicode, result) =
config.to_unicode(
"xn--A-1ga" .as_bytes(), AsciiDenyList::STD3, Hyphens::Check);
assert!(result.is_ok());
assert_eq!(&unicode,
"aö" );
}
Messung V0.5 in Prozent C=84 H=93 G=88
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet am 2026-06-18)
¤
*© Formatika GbR, Deutschland