use super::regex;
#[test]
fn test_ipv4_basic() {
let re = regex(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$");
assert!(re.is_match("192.168.1.1"));
assert!(re.is_match("10.0.0.1"));
assert!(re.is_match("255.255.255.255"));
assert!(re.is_match("127.0.0.1"));
assert!(!re.is_match("192.168.1"));
}
#[test]
fn test_ipv4_extraction_from_text() {
let re = regex(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}");
let text = "Server 192.168.1.1 connects to 10.0.0.5 for database access.";
let ips: Vec<_> = re.find_iter(text).map(|m| m.as_str()).collect();
assert_eq!(ips.len(), 2);
assert_eq!(ips[0], "192.168.1.1");
assert_eq!(ips[1], "10.0.0.5");
}
#[test]
fn test_ipv4_private_ranges() {
let re = regex(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}");
assert!(re.is_match("10.0.0.1"));
assert!(re.is_match("172.16.0.1"));
assert!(re.is_match("192.168.0.1"));
}
#[test]
fn test_ipv4_localhost() {
let re = regex(r"^127\.0\.0\.\d{1,3}$");
assert!(re.is_match("127.0.0.1"));
assert!(re.is_match("127.0.0.255"));
assert!(!re.is_match("127.0.1.1"));
assert!(!re.is_match("127.1.0.1"));
}
#[test]
fn test_ipv4_with_port() {
let re = regex(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}");
assert!(re.is_match("192.168.1.1:8080"));
assert!(re.is_match("10.0.0.1:3000"));
assert!(re.is_match("127.0.0.1:80"));
}
#[test]
fn test_ipv4_capture_octets() {
let re = regex(r"^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$");
let caps = re.captures("192.168.1.1").unwrap();
assert_eq!(&caps[1], "192");
assert_eq!(&caps[2], "168");
assert_eq!(&caps[3], "1");
assert_eq!(&caps[4], "1");
}
#[test]
fn test_ipv4_in_url() {
let re = regex(r"https?://\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}");
assert!(re.is_match("http://192.168.1.1"));
assert!(re.is_match("https://10.0.0.1"));
}
#[test]
fn test_ipv6_basic() {
let re = regex(r"[0-9a-fA-F:]+");
assert!(re.is_match("2001:0db8:85a3:0000:0000:8a2e:0370:7334"));
assert!(re.is_match("2001:db8:85a3::8a2e:370:7334"));
assert!(re.is_match("::1"));
assert!(re.is_match("fe80::1"));
}
#[test]
fn test_ipv6_compressed() {
let re = regex(r"[0-9a-fA-F:]+");
assert!(re.is_match("::1"));
assert!(re.is_match("::"));
assert!(re.is_match("2001:db8::1"));
}
#[test]
fn test_cidr_notation() {
let re = regex(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/\d{1,2}");
assert!(re.is_match("192.168.1.0/24"));
assert!(re.is_match("10.0.0.0/8"));
assert!(re.is_match("172.16.0.0/12"));
}
#[test]
fn test_ip_range_extraction() {
let re = regex(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}");
let text = "Allowed IPs: 192.168.1.1, 192.168.1.2, 192.168.1.3";
let count = re.find_iter(text).count();
assert_eq!(count, 3);
}
#[test]
fn test_ipv4_word_boundary() {
let re = regex(r"\b(?:\d{1,3}\.){3}\d{1,3}\b");
assert!(re.is_match("192.168.1.1"));
assert!(re.is_match("Server at 10.0.0.1 is running"));
let text = "IP 192.168.1.1 and 10.0.0.5 are valid";
let ips: Vec<_> = re.find_iter(text).map(|m| m.as_str()).collect();
assert_eq!(ips.len(), 2);
assert_eq!(ips[0], "192.168.1.1");
assert_eq!(ips[1], "10.0.0.5");
}
#[test]
fn test_ipv4_word_boundary_no_partial() {
let re = regex(r"\b(?:\d{1,3}\.){3}\d{1,3}\b");
let log = "2024-01-15 Server 192.168.1.100 connected to gateway 10.0.0.1";
let ips: Vec<_> = re.find_iter(log).map(|m| m.as_str()).collect();
assert_eq!(ips.len(), 2);
assert!(ips.contains(&"192.168.1.100"));
assert!(ips.contains(&"10.0.0.1"));
}