watchexec-cli 2.5.1

Executes commands in response to file modifications
Documentation
use crate::args::Args;

use super::*;
use clap::{builder::TypedValueParser, CommandFactory};
use std::{
	ffi::OsStr,
	net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6},
};

#[test]
fn parse_port_only() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("8080"))
			.unwrap(),
		SocketSpec {
			socket: SocketType::Tcp,
			addr: SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080)),
		}
	);
}

#[test]
fn parse_addr_port_v4() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("1.2.3.4:38192"))
			.unwrap(),
		SocketSpec {
			socket: SocketType::Tcp,
			addr: SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(1, 2, 3, 4), 38192)),
		}
	);
}

#[test]
fn parse_addr_port_v6() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("[ff64::1234]:81"))
			.unwrap(),
		SocketSpec {
			socket: SocketType::Tcp,
			addr: SocketAddr::V6(SocketAddrV6::new(
				Ipv6Addr::new(0xff64, 0, 0, 0, 0, 0, 0, 0x1234),
				81,
				0,
				0
			)),
		}
	);
}

#[test]
fn parse_port_only_explicit_tcp() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("tcp::443"))
			.unwrap(),
		SocketSpec {
			socket: SocketType::Tcp,
			addr: SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 443)),
		}
	);
}

#[test]
fn parse_addr_port_v4_explicit_tcp() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("tcp::1.2.3.4:38192"))
			.unwrap(),
		SocketSpec {
			socket: SocketType::Tcp,
			addr: SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(1, 2, 3, 4), 38192)),
		}
	);
}

#[test]
fn parse_addr_port_v6_explicit_tcp() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("tcp::[ff64::1234]:81"))
			.unwrap(),
		SocketSpec {
			socket: SocketType::Tcp,
			addr: SocketAddr::V6(SocketAddrV6::new(
				Ipv6Addr::new(0xff64, 0, 0, 0, 0, 0, 0, 0x1234),
				81,
				0,
				0
			)),
		}
	);
}

#[test]
fn parse_port_only_explicit_udp() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("udp::443"))
			.unwrap(),
		SocketSpec {
			socket: SocketType::Udp,
			addr: SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 443)),
		}
	);
}

#[test]
fn parse_addr_port_v4_explicit_udp() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("udp::1.2.3.4:38192"))
			.unwrap(),
		SocketSpec {
			socket: SocketType::Udp,
			addr: SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(1, 2, 3, 4), 38192)),
		}
	);
}

#[test]
fn parse_addr_port_v6_explicit_udp() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("udp::[ff64::1234]:81"))
			.unwrap(),
		SocketSpec {
			socket: SocketType::Udp,
			addr: SocketAddr::V6(SocketAddrV6::new(
				Ipv6Addr::new(0xff64, 0, 0, 0, 0, 0, 0, 0x1234),
				81,
				0,
				0
			)),
		}
	);
}

#[test]
fn parse_bad_prefix() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("gopher::777"))
			.unwrap_err()
			.to_string(),
		String::from(r#"error: invalid prefix "gopher""#),
	);
}

#[test]
fn parse_bad_port_zero() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("0"))
			.unwrap_err()
			.to_string(),
		String::from("error: invalid port number: cannot be zero"),
	);
}

#[test]
fn parse_bad_port_high() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("100000"))
			.unwrap_err()
			.to_string(),
		String::from("error: invalid port number: greater than 65535"),
	);
}

#[test]
fn parse_bad_port_alpha() {
	let cmd = Args::command();
	assert_eq!(
		SocketSpecValueParser
			.parse_ref(&cmd, None, OsStr::new("port"))
			.unwrap_err()
			.to_string(),
		String::from("error: invalid port number"),
	);
}