]> git.proxmox.com Git - cargo.git/blobdiff - vendor/idna/tests/unit.rs
New upstream version 0.52.0
[cargo.git] / vendor / idna / tests / unit.rs
index e24e2a31995f7551a0f0e457dbabb165309a64ba..297c8cfce268e0956f6ab8a7b20cc19cfe85d280 100644 (file)
-extern crate idna;
-extern crate unicode_normalization;
-
+use assert_matches::assert_matches;
 use unicode_normalization::char::is_combining_mark;
 
-fn _to_ascii(domain: &str) -> Result<String, idna::Errors> {
-    idna::Config::default()
+/// https://github.com/servo/rust-url/issues/373
+#[test]
+fn test_punycode_prefix_with_length_check() {
+    let config = idna::Config::default()
         .verify_dns_length(true)
-        .use_std3_ascii_rules(true)
-        .to_ascii(domain)
+        .check_hyphens(true)
+        .use_std3_ascii_rules(true);
+
+    assert!(config.to_ascii("xn--").is_err());
+    assert!(config.to_ascii("xn---").is_err());
+    assert!(config.to_ascii("xn-----").is_err());
+    assert!(config.to_ascii("xn--.").is_err());
+    assert!(config.to_ascii("xn--...").is_err());
+    assert!(config.to_ascii(".xn--").is_err());
+    assert!(config.to_ascii("...xn--").is_err());
+    assert!(config.to_ascii("xn--.xn--").is_err());
+    assert!(config.to_ascii("xn--.example.org").is_err());
+}
+
+/// https://github.com/servo/rust-url/issues/373
+#[test]
+fn test_punycode_prefix_without_length_check() {
+    let config = idna::Config::default()
+        .verify_dns_length(false)
+        .check_hyphens(true)
+        .use_std3_ascii_rules(true);
+
+    assert_eq!(config.to_ascii("xn--").unwrap(), "");
+    assert!(config.to_ascii("xn---").is_err());
+    assert!(config.to_ascii("xn-----").is_err());
+    assert_eq!(config.to_ascii("xn--.").unwrap(), ".");
+    assert_eq!(config.to_ascii("xn--...").unwrap(), "...");
+    assert_eq!(config.to_ascii(".xn--").unwrap(), ".");
+    assert_eq!(config.to_ascii("...xn--").unwrap(), "...");
+    assert_eq!(config.to_ascii("xn--.xn--").unwrap(), ".");
+    assert_eq!(config.to_ascii("xn--.example.org").unwrap(), ".example.org");
+}
+
+// http://www.unicode.org/reports/tr46/#Table_Example_Processing
+#[test]
+fn test_examples() {
+    let mut codec = idna::Idna::default();
+    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-7ka.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("日本語。JP", &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::Config::default()
+        .verify_dns_length(true)
+        .use_std3_ascii_rules(true);
+
     // IdnaTest:784 蔏。𑰺
     assert!(is_combining_mark('\u{11C3A}'));
-    assert!(_to_ascii("\u{11C3A}").is_err());
-    assert!(_to_ascii("\u{850f}.\u{11C3A}").is_err());
-    assert!(_to_ascii("\u{850f}\u{ff61}\u{11C3A}").is_err());
+    assert!(config.to_ascii("\u{11C3A}").is_err());
+    assert!(config.to_ascii("\u{850f}.\u{11C3A}").is_err());
+    assert!(config.to_ascii("\u{850f}\u{ff61}\u{11C3A}").is_err());
 }
 
 #[test]
 fn test_v8_bidi_rules() {
-    assert_eq!(_to_ascii("abc").unwrap(), "abc");
-    assert_eq!(_to_ascii("123").unwrap(), "123");
-    assert_eq!(_to_ascii("אבּג").unwrap(), "xn--kdb3bdf");
-    assert_eq!(_to_ascii("ابج").unwrap(), "xn--mgbcm");
-    assert_eq!(_to_ascii("abc.ابج").unwrap(), "abc.xn--mgbcm");
-    assert_eq!(
-        _to_ascii("אבּג.ابج").unwrap(),
-        "xn--kdb3bdf.xn--mgbcm"
-    );
+    let config = idna::Config::default()
+        .verify_dns_length(true)
+        .use_std3_ascii_rules(true);
+
+    assert_eq!(config.to_ascii("abc").unwrap(), "abc");
+    assert_eq!(config.to_ascii("123").unwrap(), "123");
+    assert_eq!(config.to_ascii("אבּג").unwrap(), "xn--kdb3bdf");
+    assert_eq!(config.to_ascii("ابج").unwrap(), "xn--mgbcm");
+    assert_eq!(config.to_ascii("abc.ابج").unwrap(), "abc.xn--mgbcm");
+    assert_eq!(config.to_ascii("אבּג.ابج").unwrap(), "xn--kdb3bdf.xn--mgbcm");
 
     // Bidi domain names cannot start with digits
-    assert!(_to_ascii("0a.\u{05D0}").is_err());
-    assert!(_to_ascii("0à.\u{05D0}").is_err());
+    assert!(config.to_ascii("0a.\u{05D0}").is_err());
+    assert!(config.to_ascii("0à.\u{05D0}").is_err());
 
     // Bidi chars may be punycode-encoded
-    assert!(_to_ascii("xn--0ca24w").is_err());
+    assert!(config.to_ascii("xn--0ca24w").is_err());
+}
+
+#[test]
+fn emoji_domains() {
+    // HOT BEVERAGE is allowed here...
+    let config = idna::Config::default()
+        .verify_dns_length(true)
+        .use_std3_ascii_rules(true);
+    assert_eq!(config.to_ascii("☕.com").unwrap(), "xn--53h.com");
+
+    // ... but not here
+    let config = idna::Config::default()
+        .verify_dns_length(true)
+        .use_std3_ascii_rules(true)
+        .use_idna_2008_rules(true);
+    let error = format!("{:?}", config.to_ascii("☕.com").unwrap_err());
+    assert!(error.contains("disallowed_in_idna_2008"));
+}
+
+#[test]
+fn unicode_before_delimiter() {
+    let config = idna::Config::default();
+    assert!(config.to_ascii("xn--f\u{34a}-PTP").is_err());
 }