mod name_partial { mod valid { use bstr::ByteSlice; macro_rules! mktest { ($name:ident, $input:expr) => { #[test] fn $name() { assert!(git_validate::reference::name_partial($input.as_bstr()).is_ok()) } }; } mktest!(refs_path, b"refs/heads/main"); mktest!(refs_path_with_file_extension, b"refs/heads/main.ext"); mktest!(refs_path_underscores_and_dashes, b"refs/heads/main-2nd_ext"); mktest!(relative_path, b"etc/foo"); mktest!(all_uppercase, b"MAIN"); mktest!(all_uppercase_with_underscore, b"NEW_HEAD"); mktest!(partial_name_lowercase, b"main"); mktest!(chinese_utf8, "heads/你好吗".as_bytes()); mktest!(parantheses_special_case_upload_pack, b"(null)"); } mod invalid { use bstr::ByteSlice; use git_validate::{reference::name::Error as RefError, tag::name::Error as TagError}; macro_rules! mktest { ($name:ident, $input:literal, $expected:pat) => { #[test] fn $name() { match git_validate::reference::name_partial($input.as_bstr()) { Err($expected) => {} got => panic!("Wanted {}, got {:?}", stringify!($expected), got), } } }; } mktest!( refs_path_double_dot, b"refs/../somewhere", RefError::Tag(TagError::DoubleDot) ); mktest!( refs_path_name_starts_with_dot, b".refs/somewhere", RefError::Tag(TagError::StartsWithDot) ); mktest!( refs_path_component_is_singular_dot, b"refs/./still-inside-but-not-cool", RefError::SingleDot ); mktest!(any_path_starts_with_slash, b"/etc/foo", RefError::StartsWithSlash); mktest!(empty_path, b"", RefError::Tag(TagError::Empty)); mktest!(refs_starts_with_slash, b"/refs/heads/main", RefError::StartsWithSlash); mktest!( ends_with_slash, b"refs/heads/main/", RefError::Tag(TagError::EndsWithSlash) ); mktest!( path_with_duplicate_slashes, b"refs//heads/main", RefError::RepeatedSlash ); mktest!( path_with_spaces, b"refs//heads/name with spaces", RefError::Tag(TagError::InvalidByte(_)) ); mktest!( path_with_backslashes, b"refs\\heads/name with spaces", RefError::Tag(TagError::InvalidByte(_)) ); } } mod name { mod valid { use bstr::ByteSlice; macro_rules! mktest { ($name:ident, $input:expr) => { #[test] fn $name() { assert!(git_validate::refname($input.as_bstr()).is_ok()) } }; } mktest!(refs_path, b"refs/heads/main"); mktest!(refs_path_with_file_extension, b"refs/heads/main.ext"); mktest!(refs_path_underscores_and_dashes, b"refs/heads/main-2nd_ext"); mktest!(relative_path, b"etc/foo"); mktest!(all_uppercase, b"MAIN"); mktest!(all_uppercase_with_underscore, b"NEW_HEAD"); mktest!(chinese_utf8, "refs/heads/你好吗".as_bytes()); } mod invalid { use bstr::ByteSlice; use git_validate::{reference::name::Error as RefError, tag::name::Error as TagError}; macro_rules! mktest { ($name:ident, $input:literal, $expected:pat) => { #[test] fn $name() { match git_validate::reference::name($input.as_bstr()) { Err($expected) => {} got => panic!("Wanted {}, got {:?}", stringify!($expected), got), } } }; } mktest!( refs_path_double_dot, b"refs/../somewhere", RefError::Tag(TagError::DoubleDot) ); mktest!(refs_name_special_case_upload_pack, b"(null)", RefError::SomeLowercase); mktest!( refs_path_name_starts_with_dot, b".refs/somewhere", RefError::Tag(TagError::StartsWithDot) ); mktest!( refs_path_component_is_singular_dot, b"refs/./still-inside-but-not-cool", RefError::SingleDot ); mktest!(capitalized_name_without_path, b"Main", RefError::SomeLowercase); mktest!(lowercase_name_without_path, b"main", RefError::SomeLowercase); mktest!(any_path_starts_with_slash, b"/etc/foo", RefError::StartsWithSlash); mktest!(empty_path, b"", RefError::Tag(TagError::Empty)); mktest!(refs_starts_with_slash, b"/refs/heads/main", RefError::StartsWithSlash); mktest!( ends_with_slash, b"refs/heads/main/", RefError::Tag(TagError::EndsWithSlash) ); mktest!( a_path_with_duplicate_slashes, b"refs//heads/main", RefError::RepeatedSlash ); } }