/// <summary>
        /// Validates the specified <paramref name="username"/>, returning
        /// any charcters that are not valid according to the rules set out
        /// in the specified <paramref name="options"/>.
        /// </summary>
        /// <param name="username">The username to validate.</param>
        /// <param name="options">The configuraton options to use during validation.</param>
        /// <returns>Enumerable collection of invalid characters.</returns>
        public static IEnumerable <char> GetInvalidCharacters(string username, UsernameOptions options)
        {
            if (username == null)
            {
                throw new ArgumentNullException(nameof(username));
            }
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            if (options.AllowAnyCharacter)
            {
                return(Array.Empty <char>());
            }

            var badCharacters = username.Distinct();

            if (options.AllowAnyDigit)
            {
                badCharacters = badCharacters.Where(c => !Char.IsDigit(c));
            }

            if (options.AllowAnyLetter)
            {
                badCharacters = badCharacters.Where(c => !Char.IsLetter(c));
            }

            if (!string.IsNullOrEmpty(options.AdditionalAllowedCharacters))
            {
                badCharacters = badCharacters.Where(c => !options.AdditionalAllowedCharacters.Contains(c));
            }

            return(badCharacters);
        }
        public void UsingDefaultRules_IrregularEmailsNotAllowed(string email)
        {
            var options = new UsernameOptions()
            {
                AllowAnyCharacter = false
            };
            var result = UsernameCharacterValidator.GetInvalidCharacters(email, options);

            result.Should().HaveCountGreaterOrEqualTo(1);
        }
        public void UsingDefaultRules_AcceptsValidUsernames(string email)
        {
            var options = new UsernameOptions()
            {
                AllowAnyCharacter = false
            };
            var result = UsernameCharacterValidator.GetInvalidCharacters(email, options);

            result.Should().BeEmpty();
        }
        public void AllowAny_AcceptsAnything(string email)
        {
            var options = new UsernameOptions()
            {
                AllowAnyCharacter = true
            };
            var result = UsernameCharacterValidator.GetInvalidCharacters(email, options);

            result.Should().BeEmpty();
        }
        public void WhenAllowsSpecificChars_ReturnInvalid(string email, string expected)
        {
            var options = new UsernameOptions()
            {
                AdditionalAllowedCharacters = "dog",
                AllowAnyCharacter           = false,
                AllowAnyLetter = false,
                AllowAnyDigit  = false
            };

            var result = UsernameCharacterValidator.GetInvalidCharacters(email, options);

            result.Should().BeEquivalentTo(expected);
        }
        public void WhenAllowsOnlyDigit_ReturnsNonDigits(string email, string expected)
        {
            var options = new UsernameOptions()
            {
                AdditionalAllowedCharacters = null,
                AllowAnyCharacter           = false,
                AllowAnyLetter = false,
                AllowAnyDigit  = true
            };

            var result = UsernameCharacterValidator.GetInvalidCharacters(email, options);

            result.Should().BeEquivalentTo(expected);
        }