diff --git a/README.md b/README.md index 53c480b..9a73386 100644 --- a/README.md +++ b/README.md @@ -304,6 +304,7 @@ struct RegistrationView: View { | `CreditCardValidationRule` | Validates credit card numbers (Luhn algorithm) | `CreditCardValidationRule(error: "Invalid card number")` | | `EmailValidationRule` | Validates email format | `EmailValidationRule(error: "Please enter a valid email")` | | `CharactersValidationRule` | Validates that a string contains only characters from the allowed CharacterSet | `CharactersValidationRule(characterSet: .letters, error: "Invalid characters")` | +| `NilValidationRule` | Validates that value is nil | `NilValidationRule(error: "Value must be nil")` ## Custom Validators diff --git a/Sources/ValidatorCore/Classes/Rules/NilValidationRule.swift b/Sources/ValidatorCore/Classes/Rules/NilValidationRule.swift new file mode 100644 index 0000000..1aab8b6 --- /dev/null +++ b/Sources/ValidatorCore/Classes/Rules/NilValidationRule.swift @@ -0,0 +1,30 @@ +// +// Validator +// Copyright © 2023 Space Code. All rights reserved. +// + +import Foundation + +/// A nil validation rule. +public struct NilValidationRule: IValidationRule { + // MARK: Types + + public typealias Input = T? + + // MARK: Properties + + /// The validation error. + public let error: IValidationError + + // MARK: Initialization + + public init(error: IValidationError) { + self.error = error + } + + // MARK: IValidationRule + + public func validate(input: T?) -> Bool { + input == nil + } +} diff --git a/Tests/ValidatorCoreTests/UnitTests/Rules/NilValidationRuleTests.swift b/Tests/ValidatorCoreTests/UnitTests/Rules/NilValidationRuleTests.swift new file mode 100644 index 0000000..d79c8ec --- /dev/null +++ b/Tests/ValidatorCoreTests/UnitTests/Rules/NilValidationRuleTests.swift @@ -0,0 +1,60 @@ +// +// Validator +// Copyright © 2025 Space Code. All rights reserved. +// + +@testable import ValidatorCore +import XCTest + +// MARK: - NilValidationRuleTests + +final class NilValidationRuleTests: XCTestCase { + // MARK: - Properties + + private var sut: NilValidationRule! + + // MARK: - Setup + + override func setUp() { + super.setUp() + sut = NilValidationRule(error: String.error) + } + + override func tearDown() { + sut = nil + super.tearDown() + } + + // MARK: - Validation Tests + + func testValidateWithNilInput_ReturnsTrue() { + // Given + let input: String? = nil + + // When + let result = sut.validate(input: input) + + // Then + XCTAssertTrue(result) + } + + func testValidateWithNonNilInput_ReturnsFalse() { + // Given + let input: String? = "Hello" + + // When + let result = sut.validate(input: input) + + // Then + XCTAssertFalse(result) + } + + func testErrorProperty_ReturnsProvidedError() { + // Then + XCTAssertEqual(sut.error as? String, String.error) + } +} + +private extension String { + static let error = "Value must be nil" +}