use uxar::validation::{
non_empty, min_len, max_len, exact_len, min_chars, max_chars,
email, url, alphanumeric, slug, digits,
uuid, ipv4, min, max, range, non_empty_vec, min_items, max_items, present,
};
#[test]
fn test_non_empty() {
assert!(non_empty("hello").is_ok());
assert!(non_empty(" spaces ").is_ok());
assert!(non_empty("").is_err());
assert!(non_empty(" ").is_err());
}
#[test]
fn test_min_len() {
let validator = min_len(5);
assert!(validator("hello world").is_ok());
assert!(validator("hello").is_ok());
assert!(validator("hi").is_err());
assert!(validator("").is_err());
}
#[test]
fn test_max_len() {
let validator = max_len(5);
assert!(validator("hello").is_ok());
assert!(validator("hi").is_ok());
assert!(validator("").is_ok());
assert!(validator("hello world").is_err());
}
#[test]
fn test_exact_len() {
let validator = exact_len(5);
assert!(validator("hello").is_ok());
assert!(validator("hi").is_err());
assert!(validator("hello world").is_err());
assert!(validator("").is_err());
}
#[test]
fn test_min_chars() {
let validator = min_chars(3);
assert!(validator("hello").is_ok());
assert!(validator("abc").is_ok());
assert!(validator("hi").is_err());
assert!(validator("").is_err());
assert!(validator("café").is_ok()); assert!(validator("ab").is_err());
}
#[test]
fn test_max_chars() {
let validator = max_chars(5);
assert!(validator("hello").is_ok());
assert!(validator("hi").is_ok());
assert!(validator("").is_ok());
assert!(validator("hello world").is_err());
assert!(validator("café").is_ok()); }
#[test]
fn test_email() {
assert!(email("user@example.com").is_ok());
assert!(email("test.email@domain.co.uk").is_ok());
assert!(email("user+tag@example.com").is_ok());
assert!(email("not-an-email").is_err());
assert!(email("@example.com").is_err());
assert!(email("user@").is_err());
assert!(email("user@.com").is_err());
assert!(email("").is_err());
assert!(email("user@example").is_err()); }
#[test]
fn test_url() {
assert!(url("https://example.com").is_ok());
assert!(url("http://example.com/path").is_ok());
assert!(url("https://example.com:8080/path?query=1").is_ok());
assert!(url("not-a-url").is_err());
assert!(url("ftp://example.com").is_err());
assert!(url("example.com").is_err());
assert!(url("://example.com").is_err());
assert!(url("").is_err());
}
#[test]
fn test_alphanumeric() {
assert!(alphanumeric("abc123").is_ok());
assert!(alphanumeric("ABC").is_ok());
assert!(alphanumeric("123").is_ok());
assert!(alphanumeric("a").is_ok());
assert!(alphanumeric("").is_ok());
assert!(alphanumeric("abc-123").is_err());
assert!(alphanumeric("hello_world").is_err());
assert!(alphanumeric("test@example").is_err());
assert!(alphanumeric("hello world").is_err());
}
#[test]
fn test_slug() {
assert!(slug("hello-world").is_ok());
assert!(slug("my_slug").is_ok());
assert!(slug("slug123").is_ok());
assert!(slug("a").is_ok());
assert!(slug("").is_ok());
assert!(slug("hello@world").is_err());
assert!(slug("hello world").is_err());
assert!(slug("hello.world").is_err());
}
#[test]
fn test_digits() {
assert!(digits("123456").is_ok());
assert!(digits("0").is_ok());
assert!(digits("999").is_ok());
assert!(digits("").is_ok());
assert!(digits("123abc").is_err());
assert!(digits("12.34").is_err());
assert!(digits("one two three").is_err());
assert!(digits("123-456").is_err());
}
#[test]
fn test_uuid() {
assert!(uuid("550e8400-e29b-41d4-a716-446655440000").is_ok());
assert!(uuid("6ba7b810-9dad-11d1-80b4-00c04fd430c8").is_ok());
assert!(uuid("ABCDEF01-2345-6789-ABCD-EF0123456789").is_ok());
assert!(uuid("550e8400e29b41d4a716446655440000").is_err()); assert!(uuid("550e8400-e29b-41d4-a716-44665544000").is_err()); assert!(uuid("550e8400-e29b-41d4-a716-4466554400000").is_err()); assert!(uuid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx").is_err());
assert!(uuid("").is_err());
}
#[test]
fn test_ipv4() {
assert!(ipv4("192.168.1.1").is_ok());
assert!(ipv4("0.0.0.0").is_ok());
assert!(ipv4("255.255.255.255").is_ok());
assert!(ipv4("127.0.0.1").is_ok());
assert!(ipv4("256.1.1.1").is_err()); assert!(ipv4("192.168.1").is_err()); assert!(ipv4("192.168.1.1.1").is_err()); assert!(ipv4("192.168.a.1").is_err()); assert!(ipv4("192.168..1").is_err());
assert!(ipv4("").is_err());
}
#[test]
fn test_min_numeric() {
let validator = min(10);
assert!(validator(&15).is_ok());
assert!(validator(&10).is_ok());
assert!(validator(&9).is_err());
assert!(validator(&-100).is_err());
}
#[test]
fn test_max_numeric() {
let validator = max(100);
assert!(validator(&50).is_ok());
assert!(validator(&100).is_ok());
assert!(validator(&101).is_err());
assert!(validator(&200).is_err());
}
#[test]
fn test_range_numeric() {
let validator = range(10, 100);
assert!(validator(&50).is_ok());
assert!(validator(&10).is_ok());
assert!(validator(&100).is_ok());
assert!(validator(&9).is_err());
assert!(validator(&101).is_err());
assert!(validator(&-50).is_err());
}
#[test]
fn test_min_items() {
let validator = min_items::<i32>(2);
assert!(validator(&vec![1, 2, 3]).is_ok());
assert!(validator(&vec![1, 2]).is_ok());
assert!(validator(&vec![1]).is_err());
assert!(validator(&vec![]).is_err());
}
#[test]
fn test_max_items() {
let validator = max_items::<i32>(2);
assert!(validator(&vec![1, 2]).is_ok());
assert!(validator(&vec![1]).is_ok());
assert!(validator(&vec![]).is_ok());
assert!(validator(&vec![1, 2, 3]).is_err());
}
#[test]
fn test_non_empty_vec() {
assert!(non_empty_vec(&vec![1, 2, 3]).is_ok());
assert!(non_empty_vec(&vec![1]).is_ok());
assert!(non_empty_vec::<i32>(&vec![]).is_err());
}
#[test]
fn test_present_option() {
assert!(present(&Some(42)).is_ok());
assert!(present(&Some("hello")).is_ok());
assert!(present::<i32>(&None).is_err());
}
#[test]
fn test_error_messages() {
let err = non_empty("").unwrap_err();
assert_eq!(err.code, "blank");
assert_eq!(err.message, "This field may not be blank.");
let err = email("invalid").unwrap_err();
assert_eq!(err.code, "email");
assert_eq!(err.message, "Enter a valid email address.");
let err = (min(10))(&5).unwrap_err();
assert_eq!(err.code, "min_value");
assert!(err.message.contains("10"));
}
#[test]
fn test_validator_composition() {
let non_empty_validator = non_empty;
let min_validator = min_len(5);
let max_validator = max_len(20);
let test_str = "hello world";
assert!(non_empty_validator(test_str).is_ok());
assert!(min_validator(test_str).is_ok());
assert!(max_validator(test_str).is_ok());
let test_str = "hi";
assert!(non_empty_validator(test_str).is_ok());
assert!(min_validator(test_str).is_err());
assert!(max_validator(test_str).is_ok());
}
#[test]
fn test_numeric_range_types() {
let range_i32 = range(0i32, 100i32);
assert!(range_i32(&50).is_ok());
assert!(range_i32(&0).is_ok());
assert!(range_i32(&100).is_ok());
assert!(range_i32(&101).is_err());
assert!(range_i32(&-1).is_err());
let range_f64 = range(0.0f64, 1.0f64);
assert!(range_f64(&0.5).is_ok());
assert!(range_f64(&0.0).is_ok());
assert!(range_f64(&1.0).is_ok());
assert!(range_f64(&1.1).is_err());
assert!(range_f64(&-0.1).is_err());
}
#[test]
fn test_unicode_validators() {
assert!(email("用户@example.com").is_err());
assert!(url("https://example.com/café").is_ok());
let validator = min_chars(2);
assert!(validator("👍🏻").is_ok());
let validator = max_chars(5);
assert!(validator("café").is_ok()); assert!(validator("hello").is_ok()); }