diff --git a/src/sharry/uri.rs b/src/sharry/uri.rs index 24616ca..70747fe 100644 --- a/src/sharry/uri.rs +++ b/src/sharry/uri.rs @@ -28,7 +28,7 @@ impl AsRef<[u8]> for Uri { fn captured(caps: &Captures, name: &str) -> String { caps.name(name) - .unwrap_or_else(|| panic!("{name} not captured")) + .unwrap_or_else(|| panic!("{name:?} not captured")) .as_str() .to_string() } @@ -103,6 +103,36 @@ mod tests { test_util::check_trait, }; + #[test] + fn check_captured_works() { + let cases = [ + // simple http host + ("http://example.com", "http", "example.com"), + // https host with port + ("https://my-host:8080", "https", "my-host:8080"), + // trailing slash + ("scheme://host/", "scheme", "host"), + // with path + ("scheme://host/path/to/whatever", "scheme", "host"), + // custom scheme + ("custom+scheme://host", "custom+scheme", "host"), + ]; + + for (good, scheme, host) in cases { + let caps = SHARRY_URI_RE.captures(good).unwrap(); + + assert_eq!(captured(&caps, "scheme"), scheme); + assert_eq!(captured(&caps, "host"), host); + } + } + + #[test] + #[should_panic = "\"foo\" not captured"] + fn make_captured_panic() { + let caps = SHARRY_URI_RE.captures("http://example.com").unwrap(); + captured(&caps, "foo"); + } + #[test] fn basic_traits_working() { let cases = [ diff --git a/src/test_util/mock_ids.rs b/src/test_util/mock_ids.rs index 0a1e07f..31d2716 100644 --- a/src/test_util/mock_ids.rs +++ b/src/test_util/mock_ids.rs @@ -109,73 +109,68 @@ impl From for FileID { } } -#[cfg(test)] -mod tests { +#[test] +fn true_makes_valids() { + let uri = Uri::from(true); + let alias_id = AliasID::from(true); + let share_id = ShareID::from(true); + let file_id = FileID::from(true); + + assert!((&uri, &alias_id).check().is_ok()); + assert!(share_id.check().is_ok()); + assert!((&share_id, &file_id).check().is_ok()); +} + +#[test] +fn default_is_valid() { + let uri = Uri::default(); + let alias_id = AliasID::from(true); // no `impl Default` + let share_id = ShareID::default(); + let file_id = FileID::default(); + + assert!((&uri, &alias_id).check().is_ok()); + assert!(share_id.check().is_ok()); + assert!((&share_id, &file_id).check().is_ok()); +} + +#[test] +fn false_makes_invalids() { use crate::Parameter; - use super::*; - - #[test] - fn true_makes_valids() { - let uri = Uri::from(true); - let alias_id = AliasID::from(true); - let share_id = ShareID::from(true); - let file_id = FileID::from(true); - - assert!((&uri, &alias_id).check().is_ok()); - assert!(share_id.check().is_ok()); - assert!((&share_id, &file_id).check().is_ok()); + fn test_check(value: impl CheckID, callback: impl FnOnce(&Parameter) -> bool) { + let check = value.check().unwrap_err(); + let p = check.get_invalid_param().unwrap(); + assert!(callback(p)); } - #[test] - fn default_is_valid() { - let uri = Uri::default(); - let alias_id = AliasID::from(true); // no `impl Default` - let share_id = ShareID::default(); - let file_id = FileID::default(); + // valid ids + let uri = Uri::from(true); + let alias_id = AliasID::from(true); + let share_id = ShareID::from(true); + let file_id = FileID::from(true); - assert!((&uri, &alias_id).check().is_ok()); - assert!(share_id.check().is_ok()); - assert!((&share_id, &file_id).check().is_ok()); - } + // invalid ids + let uri_i = Uri::from(false); + let alias_id_i = AliasID::from(false); + let share_id_i = ShareID::from(false); + let file_id_i = FileID::from(false); - #[test] - fn false_makes_invalids() { - fn test_check(value: impl CheckID, callback: impl FnOnce(&Parameter) -> bool) { - let check = value.check().unwrap_err(); - let p = check.get_invalid_param().unwrap(); - assert!(callback(p)); - } + // param checks + let is_uri_i = |p: &Parameter| matches!(p, Parameter::Uri(_)); + let is_alias_id_i = |p: &Parameter| matches!(p, Parameter::AliasID(_)); + let is_share_id_i = |p: &Parameter| matches!(p, Parameter::ShareID(_)); + let is_file_id_i = |p: &Parameter| matches!(p, Parameter::FileID(_)); - // valid ids - let uri = Uri::from(true); - let alias_id = AliasID::from(true); - let share_id = ShareID::from(true); - let file_id = FileID::from(true); + // uri + alias + test_check((&uri_i, &alias_id_i), is_uri_i); + test_check((&uri_i, &alias_id), is_uri_i); + test_check((&uri, &alias_id_i), is_alias_id_i); - // invalid ids - let uri_i = Uri::from(false); - let alias_id_i = AliasID::from(false); - let share_id_i = ShareID::from(false); - let file_id_i = FileID::from(false); + // share + test_check(&share_id_i, is_share_id_i); - // param checks - let is_uri_i = |p: &Parameter| matches!(p, Parameter::Uri(_)); - let is_alias_id_i = |p: &Parameter| matches!(p, Parameter::AliasID(_)); - let is_share_id_i = |p: &Parameter| matches!(p, Parameter::ShareID(_)); - let is_file_id_i = |p: &Parameter| matches!(p, Parameter::FileID(_)); - - // uri + alias - test_check((&uri_i, &alias_id_i), is_uri_i); - test_check((&uri_i, &alias_id), is_uri_i); - test_check((&uri, &alias_id_i), is_alias_id_i); - - // share - test_check(&share_id_i, is_share_id_i); - - // share + file - test_check((&share_id_i, &file_id_i), is_share_id_i); - test_check((&share_id_i, &file_id), is_share_id_i); - test_check((&share_id, &file_id_i), is_file_id_i); - } + // share + file + test_check((&share_id_i, &file_id_i), is_share_id_i); + test_check((&share_id_i, &file_id), is_share_id_i); + test_check((&share_id, &file_id_i), is_file_id_i); }