diff --git a/README.md b/README.md index f31facd..ce8eaec 100644 --- a/README.md +++ b/README.md @@ -309,6 +309,7 @@ struct RegistrationView: View { | `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")` +| `PositiveNumberValidationRule` | Validates that value is positive | `PositiveNumberValidationRule(error: "Value must be positive")` ## Custom Validators diff --git a/Sources/ValidatorCore/Classes/Rules/PositiveNumberValidationRule.swift b/Sources/ValidatorCore/Classes/Rules/PositiveNumberValidationRule.swift new file mode 100644 index 0000000..8fe3437 --- /dev/null +++ b/Sources/ValidatorCore/Classes/Rules/PositiveNumberValidationRule.swift @@ -0,0 +1,35 @@ +// +// Validator +// Copyright © 2025 Space Code. All rights reserved. +// + +/// Validates that a number is positive. +/// +/// # Example: +/// ```swift +/// let rule = PositiveNumberValidationRule(error: "Value must be positive") +/// rule.validate(input: -1) // false +/// rule.validate(input: 10) // true +/// ``` +public struct PositiveNumberValidationRule: IValidationRule { + // MARK: Types + + public typealias Input = Double + + // MARK: Properties + + /// The validation error. + public let error: IValidationError + + // MARK: Initialization + + public init(error: IValidationError) { + self.error = error + } + + // MARK: IValidationRule + + public func validate(input: Double) -> Bool { + input > 0 + } +} diff --git a/Sources/ValidatorCore/Validator.docc/Overview.md b/Sources/ValidatorCore/Validator.docc/Overview.md index 5b933d3..48b8e11 100644 --- a/Sources/ValidatorCore/Validator.docc/Overview.md +++ b/Sources/ValidatorCore/Validator.docc/Overview.md @@ -31,6 +31,8 @@ ValidatorCore contains all core validation rules, utilities, and mechanisms for - ``RegexValidationRule`` - ``SuffixValidationRule`` - ``URLValidationRule`` +- ``NilValidationRule`` +- ``PositiveNumberValidationRule`` ### Articles diff --git a/Tests/ValidatorCoreTests/UnitTests/Rules/PositiveNumberValidationRuleTests.swift b/Tests/ValidatorCoreTests/UnitTests/Rules/PositiveNumberValidationRuleTests.swift new file mode 100644 index 0000000..865836f --- /dev/null +++ b/Tests/ValidatorCoreTests/UnitTests/Rules/PositiveNumberValidationRuleTests.swift @@ -0,0 +1,56 @@ +// +// Validator +// Copyright © 2025 Space Code. All rights reserved. +// + +import ValidatorCore +import XCTest + +// MARK: - PositiveNumberValidationRuleTests + +final class PositiveNumberValidationRuleTests: XCTestCase { + // MARK: Properties + + private var sut: PositiveNumberValidationRule! + + // MARK: XCTestCase + + override func setUp() { + super.setUp() + sut = PositiveNumberValidationRule(error: String.error) + } + + override func tearDown() { + sut = nil + super.tearDown() + } + + // MARK: Tests + + func test_thatPositiveNumberValidationRuleSetsProperties() { + // then + XCTAssertEqual(sut.error.message, .error) + } + + func test_thatPositiveNumberValidationRuleValidatesInput_whenInputIsCorrectValue() { + // when + let result = sut.validate(input: 10) + + // then + XCTAssertTrue(result) + } + + func test_thatPositiveNumberValidationRuleValidatesInput_whenInputIsIncorrectValue() { + // when + let result = sut.validate(input: -1) + + // then + XCTAssertFalse(result) + } +} + +// MARK: - Constants + +private extension String { + static let error = "Value must be positive" +}