diff options
Diffstat (limited to 'src/authority.rs')
| -rw-r--r-- | src/authority.rs | 146 | 
1 files changed, 146 insertions, 0 deletions
| diff --git a/src/authority.rs b/src/authority.rs index 955816c..18d86fa 100644 --- a/src/authority.rs +++ b/src/authority.rs @@ -151,3 +151,149 @@ impl std::fmt::Display for Authority {          Ok(())      }  } + +#[cfg(test)] +mod tests { + +    use super::*; + +    #[test] +    fn userinfo() { +        named_tuple!( +            struct TestVector { +                authority_string: &'static str, +                userinfo: Option<&'static str>, +            } +        ); +        let test_vectors: &[TestVector] = &[ +            ("www.example.com", None).into(), +            ("joe@www.example.com", Some("joe")).into(), +            ("pepe:feelsbadman@www.example.com", Some("pepe:feelsbadman")).into(), +        ]; +        for test_vector in test_vectors { +            let authority = Authority::parse(test_vector.authority_string()); +            assert!(authority.is_ok()); +            let authority = authority.unwrap(); +            assert_eq!( +                test_vector.userinfo().map(str::as_bytes), +                authority.userinfo.as_ref().map(|v| &v[..]) +            ); +        } +    } + +    #[test] +    fn userinfo_illegal_characters() { +        let test_vectors = [ +            "%X@www.example.com", +            "{@www.example.com", +        ]; +        for test_vector in &test_vectors { +            let authority = Authority::parse(test_vector); +            assert!(authority.is_err()); +        } +    } + +    #[test] +    fn userinfo_barely_legal() { +        named_tuple!( +            struct TestVector { +                uri_string: &'static str, +                userinfo: &'static str +            } +        ); +        let test_vectors: &[TestVector] = &[ +            ("%41@www.example.com", "A").into(), +            ("@www.example.com", "").into(), +            ("!@www.example.com", "!").into(), +            ("'@www.example.com", "'").into(), +            ("(@www.example.com", "(").into(), +            (";@www.example.com", ";").into(), +            (":@www.example.com", ":").into(), +        ]; +        for test_vector in test_vectors { +            let authority = Authority::parse(test_vector.uri_string()); +            assert!(authority.is_ok()); +            let authority = authority.unwrap(); +            assert_eq!( +                Some(test_vector.userinfo().as_bytes()), +                authority.userinfo.as_ref().map(|v| &v[..]) +            ); +        } +    } + +    #[test] +    fn host_illegal_characters() { +        let test_vectors = [ +            "%X@www.example.com", +            "@www:example.com", +            "[vX.:]", +        ]; +        for test_vector in &test_vectors { +            let authority = Authority::parse(test_vector); +            assert!(authority.is_err()); +        } +    } + +    #[test] +    fn host_barely_legal() { +        named_tuple!( +            struct TestVector { +                authority_string: &'static str, +                host: &'static str +            } +        ); +        let test_vectors: &[TestVector] = &[ +            ("%41", "a").into(), +            ("", "").into(), +            ("!", "!").into(), +            ("'", "'").into(), +            ("(", "(").into(), +            (";", ";").into(), +            ("1.2.3.4", "1.2.3.4").into(), +            ("[v7.:]", "v7.:").into(), +            ("[v7.aB]", "v7.aB").into(), +        ]; +        for test_vector in test_vectors { +            let authority = Authority::parse(test_vector.authority_string()); +            assert!(authority.is_ok()); +            let authority = authority.unwrap(); +            assert_eq!( +                test_vector.host().as_bytes(), +                authority.host() +            ); +        } +    } + +    #[test] +    fn host_ends_in_dot() { +        let authority = Authority::parse("example.com."); +        assert!(authority.is_ok()); +        let authority = authority.unwrap(); +        assert_eq!( +            b"example.com.", +            authority.host() +        ); +    } + +    #[test] +    fn host_mixed_case() { +        let test_vectors = [ +            "www.example.com", +            "www.EXAMPLE.com", +            "www.exAMple.com", +            "www.example.cOM", +            "wWw.exampLe.Com", +        ]; +        let normalized_host = "www.example.com"; +        for test_vector in &test_vectors { +            let authority = Authority::parse(*test_vector); +            assert!(authority.is_ok()); +            let authority = authority.unwrap(); +            assert_eq!( +                normalized_host.as_bytes(), +                authority.host() +            ); +        } +    } + +} | 
