From 9b755b124496f806d5b88008c0f76357f05001a1 Mon Sep 17 00:00:00 2001 From: Nikita Vasilev Date: Mon, 24 Nov 2025 18:25:12 +0400 Subject: [PATCH 1/3] feat: add nil validation rule --- .../Classes/Rules/NilValidationRule.swift | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Sources/ValidatorCore/Classes/Rules/NilValidationRule.swift 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 + } +} From 9a2c2b4af0cc75ab2f7070cd7983780e38503dfa Mon Sep 17 00:00:00 2001 From: Nikita Vasilev Date: Mon, 24 Nov 2025 18:25:26 +0400 Subject: [PATCH 2/3] test: add unit tests for the nil validation rule --- .../Rules/NilValidationRuleTests.swift | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 Tests/ValidatorCoreTests/UnitTests/Rules/NilValidationRuleTests.swift 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" +} From c4ca40ff8f4eea52e3d36a308fb4073b59db36b6 Mon Sep 17 00:00:00 2001 From: Nikita Vasilev Date: Mon, 24 Nov 2025 18:26:15 +0400 Subject: [PATCH 3/3] docs: update `README.md` --- README.md | 1 + 1 file changed, 1 insertion(+) 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