tests.rs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // Copyright 2013 Simon Sapin.
  2. //
  3. // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
  4. // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
  5. // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
  6. // option. This file may not be copied, modified, or distributed
  7. // except according to those terms.
  8. use std::char;
  9. use std::u32;
  10. use super::{URL, RelativeSchemeData, SchemeRelativeURL, UserInfo, OtherSchemeData};
  11. #[test]
  12. fn test_url_parsing() {
  13. for test in parse_test_data(include_str!("urltestdata.txt")).move_iter() {
  14. let Test {
  15. input: input,
  16. base: base,
  17. scheme: expected_scheme,
  18. username: expected_username,
  19. password: expected_password,
  20. host: expected_host,
  21. port: expected_port,
  22. path: expected_path,
  23. query: expected_query,
  24. fragment: expected_fragment
  25. } = test;
  26. let base = URL::parse(base, None).unwrap();
  27. let url = URL::parse(input, Some(base));
  28. if expected_scheme.is_none() {
  29. assert!(url.is_none(), "Expected a parse error");
  30. continue
  31. }
  32. let URL {
  33. scheme: scheme,
  34. scheme_data: scheme_data,
  35. query: query,
  36. fragment: fragment
  37. } = url.unwrap();
  38. assert_eq!(Some(scheme.to_str_ascii()), expected_scheme);
  39. match scheme_data {
  40. RelativeSchemeData(SchemeRelativeURL {
  41. userinfo: userinfo, host: host, port: port, path: path
  42. }) => {
  43. let (username, password) = match userinfo {
  44. Some(UserInfo { username: username, password: password })
  45. => (Some(username.to_str_ascii()), password.map(|p| p.to_str_ascii())),
  46. _ => (None, None),
  47. };
  48. assert_eq!(username, expected_username);
  49. assert_eq!(password, expected_password);
  50. assert_eq!(Some(host.serialize().to_str_ascii()), expected_host)
  51. assert_eq!(Some(port.to_str_ascii()), expected_port);
  52. assert_eq!(Some(path.map(|p| p.to_str_ascii()).connect("/")), expected_path);
  53. },
  54. OtherSchemeData(scheme_data) => {
  55. assert_eq!(Some(scheme_data.to_str_ascii()), expected_path);
  56. assert_eq!(None, expected_username);
  57. assert_eq!(None, expected_password);
  58. assert_eq!(None, expected_host);
  59. assert_eq!(None, expected_port);
  60. },
  61. }
  62. assert_eq!(query.map(|p| p.to_str_ascii()), expected_query);
  63. assert_eq!(fragment.map(|p| p.to_str_ascii()), expected_fragment);
  64. }
  65. }
  66. struct Test {
  67. input: ~str,
  68. base: ~str,
  69. scheme: Option<~str>,
  70. username: Option<~str>,
  71. password: Option<~str>,
  72. host: Option<~str>,
  73. port: Option<~str>,
  74. path: Option<~str>,
  75. query: Option<~str>,
  76. fragment: Option<~str>,
  77. }
  78. fn parse_test_data(input: &str) -> ~[Test] {
  79. let mut tests: ~[Test] = ~[];
  80. for line in input.line_iter() {
  81. if line == "" || line[0] == ('#' as u8) {
  82. continue
  83. }
  84. let mut pieces = line.split_iter(' ').to_owned_vec();
  85. let input = unescape(pieces.shift());
  86. let mut test = Test {
  87. input: input,
  88. base: if pieces.is_empty() {
  89. tests[tests.len() - 1].base.to_owned()
  90. } else {
  91. unescape(pieces.shift())
  92. },
  93. scheme: None,
  94. username: None,
  95. password: None,
  96. host: None,
  97. port: None,
  98. path: None,
  99. query: None,
  100. fragment: None,
  101. };
  102. for piece in pieces.move_iter() {
  103. if piece != "" || piece[0] == ('#' as u8) {
  104. continue
  105. }
  106. let colon = piece.find(':').unwrap();
  107. let value = piece.slice_from(colon + 1).to_owned();
  108. match piece.slice_to(colon) {
  109. "s" => test.scheme = Some(value),
  110. "u" => test.username = Some(value),
  111. "pass" => test.password = Some(value),
  112. "h" => test.host = Some(value),
  113. "p" => test.path = Some(value),
  114. "q" => test.query = Some(value),
  115. "f" => test.fragment = Some(value),
  116. _ => fail!("Invalid token")
  117. }
  118. }
  119. tests.push(test)
  120. }
  121. tests
  122. }
  123. fn unescape(input: &str) -> ~str {
  124. let mut output = ~"";
  125. let mut chars = input.iter();
  126. loop {
  127. match chars.next() {
  128. None => return output,
  129. Some(c) => output.push_char(
  130. if c == '\\' {
  131. match chars.next().unwrap() {
  132. '\\' => '\\',
  133. 'n' => '\n',
  134. 'r' => '\r',
  135. 's' => ' ',
  136. 't' => '\t',
  137. 'f' => '\x0C',
  138. 'u' => {
  139. let mut hex = ~"";
  140. hex.push_char(chars.next().unwrap());
  141. hex.push_char(chars.next().unwrap());
  142. hex.push_char(chars.next().unwrap());
  143. hex.push_char(chars.next().unwrap());
  144. u32::parse_bytes(hex.as_bytes(), 16)
  145. .and_then(char::from_u32).unwrap()
  146. }
  147. _ => fail!("Invalid test data input"),
  148. }
  149. } else {
  150. c
  151. }
  152. )
  153. }
  154. }
  155. }