public void TestArgumentExceptions ()
{
using (var client = new SmtpClient ()) {
var credentials = new NetworkCredential ("username", "password");
var socket = new Socket (SocketType.Stream, ProtocolType.Tcp);
var message = CreateSimpleMessage ();
var sender = message.From.Mailboxes.FirstOrDefault ();
var recipients = message.To.Mailboxes.ToList ();
var options = FormatOptions.Default;
var empty = new MailboxAddress[0];
// Connect
Assert.Throws<ArgumentNullException> (() => client.Connect ((Uri) null));
Assert.Throws<ArgumentNullException> (async () => await client.ConnectAsync ((Uri) null));
Assert.Throws<ArgumentNullException> (() => client.Connect (null, 25, false));
Assert.Throws<ArgumentNullException> (async () => await client.ConnectAsync (null, 25, false));
Assert.Throws<ArgumentException> (() => client.Connect (string.Empty, 25, false));
Assert.Throws<ArgumentException> (async () => await client.ConnectAsync (string.Empty, 25, false));
Assert.Throws<ArgumentOutOfRangeException> (() => client.Connect ("host", -1, false));
Assert.Throws<ArgumentOutOfRangeException> (async () => await client.ConnectAsync ("host", -1, false));
Assert.Throws<ArgumentNullException> (() => client.Connect (null, 25, SecureSocketOptions.None));
Assert.Throws<ArgumentNullException> (async () => await client.ConnectAsync (null, 25, SecureSocketOptions.None));
Assert.Throws<ArgumentException> (() => client.Connect (string.Empty, 25, SecureSocketOptions.None));
Assert.Throws<ArgumentException> (async () => await client.ConnectAsync (string.Empty, 25, SecureSocketOptions.None));
Assert.Throws<ArgumentOutOfRangeException> (() => client.Connect ("host", -1, SecureSocketOptions.None));
Assert.Throws<ArgumentOutOfRangeException> (async () => await client.ConnectAsync ("host", -1, SecureSocketOptions.None));
Assert.Throws<ArgumentNullException> (() => client.Connect (null, "host", 25, SecureSocketOptions.None));
Assert.Throws<ArgumentException> (() => client.Connect (socket, "host", 25, SecureSocketOptions.None));
// Authenticate
Assert.Throws<ArgumentNullException> (() => client.Authenticate (null));
Assert.Throws<ArgumentNullException> (async () => await client.AuthenticateAsync (null));
Assert.Throws<ArgumentNullException> (() => client.Authenticate (null, "password"));
Assert.Throws<ArgumentNullException> (async () => await client.AuthenticateAsync (null, "password"));
Assert.Throws<ArgumentNullException> (() => client.Authenticate ("username", null));
Assert.Throws<ArgumentNullException> (async () => await client.AuthenticateAsync ("username", null));
Assert.Throws<ArgumentNullException> (() => client.Authenticate (null, credentials));
Assert.Throws<ArgumentNullException> (async () => await client.AuthenticateAsync (null, credentials));
Assert.Throws<ArgumentNullException> (() => client.Authenticate (Encoding.UTF8, null));
Assert.Throws<ArgumentNullException> (async () => await client.AuthenticateAsync (Encoding.UTF8, null));
Assert.Throws<ArgumentNullException> (() => client.Authenticate (null, "username", "password"));
Assert.Throws<ArgumentNullException> (async () => await client.AuthenticateAsync (null, "username", "password"));
Assert.Throws<ArgumentNullException> (() => client.Authenticate (Encoding.UTF8, null, "password"));
Assert.Throws<ArgumentNullException> (async () => await client.AuthenticateAsync (Encoding.UTF8, null, "password"));
Assert.Throws<ArgumentNullException> (() => client.Authenticate (Encoding.UTF8, "username", null));
Assert.Throws<ArgumentNullException> (async () => await client.AuthenticateAsync (Encoding.UTF8, "username", null));
// Send
Assert.Throws<ArgumentNullException> (() => client.Send (null));
Assert.Throws<ArgumentNullException> (() => client.Send (null, message));
Assert.Throws<ArgumentNullException> (() => client.Send (options, null));
Assert.Throws<ArgumentNullException> (() => client.Send (message, null, recipients));
Assert.Throws<ArgumentNullException> (() => client.Send (message, sender, null));
Assert.Throws<InvalidOperationException> (() => client.Send (message, sender, empty));
Assert.Throws<ArgumentNullException> (() => client.Send (null, message, sender, recipients));
Assert.Throws<ArgumentNullException> (() => client.Send (options, message, null, recipients));
Assert.Throws<ArgumentNullException> (() => client.Send (options, message, sender, null));
Assert.Throws<InvalidOperationException> (() => client.Send (options, message, sender, empty));
Assert.Throws<ArgumentNullException> (async () => await client.SendAsync (null));
Assert.Throws<ArgumentNullException> (async () => await client.SendAsync (null, message));
Assert.Throws<ArgumentNullException> (async () => await client.SendAsync (options, null));
Assert.Throws<ArgumentNullException> (async () => await client.SendAsync (message, null, recipients));
Assert.Throws<ArgumentNullException> (async () => await client.SendAsync (message, sender, null));
Assert.Throws<InvalidOperationException> (async () => await client.SendAsync (message, sender, empty));
Assert.Throws<ArgumentNullException> (async () => await client.SendAsync (null, message, sender, recipients));
Assert.Throws<ArgumentNullException> (async () => await client.SendAsync (options, message, null, recipients));
Assert.Throws<ArgumentNullException> (async () => await client.SendAsync (options, message, sender, null));
Assert.Throws<InvalidOperationException> (async () => await client.SendAsync (options, message, sender, empty));
// Expand
Assert.Throws<ArgumentNullException> (() => client.Expand (null));
Assert.Throws<ArgumentException> (() => client.Expand (string.Empty));
Assert.Throws<ArgumentException> (() => client.Expand ("line1\r\nline2"));
Assert.Throws<ArgumentNullException> (async () => await client.ExpandAsync (null));
Assert.Throws<ArgumentException> (async () => await client.ExpandAsync (string.Empty));
Assert.Throws<ArgumentException> (async () => await client.ExpandAsync ("line1\r\nline2"));
// Verify
Assert.Throws<ArgumentNullException> (() => client.Verify (null));
Assert.Throws<ArgumentException> (() => client.Verify (string.Empty));
Assert.Throws<ArgumentException> (() => client.Verify ("line1\r\nline2"));
Assert.Throws<ArgumentNullException> (async () => await client.VerifyAsync (null));
Assert.Throws<ArgumentException> (async () => await client.VerifyAsync (string.Empty));
Assert.Throws<ArgumentException> (async () => await client.VerifyAsync ("line1\r\nline2"));
}
}