public void IsValid_Should_Return_False_When_Value_Is_Null_And_CanBeNull_Is_False()
        {
            // Arrange
            var attr = new StringValidateAttribute("Test message") { CanBeNull = false };

            // Act
            bool result = attr.IsValid(null);

            // Assert
            Assert.IsFalse(result);
        }
        public void IsValid_Should_Return_False_When_Value_Is_Not_Match_Regex()
        {
            // Arrange
            var attr = new StringValidateAttribute("Test message") { RegEx = @"^[0-1]$" };

            // Act
            bool result = attr.IsValid("2");

            // Assert
            Assert.IsFalse(result);
        }
        public void IsValid_Should_Return_False_When_Value_Is_Less_Than_MinLength()
        {
            // Arrange
            var attr = new StringValidateAttribute("Test message") { MinLength = 3 };

            // Act
            bool result = attr.IsValid("12");

            // Assert
            Assert.IsFalse(result);
        }
        public void Constructor_Should_Set_Default_Values()
        {
            // Act
            var attr = new StringValidateAttribute("Test message");

            // Assert
            Assert.AreEqual(-1, attr.MinLength);
            Assert.AreEqual(-1, attr.MaxLength);
            Assert.IsTrue(attr.CanBeEmpty);
            Assert.IsTrue(attr.CanBeNull);
            Assert.IsNull(attr.RegEx);
        }
        public void IsValid_Should_Return_True_When_Parameters_Not_Specified()
        {
            var values =
                new[]
                {
                    "",
                    null,
                    "1234567890",
                    "abcdefghjk",
                    "~!@#$%^&*()_+"
                };

            foreach (var value in values)
            {
                // Arrange
                var attr = new StringValidateAttribute("Test message");

                // Act
                bool result = attr.IsValid(value);

                // Assert
                Assert.IsTrue(result);
            }
        }
        public void IsValid_Should_Throw_Exception_When_Value_Is_Not_String()
        {
            // Arrange
            var attr = new StringValidateAttribute("Test message");

            // Act
            // Assert
            attr.IsValid(5);
        }
        public void IsValid_Should_Return_True_When_Value_Meet_All_Requirements()
        {
            // Arrange
            var attr = new StringValidateAttribute("Test message")
                           {
                               MinLength = 1,
                               MaxLength = 3,
                               CanBeNull = false,
                               CanBeEmpty = false,
                               RegEx = @"^[0]$"
                           };

            // Act
            bool result = attr.IsValid("0");

            // Assert
            Assert.IsTrue(result);
        }