From 17f62d03082fd292a9956a01dd5787f5efd51f61 Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 21:18:53 -0600 Subject: [PATCH 01/19] SPM support -Init Swift Package Manager --- Package.swift | 28 +++++++++++++++++++ Sources/SwiftValidator/SwiftValidator.swift | 3 ++ Tests/LinuxMain.swift | 7 +++++ .../SwiftValidatorTests.swift | 15 ++++++++++ .../SwiftValidatorTests/XCTestManifests.swift | 9 ++++++ 5 files changed, 62 insertions(+) create mode 100644 Package.swift create mode 100644 Sources/SwiftValidator/SwiftValidator.swift create mode 100644 Tests/LinuxMain.swift create mode 100644 Tests/SwiftValidatorTests/SwiftValidatorTests.swift create mode 100644 Tests/SwiftValidatorTests/XCTestManifests.swift diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..93080d8 --- /dev/null +++ b/Package.swift @@ -0,0 +1,28 @@ +// swift-tools-version:5.2 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "SwiftValidator", + products: [ + // Products define the executables and libraries produced by a package, and make them visible to other packages. + .library( + name: "SwiftValidator", + targets: ["SwiftValidator"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages which this package depends on. + .target( + name: "SwiftValidator", + dependencies: []), + .testTarget( + name: "SwiftValidatorTests", + dependencies: ["SwiftValidator"]), + ] +) diff --git a/Sources/SwiftValidator/SwiftValidator.swift b/Sources/SwiftValidator/SwiftValidator.swift new file mode 100644 index 0000000..18a5f89 --- /dev/null +++ b/Sources/SwiftValidator/SwiftValidator.swift @@ -0,0 +1,3 @@ +struct SwiftValidator { + var text = "Hello, World!" +} diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift new file mode 100644 index 0000000..9e383f1 --- /dev/null +++ b/Tests/LinuxMain.swift @@ -0,0 +1,7 @@ +import XCTest + +import SwiftValidatorTests + +var tests = [XCTestCaseEntry]() +tests += SwiftValidatorTests.allTests() +XCTMain(tests) diff --git a/Tests/SwiftValidatorTests/SwiftValidatorTests.swift b/Tests/SwiftValidatorTests/SwiftValidatorTests.swift new file mode 100644 index 0000000..adb47e3 --- /dev/null +++ b/Tests/SwiftValidatorTests/SwiftValidatorTests.swift @@ -0,0 +1,15 @@ +import XCTest +@testable import SwiftValidator + +final class SwiftValidatorTests: XCTestCase { + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct + // results. + XCTAssertEqual(SwiftValidator().text, "Hello, World!") + } + + static var allTests = [ + ("testExample", testExample), + ] +} diff --git a/Tests/SwiftValidatorTests/XCTestManifests.swift b/Tests/SwiftValidatorTests/XCTestManifests.swift new file mode 100644 index 0000000..03f42c2 --- /dev/null +++ b/Tests/SwiftValidatorTests/XCTestManifests.swift @@ -0,0 +1,9 @@ +import XCTest + +#if !canImport(ObjectiveC) +public func allTests() -> [XCTestCaseEntry] { + return [ + testCase(SwiftValidatorTests.allTests), + ] +} +#endif From ac75e6cffa7065702d55946cf6b3d950d426e633 Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 21:46:29 -0600 Subject: [PATCH 02/19] SPM Support -Changed folder structure --- .../SwiftValidator}/Core/Validatable.swift | 0 .../Core/ValidationDelegate.swift | 0 .../Core/ValidationError.swift | 0 .../SwiftValidator}/Core/Validator.swift | 0 .../Core/ValidatorDictionary.swift | 0 .../Rules/AlphaNumericRule.swift | 0 .../SwiftValidator}/Rules/AlphaRule.swift | 0 .../Rules/CardExpiryMonthRule.swift | 0 .../Rules/CardExpiryYearRule.swift | 0 .../Rules/CharacterSetRule.swift | 0 .../SwiftValidator}/Rules/ConfirmRule.swift | 0 .../SwiftValidator}/Rules/EmailRule.swift | 0 .../Rules/ExactLengthRule.swift | 0 .../SwiftValidator}/Rules/FloatRule.swift | 0 .../SwiftValidator}/Rules/FullNameRule.swift | 0 .../SwiftValidator}/Rules/HexColorRule.swift | 0 .../SwiftValidator}/Rules/IPV4Rule.swift | 0 .../SwiftValidator}/Rules/ISBNRule.swift | 0 .../SwiftValidator}/Rules/MaxLengthRule.swift | 0 .../SwiftValidator}/Rules/MinLengthRule.swift | 0 .../SwiftValidator}/Rules/PasswordRule.swift | 0 .../Rules/PhoneNumberRule.swift | 0 .../SwiftValidator}/Rules/RegexRule.swift | 0 .../SwiftValidator}/Rules/RequiredRule.swift | 0 .../SwiftValidator}/Rules/Rule.swift | 0 .../Rules/ValidationRule.swift | 0 .../SwiftValidator}/Rules/ZipCodeRule.swift | 0 SwiftValidator.podspec | 4 +- .../SwiftValidatorTests.swift | 491 +++++++++++++++++- Validator.xcodeproj/project.pbxproj | 132 +---- 30 files changed, 487 insertions(+), 140 deletions(-) rename {SwiftValidator => Sources/SwiftValidator}/Core/Validatable.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Core/ValidationDelegate.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Core/ValidationError.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Core/Validator.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Core/ValidatorDictionary.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/AlphaNumericRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/AlphaRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/CardExpiryMonthRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/CardExpiryYearRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/CharacterSetRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/ConfirmRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/EmailRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/ExactLengthRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/FloatRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/FullNameRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/HexColorRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/IPV4Rule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/ISBNRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/MaxLengthRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/MinLengthRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/PasswordRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/PhoneNumberRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/RegexRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/RequiredRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/Rule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/ValidationRule.swift (100%) rename {SwiftValidator => Sources/SwiftValidator}/Rules/ZipCodeRule.swift (100%) diff --git a/SwiftValidator/Core/Validatable.swift b/Sources/SwiftValidator/Core/Validatable.swift similarity index 100% rename from SwiftValidator/Core/Validatable.swift rename to Sources/SwiftValidator/Core/Validatable.swift diff --git a/SwiftValidator/Core/ValidationDelegate.swift b/Sources/SwiftValidator/Core/ValidationDelegate.swift similarity index 100% rename from SwiftValidator/Core/ValidationDelegate.swift rename to Sources/SwiftValidator/Core/ValidationDelegate.swift diff --git a/SwiftValidator/Core/ValidationError.swift b/Sources/SwiftValidator/Core/ValidationError.swift similarity index 100% rename from SwiftValidator/Core/ValidationError.swift rename to Sources/SwiftValidator/Core/ValidationError.swift diff --git a/SwiftValidator/Core/Validator.swift b/Sources/SwiftValidator/Core/Validator.swift similarity index 100% rename from SwiftValidator/Core/Validator.swift rename to Sources/SwiftValidator/Core/Validator.swift diff --git a/SwiftValidator/Core/ValidatorDictionary.swift b/Sources/SwiftValidator/Core/ValidatorDictionary.swift similarity index 100% rename from SwiftValidator/Core/ValidatorDictionary.swift rename to Sources/SwiftValidator/Core/ValidatorDictionary.swift diff --git a/SwiftValidator/Rules/AlphaNumericRule.swift b/Sources/SwiftValidator/Rules/AlphaNumericRule.swift similarity index 100% rename from SwiftValidator/Rules/AlphaNumericRule.swift rename to Sources/SwiftValidator/Rules/AlphaNumericRule.swift diff --git a/SwiftValidator/Rules/AlphaRule.swift b/Sources/SwiftValidator/Rules/AlphaRule.swift similarity index 100% rename from SwiftValidator/Rules/AlphaRule.swift rename to Sources/SwiftValidator/Rules/AlphaRule.swift diff --git a/SwiftValidator/Rules/CardExpiryMonthRule.swift b/Sources/SwiftValidator/Rules/CardExpiryMonthRule.swift similarity index 100% rename from SwiftValidator/Rules/CardExpiryMonthRule.swift rename to Sources/SwiftValidator/Rules/CardExpiryMonthRule.swift diff --git a/SwiftValidator/Rules/CardExpiryYearRule.swift b/Sources/SwiftValidator/Rules/CardExpiryYearRule.swift similarity index 100% rename from SwiftValidator/Rules/CardExpiryYearRule.swift rename to Sources/SwiftValidator/Rules/CardExpiryYearRule.swift diff --git a/SwiftValidator/Rules/CharacterSetRule.swift b/Sources/SwiftValidator/Rules/CharacterSetRule.swift similarity index 100% rename from SwiftValidator/Rules/CharacterSetRule.swift rename to Sources/SwiftValidator/Rules/CharacterSetRule.swift diff --git a/SwiftValidator/Rules/ConfirmRule.swift b/Sources/SwiftValidator/Rules/ConfirmRule.swift similarity index 100% rename from SwiftValidator/Rules/ConfirmRule.swift rename to Sources/SwiftValidator/Rules/ConfirmRule.swift diff --git a/SwiftValidator/Rules/EmailRule.swift b/Sources/SwiftValidator/Rules/EmailRule.swift similarity index 100% rename from SwiftValidator/Rules/EmailRule.swift rename to Sources/SwiftValidator/Rules/EmailRule.swift diff --git a/SwiftValidator/Rules/ExactLengthRule.swift b/Sources/SwiftValidator/Rules/ExactLengthRule.swift similarity index 100% rename from SwiftValidator/Rules/ExactLengthRule.swift rename to Sources/SwiftValidator/Rules/ExactLengthRule.swift diff --git a/SwiftValidator/Rules/FloatRule.swift b/Sources/SwiftValidator/Rules/FloatRule.swift similarity index 100% rename from SwiftValidator/Rules/FloatRule.swift rename to Sources/SwiftValidator/Rules/FloatRule.swift diff --git a/SwiftValidator/Rules/FullNameRule.swift b/Sources/SwiftValidator/Rules/FullNameRule.swift similarity index 100% rename from SwiftValidator/Rules/FullNameRule.swift rename to Sources/SwiftValidator/Rules/FullNameRule.swift diff --git a/SwiftValidator/Rules/HexColorRule.swift b/Sources/SwiftValidator/Rules/HexColorRule.swift similarity index 100% rename from SwiftValidator/Rules/HexColorRule.swift rename to Sources/SwiftValidator/Rules/HexColorRule.swift diff --git a/SwiftValidator/Rules/IPV4Rule.swift b/Sources/SwiftValidator/Rules/IPV4Rule.swift similarity index 100% rename from SwiftValidator/Rules/IPV4Rule.swift rename to Sources/SwiftValidator/Rules/IPV4Rule.swift diff --git a/SwiftValidator/Rules/ISBNRule.swift b/Sources/SwiftValidator/Rules/ISBNRule.swift similarity index 100% rename from SwiftValidator/Rules/ISBNRule.swift rename to Sources/SwiftValidator/Rules/ISBNRule.swift diff --git a/SwiftValidator/Rules/MaxLengthRule.swift b/Sources/SwiftValidator/Rules/MaxLengthRule.swift similarity index 100% rename from SwiftValidator/Rules/MaxLengthRule.swift rename to Sources/SwiftValidator/Rules/MaxLengthRule.swift diff --git a/SwiftValidator/Rules/MinLengthRule.swift b/Sources/SwiftValidator/Rules/MinLengthRule.swift similarity index 100% rename from SwiftValidator/Rules/MinLengthRule.swift rename to Sources/SwiftValidator/Rules/MinLengthRule.swift diff --git a/SwiftValidator/Rules/PasswordRule.swift b/Sources/SwiftValidator/Rules/PasswordRule.swift similarity index 100% rename from SwiftValidator/Rules/PasswordRule.swift rename to Sources/SwiftValidator/Rules/PasswordRule.swift diff --git a/SwiftValidator/Rules/PhoneNumberRule.swift b/Sources/SwiftValidator/Rules/PhoneNumberRule.swift similarity index 100% rename from SwiftValidator/Rules/PhoneNumberRule.swift rename to Sources/SwiftValidator/Rules/PhoneNumberRule.swift diff --git a/SwiftValidator/Rules/RegexRule.swift b/Sources/SwiftValidator/Rules/RegexRule.swift similarity index 100% rename from SwiftValidator/Rules/RegexRule.swift rename to Sources/SwiftValidator/Rules/RegexRule.swift diff --git a/SwiftValidator/Rules/RequiredRule.swift b/Sources/SwiftValidator/Rules/RequiredRule.swift similarity index 100% rename from SwiftValidator/Rules/RequiredRule.swift rename to Sources/SwiftValidator/Rules/RequiredRule.swift diff --git a/SwiftValidator/Rules/Rule.swift b/Sources/SwiftValidator/Rules/Rule.swift similarity index 100% rename from SwiftValidator/Rules/Rule.swift rename to Sources/SwiftValidator/Rules/Rule.swift diff --git a/SwiftValidator/Rules/ValidationRule.swift b/Sources/SwiftValidator/Rules/ValidationRule.swift similarity index 100% rename from SwiftValidator/Rules/ValidationRule.swift rename to Sources/SwiftValidator/Rules/ValidationRule.swift diff --git a/SwiftValidator/Rules/ZipCodeRule.swift b/Sources/SwiftValidator/Rules/ZipCodeRule.swift similarity index 100% rename from SwiftValidator/Rules/ZipCodeRule.swift rename to Sources/SwiftValidator/Rules/ZipCodeRule.swift diff --git a/SwiftValidator.podspec b/SwiftValidator.podspec index e426329..31d010f 100644 --- a/SwiftValidator.podspec +++ b/SwiftValidator.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "SwiftValidator" s.version = "4.0.0" - s.swift_version = "4.2" + s.swift_version = "5.3" s.summary = "A UITextField Validation library for Swift" s.homepage = "https://github.com/jpotts18/SwiftValidator" s.screenshots = "https://raw.githubusercontent.com/jpotts18/SwiftValidator/master/swift-validator-v2.gif" @@ -11,7 +11,7 @@ Pod::Spec.new do |s| s.platform = :ios s.ios.deployment_target = '8.0' s.source = { :git => "https://github.com/jpotts18/SwiftValidator.git", :tag => "4.0.0" } - s.source_files = "SwiftValidator/**/*.swift" + s.source_files = "Sources/**/*.swift" s.exclude_files = "Validator/AppDelegate.swift" s.frameworks = ['Foundation', 'UIKit'] s.requires_arc = true diff --git a/Tests/SwiftValidatorTests/SwiftValidatorTests.swift b/Tests/SwiftValidatorTests/SwiftValidatorTests.swift index adb47e3..4672e21 100644 --- a/Tests/SwiftValidatorTests/SwiftValidatorTests.swift +++ b/Tests/SwiftValidatorTests/SwiftValidatorTests.swift @@ -1,15 +1,486 @@ +// +// SwiftValidatorTests.swift +// SwiftValidatorTests +// +// Created by Jeff Potter on 11/20/14. +// Copyright (c) 2014 jpotts18. All rights reserved. +// + +import UIKit import XCTest -@testable import SwiftValidator +import Validator // example app +import SwiftValidator // framework -final class SwiftValidatorTests: XCTestCase { - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct - // results. - XCTAssertEqual(SwiftValidator().text, "Hello, World!") +class SwiftValidatorTests: XCTestCase { + + let USERNAME_REGEX = "^[a-z0-9_-]{3,16}$" + + let VALID_ZIP = "12345" + let INVALID_ZIP = "1234" + + let VALID_EMAIL = "jiggy@gmail.com" + let INVALID_EMAIL = "This is not a valid email" + + let CONFIRM_TXT_FIELD = UITextField() + let CONFIRM_TEXT = "Confirm this!" + let CONFIRM_TEXT_DIFF = "I am not the same as the string above" + + let VALID_PASSWORD = "Super$ecret" + let INVALID_PASSWORD = "abc" + + let VALID_FLOAT = "1234.444" + let INVALID_FLOAT = "1234.44.44" + + let VALID_CARD_EXPIRY_MONTH = "10" + let INVALID_CARD_EXPIRY_MONTH = "13" + + let VALID_CARD_EXPIRY_YEAR = "2018" + let INVALID_CARD_EXPIRY_YEAR = "2016" + + let LEN_3 = "hey" + let LEN_5 = "Howdy" + let LEN_20 = "Paint the cat orange" + + let REGISTER_TXT_VIEW = UITextView() + let REGISTER_TXT_FIELD = UITextField() + let REGISTER_VALIDATOR = Validator() + let REGISTER_RULES = [Rule]() + + let UNREGISTER_TXT_FIELD = UITextField() + let UNREGISTER_VALIDATOR = Validator() + let UNREGISTER_RULES = [Rule]() + + let UNREGISTER_ERRORS_TXT_FIELD = UITextField() + let UNREGISTER_ERRORS_VALIDATOR = Validator() + + let ERROR_LABEL = UILabel() + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + + // MARK: Expiry Month + + func testCardExpiryMonthValid() { + XCTAssertTrue(CardExpiryMonthRule().validate(VALID_CARD_EXPIRY_MONTH), "Expiry month Should be valid") + } + + func testCardExpiryMonthInvalid() { + XCTAssertFalse(CardExpiryMonthRule().validate(INVALID_CARD_EXPIRY_MONTH), "Expiry month Should be invalid") + } + + func testCardExpiryMonthmessage() { + XCTAssertNotNil(CardExpiryMonthRule().errorMessage()) + } + + // MARK: Expiry Year + + func testCardExpiryYearValid() { + XCTAssertTrue(CardExpiryYearRule().validate(VALID_CARD_EXPIRY_YEAR), "Expiry year Should be valid") + } + + func testCardExpiryYearInvalid() { + XCTAssertFalse(CardExpiryYearRule().validate(INVALID_CARD_EXPIRY_YEAR), "Expiry year Should be invalid") + } + + func testCardExpiryYearmessage() { + XCTAssertNotNil(CardExpiryYearRule().errorMessage()) + } + + + // MARK: Required + + func testRequired() { + XCTAssertTrue(RequiredRule().validate("Something"), "Required should be valid") + } + + func testRequiredInvalid() { + XCTAssertFalse(RequiredRule().validate(""), "Required should be invalid") + } + + func testRequiredMessage() { + XCTAssertNotNil(RequiredRule().errorMessage()) + } + + // MARK: Regex + + func testRegex(){ + XCTAssertTrue(RegexRule(regex: USERNAME_REGEX).validate("darth_vader8"), "RegexRule should be valid") + } + + func testRegexInvalid(){ + XCTAssertFalse(RegexRule(regex: USERNAME_REGEX).validate("DarthVader"), "RegexRule should be invalid") + } + + func testRegexMessage() { + XCTAssertNotNil(RegexRule(regex: USERNAME_REGEX).errorMessage()) + } + + // MARK: Zipcode + + func testZipCode() { + XCTAssertTrue(ZipCodeRule().validate(VALID_ZIP), "Zipcode should be valid") + } + + func testZipCodeInvalid() { + XCTAssertFalse(ZipCodeRule().validate(INVALID_ZIP), "Zipcode should be invalid") + } + + func testZipCodeMessage() { + XCTAssertNotNil(ZipCodeRule().errorMessage()) + } + + // MARK: Email + + func testEmail() { + XCTAssertTrue(EmailRule().validate(VALID_EMAIL), "Email should be valid") + } + + func testEmailInvalid() { + XCTAssertFalse(EmailRule().validate(INVALID_EMAIL), "Email should be invalid") + } + + func testEmailMessage() { + XCTAssertNotNil(EmailRule().errorMessage()) + } + + // MARK: Float + + func testFloat() { + XCTAssert(FloatRule().validate(VALID_FLOAT), "Float should be valid") + } + + func testFloatInvalid() { + XCTAssert(!FloatRule().validate(INVALID_FLOAT), "Float should be invalid") + XCTAssert(!FloatRule().validate(VALID_EMAIL), "Float should be invalid") + } + + func testFloatMessage() { + XCTAssertNotNil(FloatRule().errorMessage()) + } + + // MARK: Confirm against field + + func testConfirmSame(){ + CONFIRM_TXT_FIELD.text = CONFIRM_TEXT + XCTAssertTrue(ConfirmationRule(confirmField: CONFIRM_TXT_FIELD).validate(CONFIRM_TEXT), "Should confirm successfully") + } + + func testConfirmDifferent() { + CONFIRM_TXT_FIELD.text = CONFIRM_TEXT + XCTAssertFalse(ConfirmationRule(confirmField: CONFIRM_TXT_FIELD).validate(CONFIRM_TEXT_DIFF), "Should fail confirm") + } + + func testConfirmMessage() { + CONFIRM_TXT_FIELD.text = CONFIRM_TEXT + XCTAssertNotNil(ConfirmationRule(confirmField: CONFIRM_TXT_FIELD).errorMessage()) + } + + // MARK: Password + + func testPassword() { + XCTAssertTrue(PasswordRule().validate(VALID_PASSWORD), "Password should be valid") + } + + func testPasswordInvalid(){ + XCTAssertFalse(PasswordRule().validate(INVALID_PASSWORD), "Password is invalid") + } + + func testPasswordMessage() { + XCTAssertNotNil(PasswordRule().errorMessage()) + } + + func testPhoneNumber() { + XCTAssertTrue(PhoneNumberRule().validate("1234567890"), "Phone number should valid") + } + + func testPhoneNumberInvalid() { + XCTAssertFalse(PhoneNumberRule().validate("12345678901"), "Phone number should be invalid") + } + + func testPhoneNumberMessage() { + XCTAssertNotNil(PhoneNumberRule().errorMessage()) + } + + // MARK: Max Length + + func testMaxLength(){ + XCTAssertTrue(MaxLengthRule().validate(LEN_3),"Max Length should be valid") + } + + func testMaxLengthInvalid(){ + XCTAssertFalse(MaxLengthRule().validate(LEN_20),"Max Length should be invalid") + } + + func testMaxLengthParameterAndGreaterThan(){ + XCTAssertTrue(MaxLengthRule(length: 20).validate(LEN_20), "Max Length should be 20 and <= length") } + + func testMaxLengthMessage() { + XCTAssertNotNil(MaxLengthRule(length: 20).errorMessage()) + } + + // MARK: Min Length + func testMinLength(){ + XCTAssertTrue(MinLengthRule().validate(LEN_3),"Min Length should be valid") + } + + func testMinLengthInvalid(){ + XCTAssertFalse(MinLengthRule().validate("no"),"Min Length should be Invalid") + } + + func testMinLengthWithParameter(){ + XCTAssertTrue(MinLengthRule(length: 5).validate(LEN_5), "Min Len should be set to 5 and >= length") + } + + func testMinLengthMessage() { + XCTAssertNotNil(MinLengthRule(length: 5).errorMessage()) + } + + func testExactLength(){ + XCTAssertTrue(ExactLengthRule(length: 5).validate(LEN_5), "Exact Len should be exactly 5") + } + + func testExactLengthInvalidGreaterThan(){ + XCTAssertFalse(ExactLengthRule(length: 6).validate(LEN_5), "Exact Len should be Invalid") + } + + func testExactLengthInvalidLessThan(){ + XCTAssertFalse(ExactLengthRule(length: 4).validate(LEN_5), "Exact Len should be Invalid") + } + + func testExactLengthMessage() { + XCTAssertNotNil(ExactLengthRule(length: 4).errorMessage()) + } + + // MARK: Full Name + + func testFullName(){ + XCTAssertTrue(FullNameRule().validate("Jeff Potter"), "Full Name should be valid") + } + + func testFullNameWith3Names(){ + XCTAssertTrue(FullNameRule().validate("Jeff Van Buren"), "Full Name should be valid") + } + + func testFullNameInvalid(){ + XCTAssertFalse(FullNameRule().validate("Carl"), "Full Name should be invalid") + } + + // MARK: ISBN + + func testValidISBN10() { + let validISBN10 = ["3836221195", "3-8362-2119-5", "3 8362 2119 5" , "1617290858", "1-61729-085-8", "1 61729 085-8" , "0007269706", "0-00-726970-6", "0 00 726970 6" , "3423214120", "3-423-21412-0", "3 423 21412 0", "340101319X", "3-401-01319-X", "3 401 01319 X"] + + for ISBN10 in validISBN10 { + XCTAssertTrue(ISBNRule().validate(ISBN10), "\(ISBN10) should be valid") + } + } + + func testInvalidISBN10() { + let invalidISBN10 = ["3423214121", "3-423-21412-1", "3 423 21412 1"] + + for ISBN10 in invalidISBN10 { + XCTAssertFalse(ISBNRule().validate(ISBN10), "\(ISBN10) should be invalid") + } + } + + // MARK: HexColor + + func testValidHexColors() { + let validHexes = ["#ff0034", "#CCCCCC", "fff", "#f00"] + for hex in validHexes { + XCTAssertTrue(HexColorRule().validate(hex), "\(hex) should be a valid Hex") + } + } + + func testInvalidHexColors() { + let validHexes = ["#ff", "fff0", "#ff12FG", ""] + for hex in validHexes { + XCTAssertFalse(HexColorRule().validate(hex), "\(hex) should be invalid Hex") + } + } + + //MARK: IPV4 - static var allTests = [ - ("testExample", testExample), - ] + func testValidIPV4() { + let validIPV4 = ["127.0.0.1" , "0.0.0.0" , "255.255.255.255" , "1.2.3.4"] + for ipv4 in validIPV4 { + XCTAssertTrue(IPV4Rule().validate(ipv4), "\(ipv4) should be a valid IPV4 address") + } + } + + func testInvalidIPV4() { + let invalidIPV4 = ["::1" , "2001:db8:0000:1:1:1:1:1" , "::ffff:127.0.0.1"] + for ipv4 in invalidIPV4 { + XCTAssertFalse(IPV4Rule().validate(ipv4), "\(ipv4) should be invalid IPV4 address") + } + } + + //MARK: AlphaNumeric + + func testValidAlphaNumeric() { + let validAlphaNumeric = ["abc123", "A1B2C35555"] + for alphaNum in validAlphaNumeric { + XCTAssertTrue(AlphaNumericRule().validate(alphaNum), "\(alphaNum) should be a valid alpha numeric string") + } + } + + func testInvalidAlphaNumeric() { + let invalidAlphaNumeric = ["abc ", "!!!!!", "ABC@DAGQW%!^$@%"] + for alphaNum in invalidAlphaNumeric { + XCTAssertFalse(AlphaNumericRule().validate(alphaNum), "\(alphaNum) should be invalid alpha numeric string") + } + } + + //MARK: Alpha + + func testValidAlpha() { + let validAlphaStrings = ["abc", "ABCDEFG", "AabeVsDvaW"] + for alpha in validAlphaStrings { + XCTAssertTrue(AlphaRule().validate(alpha), "\(alpha) should be valid alpha string") + } + } + + func testInvalidAlpha() { + let invalidAlphaStrings = ["abc1", " foo "] + for alpha in invalidAlphaStrings { + XCTAssertFalse(AlphaRule().validate(alpha), "\(alpha) should be invalid alpha string") + } + } + + // MARK: Register Field + func testRegisterTextView(){ + REGISTER_VALIDATOR.registerField(REGISTER_TXT_VIEW, rules: REGISTER_RULES) + XCTAssert(REGISTER_VALIDATOR.validations[REGISTER_TXT_VIEW] != nil, "Textfield should register") + } + + func testRegisterTextField(){ + REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, rules: REGISTER_RULES) + XCTAssert(REGISTER_VALIDATOR.validations[REGISTER_TXT_FIELD] != nil, "Textfield should register") + } + + func testUnregisterTextField(){ + UNREGISTER_VALIDATOR.registerField(UNREGISTER_TXT_FIELD, rules: UNREGISTER_RULES) + UNREGISTER_VALIDATOR.unregisterField(UNREGISTER_TXT_FIELD) + XCTAssert(UNREGISTER_VALIDATOR.validations[UNREGISTER_TXT_FIELD] == nil, "Textfield should unregister") + } + + func testUnregisterError(){ + UNREGISTER_ERRORS_VALIDATOR.registerField(UNREGISTER_ERRORS_TXT_FIELD, rules: [EmailRule()]) + UNREGISTER_ERRORS_TXT_FIELD.text = INVALID_EMAIL + UNREGISTER_ERRORS_VALIDATOR.validate { (errors) -> Void in + XCTAssert(errors.count == 1, "Should come back with errors") + } + UNREGISTER_ERRORS_VALIDATOR.unregisterField(UNREGISTER_ERRORS_TXT_FIELD) + UNREGISTER_ERRORS_VALIDATOR.validate { (errors) -> Void in + XCTAssert(errors.count == 0, "Should not come back with errors") + } + } + + // MARK: Validate Functions + + func testValidateWithCallback() { + REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, rules: [EmailRule()]) + REGISTER_TXT_FIELD.text = VALID_EMAIL + REGISTER_VALIDATOR.validate { (errors) -> Void in + XCTAssert(errors.count == 0, "Should not come back with errors") + } + REGISTER_TXT_FIELD.text = INVALID_EMAIL + REGISTER_VALIDATOR.validate { (errors) -> Void in + XCTAssert(errors.count == 1, "Should come back with 1 error") + } + } + + func testValidateSingleField() { + REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, rules: [EmailRule()]) + REGISTER_TXT_FIELD.text = VALID_EMAIL + REGISTER_VALIDATOR.validateField(REGISTER_TXT_FIELD) { error in + XCTAssert(error == nil, "Should not present error") + } + REGISTER_TXT_FIELD.text = INVALID_EMAIL + REGISTER_VALIDATOR.validateField(REGISTER_TXT_FIELD) { error in + XCTAssert(error?.errorMessage.characters.count ?? 0 > 0, "Should state 'invalid email'") + } + } + + func testValidateTextViewField() { + REGISTER_VALIDATOR.registerField(REGISTER_TXT_VIEW, rules: [RequiredRule()]) + REGISTER_TXT_VIEW.text = "Some notes" + REGISTER_VALIDATOR.validateField(REGISTER_TXT_VIEW) { error in + XCTAssert(error == nil, "Should not present error") + } + REGISTER_TXT_VIEW.text = nil + REGISTER_VALIDATOR.validateField(REGISTER_TXT_VIEW) { error in + XCTAssert(error!.errorMessage == "This field is required") + } + } + + // MARK: Validate error field gets it's text set to the error, if supplied + + func testNoErrorMessageSet() { + REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, errorLabel: ERROR_LABEL, rules: [EmailRule()]) + REGISTER_TXT_FIELD.text = VALID_EMAIL + REGISTER_VALIDATOR.validate { (errors) -> Void in + XCTAssert(errors.count == 0, "Should not come back with errors") + } + } + + func testErrorMessageSet() { + REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, errorLabel: ERROR_LABEL, rules: [EmailRule()]) + var successCount = 0 + var errorCount = 0 + REGISTER_VALIDATOR.styleTransformers(success: { (validationRule) -> Void in + successCount+=1 + }) { (validationError) -> Void in + errorCount+=1 + } + REGISTER_TXT_FIELD.text = INVALID_EMAIL + REGISTER_VALIDATOR.validate { (errors) -> Void in + XCTAssert(errors.count == 1, "Should come back with errors") + XCTAssert(errorCount == 1, "Should have called the error style transform once") + XCTAssert(successCount == 0, "Should not have called the success style transform as there are no successful fields") + } + } + + func testErrorMessageSetAndThenUnset() { + REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, errorLabel: ERROR_LABEL, rules: [EmailRule()]) + + var successCount = 0 + var errorCount = 0 + REGISTER_VALIDATOR.styleTransformers(success: { (validationRule) -> Void in + successCount+=1 + }) { (validationError) -> Void in + errorCount+=1 + } + + REGISTER_TXT_FIELD.text = INVALID_EMAIL + REGISTER_VALIDATOR.validate { (errors) -> Void in + XCTAssert(errors.count == 1, "Should come back with errors") + XCTAssert(errorCount == 1, "Should have called the error style transform once") + XCTAssert(successCount == 0, "Should not have called the success style transform as there are no successful fields") + self.REGISTER_TXT_FIELD.text = self.VALID_EMAIL + self.REGISTER_VALIDATOR.validate { (errors) -> Void in + XCTAssert(errors.count == 0, "Should not come back with errors: \(errors)") + XCTAssert(successCount == 1, "Should have called the success style transform once") + XCTAssert(errorCount == 1, "Should not have called the error style transform again") + } + } + } + + func testTextFieldBorderColorNotSet() { + REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, errorLabel: ERROR_LABEL, rules: [EmailRule()]) + REGISTER_TXT_FIELD.text = INVALID_EMAIL + REGISTER_VALIDATOR.validate { (errors) -> Void in + XCTAssert(errors.count == 1, "Should come back with errors") + XCTAssert(!(self.REGISTER_TXT_FIELD.layer.borderColor! == UIColor.red.cgColor), "Color shouldn't get set at all") + } + } } diff --git a/Validator.xcodeproj/project.pbxproj b/Validator.xcodeproj/project.pbxproj index b160122..1d2ce7b 100644 --- a/Validator.xcodeproj/project.pbxproj +++ b/Validator.xcodeproj/project.pbxproj @@ -7,36 +7,8 @@ objects = { /* Begin PBXBuildFile section */ - 62C1821D1C6312F5003788E7 /* ExactLengthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62C1821C1C6312F5003788E7 /* ExactLengthRule.swift */; }; - 62D9B2561C7C0B2A00BAFCE3 /* ValidationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D9B2551C7C0B2A00BAFCE3 /* ValidationDelegate.swift */; }; - 7CC1E4CF1C636B4500AF013C /* AlphaRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC1E4CE1C636B4500AF013C /* AlphaRule.swift */; }; - 7CC1E4D11C637A7700AF013C /* AlphaNumericRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC1E4D01C637A7700AF013C /* AlphaNumericRule.swift */; }; - 7CC1E4D31C637ABC00AF013C /* CharacterSetRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC1E4D21C637ABC00AF013C /* CharacterSetRule.swift */; }; - 7CC1E4D51C637C8500AF013C /* IPV4Rule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC1E4D41C637C8500AF013C /* IPV4Rule.swift */; }; - 7CC1E4D71C637F6E00AF013C /* ISBNRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC1E4D61C637F6E00AF013C /* ISBNRule.swift */; }; - 7CC1E4DB1C63BFA600AF013C /* HexColorRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC1E4DA1C63BFA600AF013C /* HexColorRule.swift */; }; - C87F606A1E2B678B00EB8429 /* CardExpiryMonthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = C87F60691E2B678B00EB8429 /* CardExpiryMonthRule.swift */; }; - C87F606C1E2B68C900EB8429 /* CardExpiryYearRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = C87F606B1E2B68C900EB8429 /* CardExpiryYearRule.swift */; }; FB465CB81B9884F400398388 /* SwiftValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = FB465CB71B9884F400398388 /* SwiftValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; FB465CBE1B9884F400398388 /* SwiftValidator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB465CB31B9884F400398388 /* SwiftValidator.framework */; }; - FB465CC71B9884F400398388 /* SwiftValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CC61B9884F400398388 /* SwiftValidatorTests.swift */; }; - FB465CF31B9889EA00398388 /* ConfirmRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CE31B9889EA00398388 /* ConfirmRule.swift */; }; - FB465CF41B9889EA00398388 /* EmailRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CE41B9889EA00398388 /* EmailRule.swift */; }; - FB465CF51B9889EA00398388 /* FloatRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CE51B9889EA00398388 /* FloatRule.swift */; }; - FB465CF61B9889EA00398388 /* FullNameRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CE61B9889EA00398388 /* FullNameRule.swift */; }; - FB465CF71B9889EA00398388 /* MaxLengthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CE71B9889EA00398388 /* MaxLengthRule.swift */; }; - FB465CF81B9889EA00398388 /* MinLengthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CE81B9889EA00398388 /* MinLengthRule.swift */; }; - FB465CF91B9889EA00398388 /* PasswordRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CE91B9889EA00398388 /* PasswordRule.swift */; }; - FB465CFA1B9889EA00398388 /* PhoneNumberRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CEA1B9889EA00398388 /* PhoneNumberRule.swift */; }; - FB465CFB1B9889EA00398388 /* RegexRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CEB1B9889EA00398388 /* RegexRule.swift */; }; - FB465CFC1B9889EA00398388 /* RequiredRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CEC1B9889EA00398388 /* RequiredRule.swift */; }; - FB465CFD1B9889EA00398388 /* Rule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CED1B9889EA00398388 /* Rule.swift */; }; - FB465CFE1B9889EA00398388 /* ValidationRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CEE1B9889EA00398388 /* ValidationRule.swift */; }; - FB465CFF1B9889EA00398388 /* ZipCodeRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CEF1B9889EA00398388 /* ZipCodeRule.swift */; }; - FB465D001B9889EA00398388 /* ValidationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CF11B9889EA00398388 /* ValidationError.swift */; }; - FB465D011B9889EA00398388 /* Validator.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB465CF21B9889EA00398388 /* Validator.swift */; }; - FB51E5B01CD208B8004DE696 /* Validatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB51E5AF1CD208B8004DE696 /* Validatable.swift */; }; - FBA963631CDA10130071F03E /* ValidatorDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBA963621CDA10130071F03E /* ValidatorDictionary.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -50,7 +22,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 62C1821C1C6312F5003788E7 /* ExactLengthRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExactLengthRule.swift; sourceTree = ""; }; + 288B8AE3251705CE00114B96 /* Tests */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Tests; sourceTree = ""; }; + 288B8AE4251705D600114B96 /* Sources */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Sources; sourceTree = ""; }; 62D1AE1B1A1E6D4400E4DFF8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 62D1AE1C1A1E6D4400E4DFF8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 62D1AE1E1A1E6D4400E4DFF8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -59,38 +32,11 @@ 62D1AE261A1E6D4400E4DFF8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 62D1AE2C1A1E6D4500E4DFF8 /* ValidatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ValidatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 62D1AE311A1E6D4500E4DFF8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 62D9B2551C7C0B2A00BAFCE3 /* ValidationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationDelegate.swift; sourceTree = ""; }; - 7CC1E4CE1C636B4500AF013C /* AlphaRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlphaRule.swift; sourceTree = ""; }; - 7CC1E4D01C637A7700AF013C /* AlphaNumericRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlphaNumericRule.swift; sourceTree = ""; }; - 7CC1E4D21C637ABC00AF013C /* CharacterSetRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CharacterSetRule.swift; sourceTree = ""; }; - 7CC1E4D41C637C8500AF013C /* IPV4Rule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IPV4Rule.swift; sourceTree = ""; }; - 7CC1E4D61C637F6E00AF013C /* ISBNRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ISBNRule.swift; sourceTree = ""; }; - 7CC1E4DA1C63BFA600AF013C /* HexColorRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HexColorRule.swift; sourceTree = ""; }; - C87F60691E2B678B00EB8429 /* CardExpiryMonthRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardExpiryMonthRule.swift; sourceTree = ""; }; - C87F606B1E2B68C900EB8429 /* CardExpiryYearRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardExpiryYearRule.swift; sourceTree = ""; }; FB465CB31B9884F400398388 /* SwiftValidator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftValidator.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FB465CB61B9884F400398388 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; FB465CB71B9884F400398388 /* SwiftValidator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftValidator.h; sourceTree = ""; }; FB465CBD1B9884F400398388 /* SwiftValidatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftValidatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; FB465CC51B9884F400398388 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FB465CC61B9884F400398388 /* SwiftValidatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftValidatorTests.swift; sourceTree = ""; }; - FB465CE31B9889EA00398388 /* ConfirmRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmRule.swift; sourceTree = ""; }; - FB465CE41B9889EA00398388 /* EmailRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmailRule.swift; sourceTree = ""; }; - FB465CE51B9889EA00398388 /* FloatRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FloatRule.swift; sourceTree = ""; }; - FB465CE61B9889EA00398388 /* FullNameRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FullNameRule.swift; sourceTree = ""; }; - FB465CE71B9889EA00398388 /* MaxLengthRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MaxLengthRule.swift; sourceTree = ""; }; - FB465CE81B9889EA00398388 /* MinLengthRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MinLengthRule.swift; sourceTree = ""; }; - FB465CE91B9889EA00398388 /* PasswordRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordRule.swift; sourceTree = ""; }; - FB465CEA1B9889EA00398388 /* PhoneNumberRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhoneNumberRule.swift; sourceTree = ""; }; - FB465CEB1B9889EA00398388 /* RegexRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RegexRule.swift; sourceTree = ""; }; - FB465CEC1B9889EA00398388 /* RequiredRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequiredRule.swift; sourceTree = ""; }; - FB465CED1B9889EA00398388 /* Rule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Rule.swift; sourceTree = ""; }; - FB465CEE1B9889EA00398388 /* ValidationRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationRule.swift; sourceTree = ""; }; - FB465CEF1B9889EA00398388 /* ZipCodeRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipCodeRule.swift; sourceTree = ""; }; - FB465CF11B9889EA00398388 /* ValidationError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationError.swift; sourceTree = ""; }; - FB465CF21B9889EA00398388 /* Validator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Validator.swift; sourceTree = ""; }; - FB51E5AF1CD208B8004DE696 /* Validatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Validatable.swift; sourceTree = ""; }; - FBA963621CDA10130071F03E /* ValidatorDictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidatorDictionary.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -122,6 +68,8 @@ 62D1AE0E1A1E6D4400E4DFF8 = { isa = PBXGroup; children = ( + 288B8AE4251705D600114B96 /* Sources */, + 288B8AE3251705CE00114B96 /* Tests */, 62D1AE191A1E6D4400E4DFF8 /* Validator */, 62D1AE2F1A1E6D4500E4DFF8 /* ValidatorTests */, FB465CB41B9884F400398388 /* SwiftValidator */, @@ -180,8 +128,6 @@ FB465CB41B9884F400398388 /* SwiftValidator */ = { isa = PBXGroup; children = ( - FB465CE21B9889EA00398388 /* Rules */, - FB465CF01B9889EA00398388 /* Core */, FB465CB71B9884F400398388 /* SwiftValidator.h */, FB465CB51B9884F400398388 /* Supporting Files */, ); @@ -199,7 +145,6 @@ FB465CC31B9884F400398388 /* SwiftValidatorTests */ = { isa = PBXGroup; children = ( - FB465CC61B9884F400398388 /* SwiftValidatorTests.swift */, FB465CC41B9884F400398388 /* Supporting Files */, ); path = SwiftValidatorTests; @@ -213,47 +158,6 @@ name = "Supporting Files"; sourceTree = ""; }; - FB465CE21B9889EA00398388 /* Rules */ = { - isa = PBXGroup; - children = ( - 7CC1E4CE1C636B4500AF013C /* AlphaRule.swift */, - C87F606B1E2B68C900EB8429 /* CardExpiryYearRule.swift */, - C87F60691E2B678B00EB8429 /* CardExpiryMonthRule.swift */, - 7CC1E4D01C637A7700AF013C /* AlphaNumericRule.swift */, - 7CC1E4D21C637ABC00AF013C /* CharacterSetRule.swift */, - 7CC1E4D41C637C8500AF013C /* IPV4Rule.swift */, - 7CC1E4D61C637F6E00AF013C /* ISBNRule.swift */, - 7CC1E4DA1C63BFA600AF013C /* HexColorRule.swift */, - FB465CE31B9889EA00398388 /* ConfirmRule.swift */, - FB465CE41B9889EA00398388 /* EmailRule.swift */, - FB465CE51B9889EA00398388 /* FloatRule.swift */, - FB465CE61B9889EA00398388 /* FullNameRule.swift */, - FB465CE71B9889EA00398388 /* MaxLengthRule.swift */, - FB465CE81B9889EA00398388 /* MinLengthRule.swift */, - FB465CE91B9889EA00398388 /* PasswordRule.swift */, - FB465CEA1B9889EA00398388 /* PhoneNumberRule.swift */, - FB465CEB1B9889EA00398388 /* RegexRule.swift */, - FB465CEC1B9889EA00398388 /* RequiredRule.swift */, - FB465CED1B9889EA00398388 /* Rule.swift */, - FB465CEE1B9889EA00398388 /* ValidationRule.swift */, - FB465CEF1B9889EA00398388 /* ZipCodeRule.swift */, - 62C1821C1C6312F5003788E7 /* ExactLengthRule.swift */, - ); - path = Rules; - sourceTree = ""; - }; - FB465CF01B9889EA00398388 /* Core */ = { - isa = PBXGroup; - children = ( - 62D9B2551C7C0B2A00BAFCE3 /* ValidationDelegate.swift */, - FB465CF11B9889EA00398388 /* ValidationError.swift */, - FB465CF21B9889EA00398388 /* Validator.swift */, - FB51E5AF1CD208B8004DE696 /* Validatable.swift */, - FBA963621CDA10130071F03E /* ValidatorDictionary.swift */, - ); - path = Core; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -404,33 +308,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - FB465CF41B9889EA00398388 /* EmailRule.swift in Sources */, - FB465CF61B9889EA00398388 /* FullNameRule.swift in Sources */, - FBA963631CDA10130071F03E /* ValidatorDictionary.swift in Sources */, - FB465CFF1B9889EA00398388 /* ZipCodeRule.swift in Sources */, - FB465CF91B9889EA00398388 /* PasswordRule.swift in Sources */, - 7CC1E4D11C637A7700AF013C /* AlphaNumericRule.swift in Sources */, - 7CC1E4D31C637ABC00AF013C /* CharacterSetRule.swift in Sources */, - FB465CFD1B9889EA00398388 /* Rule.swift in Sources */, - FB465CFA1B9889EA00398388 /* PhoneNumberRule.swift in Sources */, - FB465CF51B9889EA00398388 /* FloatRule.swift in Sources */, - C87F606C1E2B68C900EB8429 /* CardExpiryYearRule.swift in Sources */, - 7CC1E4DB1C63BFA600AF013C /* HexColorRule.swift in Sources */, - FB465D011B9889EA00398388 /* Validator.swift in Sources */, - FB465CFE1B9889EA00398388 /* ValidationRule.swift in Sources */, - C87F606A1E2B678B00EB8429 /* CardExpiryMonthRule.swift in Sources */, - FB465CF31B9889EA00398388 /* ConfirmRule.swift in Sources */, - FB51E5B01CD208B8004DE696 /* Validatable.swift in Sources */, - 7CC1E4D51C637C8500AF013C /* IPV4Rule.swift in Sources */, - 7CC1E4D71C637F6E00AF013C /* ISBNRule.swift in Sources */, - FB465D001B9889EA00398388 /* ValidationError.swift in Sources */, - FB465CFC1B9889EA00398388 /* RequiredRule.swift in Sources */, - FB465CFB1B9889EA00398388 /* RegexRule.swift in Sources */, - 7CC1E4CF1C636B4500AF013C /* AlphaRule.swift in Sources */, - 62D9B2561C7C0B2A00BAFCE3 /* ValidationDelegate.swift in Sources */, - FB465CF81B9889EA00398388 /* MinLengthRule.swift in Sources */, - FB465CF71B9889EA00398388 /* MaxLengthRule.swift in Sources */, - 62C1821D1C6312F5003788E7 /* ExactLengthRule.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -438,7 +315,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - FB465CC71B9884F400398388 /* SwiftValidatorTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From b67b171ee76d89b86ccb9fdbb8524f166ed08ee0 Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 21:47:49 -0600 Subject: [PATCH 03/19] SPM Support -Updated version --- SwiftValidator.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SwiftValidator.podspec b/SwiftValidator.podspec index 31d010f..1cf69b6 100644 --- a/SwiftValidator.podspec +++ b/SwiftValidator.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "SwiftValidator" - s.version = "4.0.0" + s.version = "5.1.0" s.swift_version = "5.3" s.summary = "A UITextField Validation library for Swift" s.homepage = "https://github.com/jpotts18/SwiftValidator" From da36b6699d6dc081a320ac13020de74f5b2c4cd9 Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 21:57:49 -0600 Subject: [PATCH 04/19] SPM Support -Added missing file. --- Validator.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Validator.xcodeproj/project.pbxproj b/Validator.xcodeproj/project.pbxproj index 1d2ce7b..ffdbb08 100644 --- a/Validator.xcodeproj/project.pbxproj +++ b/Validator.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ /* Begin PBXFileReference section */ 288B8AE3251705CE00114B96 /* Tests */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Tests; sourceTree = ""; }; 288B8AE4251705D600114B96 /* Sources */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Sources; sourceTree = ""; }; + 288B8AF0251709B400114B96 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; 62D1AE1B1A1E6D4400E4DFF8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 62D1AE1C1A1E6D4400E4DFF8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 62D1AE1E1A1E6D4400E4DFF8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -68,6 +69,7 @@ 62D1AE0E1A1E6D4400E4DFF8 = { isa = PBXGroup; children = ( + 288B8AF0251709B400114B96 /* Package.swift */, 288B8AE4251705D600114B96 /* Sources */, 288B8AE3251705CE00114B96 /* Tests */, 62D1AE191A1E6D4400E4DFF8 /* Validator */, From 447cdf0f628015e030a3ade6e6b770e3fa0de3fd Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 22:06:30 -0600 Subject: [PATCH 05/19] SPM Support -Moved missing files. --- .../SwiftValidator}/Info.plist | 0 .../SwiftValidator}/SwiftValidator.h | 0 .../SwiftValidatorTests}/Info.plist | 0 Validator.xcodeproj/project.pbxproj | 12 ++---------- 4 files changed, 2 insertions(+), 10 deletions(-) rename {SwiftValidator => Sources/SwiftValidator}/Info.plist (100%) rename {SwiftValidator => Sources/SwiftValidator}/SwiftValidator.h (100%) rename {ValidatorTests => Tests/SwiftValidatorTests}/Info.plist (100%) diff --git a/SwiftValidator/Info.plist b/Sources/SwiftValidator/Info.plist similarity index 100% rename from SwiftValidator/Info.plist rename to Sources/SwiftValidator/Info.plist diff --git a/SwiftValidator/SwiftValidator.h b/Sources/SwiftValidator/SwiftValidator.h similarity index 100% rename from SwiftValidator/SwiftValidator.h rename to Sources/SwiftValidator/SwiftValidator.h diff --git a/ValidatorTests/Info.plist b/Tests/SwiftValidatorTests/Info.plist similarity index 100% rename from ValidatorTests/Info.plist rename to Tests/SwiftValidatorTests/Info.plist diff --git a/Validator.xcodeproj/project.pbxproj b/Validator.xcodeproj/project.pbxproj index ffdbb08..2038157 100644 --- a/Validator.xcodeproj/project.pbxproj +++ b/Validator.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - FB465CB81B9884F400398388 /* SwiftValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = FB465CB71B9884F400398388 /* SwiftValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; FB465CBE1B9884F400398388 /* SwiftValidator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB465CB31B9884F400398388 /* SwiftValidator.framework */; }; /* End PBXBuildFile section */ @@ -32,10 +31,7 @@ 62D1AE231A1E6D4400E4DFF8 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 62D1AE261A1E6D4400E4DFF8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 62D1AE2C1A1E6D4500E4DFF8 /* ValidatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ValidatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 62D1AE311A1E6D4500E4DFF8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; FB465CB31B9884F400398388 /* SwiftValidator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftValidator.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FB465CB61B9884F400398388 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FB465CB71B9884F400398388 /* SwiftValidator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftValidator.h; sourceTree = ""; }; FB465CBD1B9884F400398388 /* SwiftValidatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftValidatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; FB465CC51B9884F400398388 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -122,7 +118,6 @@ 62D1AE301A1E6D4500E4DFF8 /* Supporting Files */ = { isa = PBXGroup; children = ( - 62D1AE311A1E6D4500E4DFF8 /* Info.plist */, ); name = "Supporting Files"; sourceTree = ""; @@ -130,7 +125,6 @@ FB465CB41B9884F400398388 /* SwiftValidator */ = { isa = PBXGroup; children = ( - FB465CB71B9884F400398388 /* SwiftValidator.h */, FB465CB51B9884F400398388 /* Supporting Files */, ); path = SwiftValidator; @@ -139,7 +133,6 @@ FB465CB51B9884F400398388 /* Supporting Files */ = { isa = PBXGroup; children = ( - FB465CB61B9884F400398388 /* Info.plist */, ); name = "Supporting Files"; sourceTree = ""; @@ -167,7 +160,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - FB465CB81B9884F400398388 /* SwiftValidator.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -498,7 +490,7 @@ "DEBUG=1", "$(inherited)", ); - INFOPLIST_FILE = SwiftValidator/Info.plist; + INFOPLIST_FILE = Sources/SwiftValidator/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "me.jeffpotter.$(PRODUCT_NAME:rfc1034identifier)"; @@ -523,7 +515,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = SwiftValidator/Info.plist; + INFOPLIST_FILE = Sources/SwiftValidator/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "me.jeffpotter.$(PRODUCT_NAME:rfc1034identifier)"; From 6093046952ecc74a0e1fce480d74493d0566feaf Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 22:29:51 -0600 Subject: [PATCH 06/19] SPM Support -Fixed target files. --- .../Core => Core}/Validatable.swift | 0 .../Core => Core}/ValidationDelegate.swift | 0 .../Core => Core}/ValidationError.swift | 0 .../Core => Core}/Validator.swift | 0 .../Core => Core}/ValidatorDictionary.swift | 0 Tests/SwiftValidatorTests-Bridging-Header.h | 4 + Validator.xcodeproj/project.pbxproj | 227 ++++++++++++++---- 7 files changed, 186 insertions(+), 45 deletions(-) rename {Sources/SwiftValidator/Core => Core}/Validatable.swift (100%) rename {Sources/SwiftValidator/Core => Core}/ValidationDelegate.swift (100%) rename {Sources/SwiftValidator/Core => Core}/ValidationError.swift (100%) rename {Sources/SwiftValidator/Core => Core}/Validator.swift (100%) rename {Sources/SwiftValidator/Core => Core}/ValidatorDictionary.swift (100%) create mode 100644 Tests/SwiftValidatorTests-Bridging-Header.h diff --git a/Sources/SwiftValidator/Core/Validatable.swift b/Core/Validatable.swift similarity index 100% rename from Sources/SwiftValidator/Core/Validatable.swift rename to Core/Validatable.swift diff --git a/Sources/SwiftValidator/Core/ValidationDelegate.swift b/Core/ValidationDelegate.swift similarity index 100% rename from Sources/SwiftValidator/Core/ValidationDelegate.swift rename to Core/ValidationDelegate.swift diff --git a/Sources/SwiftValidator/Core/ValidationError.swift b/Core/ValidationError.swift similarity index 100% rename from Sources/SwiftValidator/Core/ValidationError.swift rename to Core/ValidationError.swift diff --git a/Sources/SwiftValidator/Core/Validator.swift b/Core/Validator.swift similarity index 100% rename from Sources/SwiftValidator/Core/Validator.swift rename to Core/Validator.swift diff --git a/Sources/SwiftValidator/Core/ValidatorDictionary.swift b/Core/ValidatorDictionary.swift similarity index 100% rename from Sources/SwiftValidator/Core/ValidatorDictionary.swift rename to Core/ValidatorDictionary.swift diff --git a/Tests/SwiftValidatorTests-Bridging-Header.h b/Tests/SwiftValidatorTests-Bridging-Header.h new file mode 100644 index 0000000..1b2cb5d --- /dev/null +++ b/Tests/SwiftValidatorTests-Bridging-Header.h @@ -0,0 +1,4 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + diff --git a/Validator.xcodeproj/project.pbxproj b/Validator.xcodeproj/project.pbxproj index 2038157..75da46d 100644 --- a/Validator.xcodeproj/project.pbxproj +++ b/Validator.xcodeproj/project.pbxproj @@ -7,6 +7,39 @@ objects = { /* Begin PBXBuildFile section */ + 288B8B5C2517100100114B96 /* FullNameRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B1F25170F4C00114B96 /* FullNameRule.swift */; }; + 288B8B602517100400114B96 /* CardExpiryYearRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2025170F4C00114B96 /* CardExpiryYearRule.swift */; }; + 288B8B642517100B00114B96 /* ExactLengthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2325170F4C00114B96 /* ExactLengthRule.swift */; }; + 288B8B652517100B00114B96 /* FloatRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2625170F4C00114B96 /* FloatRule.swift */; }; + 288B8B662517100B00114B96 /* ValidationRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B3225170F4C00114B96 /* ValidationRule.swift */; }; + 288B8B672517100B00114B96 /* EmailRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2C25170F4C00114B96 /* EmailRule.swift */; }; + 288B8B682517100B00114B96 /* RegexRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2925170F4C00114B96 /* RegexRule.swift */; }; + 288B8B692517100B00114B96 /* PasswordRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2225170F4C00114B96 /* PasswordRule.swift */; }; + 288B8B6A2517100B00114B96 /* Rule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2F25170F4C00114B96 /* Rule.swift */; }; + 288B8B6B2517100B00114B96 /* MaxLengthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2725170F4C00114B96 /* MaxLengthRule.swift */; }; + 288B8B6C2517100B00114B96 /* ZipCodeRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2A25170F4C00114B96 /* ZipCodeRule.swift */; }; + 288B8B6D2517100B00114B96 /* AlphaNumericRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2D25170F4C00114B96 /* AlphaNumericRule.swift */; }; + 288B8B6E2517100B00114B96 /* HexColorRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2B25170F4C00114B96 /* HexColorRule.swift */; }; + 288B8B6F2517100B00114B96 /* ISBNRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B3425170F4C00114B96 /* ISBNRule.swift */; }; + 288B8B702517100B00114B96 /* MinLengthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2525170F4C00114B96 /* MinLengthRule.swift */; }; + 288B8B712517100B00114B96 /* CharacterSetRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2125170F4C00114B96 /* CharacterSetRule.swift */; }; + 288B8B722517100B00114B96 /* IPV4Rule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B3125170F4C00114B96 /* IPV4Rule.swift */; }; + 288B8B732517100B00114B96 /* ConfirmRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2425170F4C00114B96 /* ConfirmRule.swift */; }; + 288B8B742517100B00114B96 /* AlphaRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B3325170F4C00114B96 /* AlphaRule.swift */; }; + 288B8B752517100B00114B96 /* CardExpiryMonthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2825170F4C00114B96 /* CardExpiryMonthRule.swift */; }; + 288B8B762517100B00114B96 /* PhoneNumberRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2E25170F4C00114B96 /* PhoneNumberRule.swift */; }; + 288B8B772517100B00114B96 /* RequiredRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B3025170F4C00114B96 /* RequiredRule.swift */; }; + 288B8B7C2517102900114B96 /* SwiftValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 288B8B7B2517102600114B96 /* SwiftValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 288B8B812517102F00114B96 /* SwiftValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B802517102F00114B96 /* SwiftValidator.swift */; }; + 288B8B8E2517107100114B96 /* ValidationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B892517107100114B96 /* ValidationDelegate.swift */; }; + 288B8B8F2517107100114B96 /* ValidationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B8A2517107100114B96 /* ValidationError.swift */; }; + 288B8B902517107100114B96 /* ValidatorDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B8B2517107100114B96 /* ValidatorDictionary.swift */; }; + 288B8B912517107100114B96 /* Validatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B8C2517107100114B96 /* Validatable.swift */; }; + 288B8B922517107100114B96 /* Validator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B8D2517107100114B96 /* Validator.swift */; }; + 288B8B9D2517110800114B96 /* LinuxMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B9C2517110800114B96 /* LinuxMain.swift */; }; + 288B8BA42517112300114B96 /* SwiftValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8BA12517112200114B96 /* SwiftValidatorTests.swift */; }; + 288B8BA52517112300114B96 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 288B8BA22517112200114B96 /* Info.plist */; }; + 288B8BA62517112300114B96 /* XCTestManifests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8BA32517112300114B96 /* XCTestManifests.swift */; }; FB465CBE1B9884F400398388 /* SwiftValidator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB465CB31B9884F400398388 /* SwiftValidator.framework */; }; /* End PBXBuildFile section */ @@ -21,9 +54,42 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 288B8AE3251705CE00114B96 /* Tests */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Tests; sourceTree = ""; }; - 288B8AE4251705D600114B96 /* Sources */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Sources; sourceTree = ""; }; 288B8AF0251709B400114B96 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; + 288B8B1D25170F4800114B96 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 288B8B1F25170F4C00114B96 /* FullNameRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullNameRule.swift; sourceTree = ""; }; + 288B8B2025170F4C00114B96 /* CardExpiryYearRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardExpiryYearRule.swift; sourceTree = ""; }; + 288B8B2125170F4C00114B96 /* CharacterSetRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacterSetRule.swift; sourceTree = ""; }; + 288B8B2225170F4C00114B96 /* PasswordRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordRule.swift; sourceTree = ""; }; + 288B8B2325170F4C00114B96 /* ExactLengthRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExactLengthRule.swift; sourceTree = ""; }; + 288B8B2425170F4C00114B96 /* ConfirmRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfirmRule.swift; sourceTree = ""; }; + 288B8B2525170F4C00114B96 /* MinLengthRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MinLengthRule.swift; sourceTree = ""; }; + 288B8B2625170F4C00114B96 /* FloatRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FloatRule.swift; sourceTree = ""; }; + 288B8B2725170F4C00114B96 /* MaxLengthRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaxLengthRule.swift; sourceTree = ""; }; + 288B8B2825170F4C00114B96 /* CardExpiryMonthRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardExpiryMonthRule.swift; sourceTree = ""; }; + 288B8B2925170F4C00114B96 /* RegexRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegexRule.swift; sourceTree = ""; }; + 288B8B2A25170F4C00114B96 /* ZipCodeRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZipCodeRule.swift; sourceTree = ""; }; + 288B8B2B25170F4C00114B96 /* HexColorRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HexColorRule.swift; sourceTree = ""; }; + 288B8B2C25170F4C00114B96 /* EmailRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailRule.swift; sourceTree = ""; }; + 288B8B2D25170F4C00114B96 /* AlphaNumericRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlphaNumericRule.swift; sourceTree = ""; }; + 288B8B2E25170F4C00114B96 /* PhoneNumberRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneNumberRule.swift; sourceTree = ""; }; + 288B8B2F25170F4C00114B96 /* Rule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Rule.swift; sourceTree = ""; }; + 288B8B3025170F4C00114B96 /* RequiredRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequiredRule.swift; sourceTree = ""; }; + 288B8B3125170F4C00114B96 /* IPV4Rule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPV4Rule.swift; sourceTree = ""; }; + 288B8B3225170F4C00114B96 /* ValidationRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValidationRule.swift; sourceTree = ""; }; + 288B8B3325170F4C00114B96 /* AlphaRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlphaRule.swift; sourceTree = ""; }; + 288B8B3425170F4C00114B96 /* ISBNRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ISBNRule.swift; sourceTree = ""; }; + 288B8B7B2517102600114B96 /* SwiftValidator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftValidator.h; sourceTree = ""; }; + 288B8B802517102F00114B96 /* SwiftValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftValidator.swift; sourceTree = ""; }; + 288B8B892517107100114B96 /* ValidationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ValidationDelegate.swift; path = Core/ValidationDelegate.swift; sourceTree = SOURCE_ROOT; }; + 288B8B8A2517107100114B96 /* ValidationError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ValidationError.swift; path = Core/ValidationError.swift; sourceTree = SOURCE_ROOT; }; + 288B8B8B2517107100114B96 /* ValidatorDictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ValidatorDictionary.swift; path = Core/ValidatorDictionary.swift; sourceTree = SOURCE_ROOT; }; + 288B8B8C2517107100114B96 /* Validatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Validatable.swift; path = Core/Validatable.swift; sourceTree = SOURCE_ROOT; }; + 288B8B8D2517107100114B96 /* Validator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Validator.swift; path = Core/Validator.swift; sourceTree = SOURCE_ROOT; }; + 288B8B982517110700114B96 /* SwiftValidatorTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SwiftValidatorTests-Bridging-Header.h"; sourceTree = ""; }; + 288B8B9C2517110800114B96 /* LinuxMain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LinuxMain.swift; path = Tests/LinuxMain.swift; sourceTree = SOURCE_ROOT; }; + 288B8BA12517112200114B96 /* SwiftValidatorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftValidatorTests.swift; path = Tests/SwiftValidatorTests/SwiftValidatorTests.swift; sourceTree = SOURCE_ROOT; }; + 288B8BA22517112200114B96 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Tests/SwiftValidatorTests/Info.plist; sourceTree = SOURCE_ROOT; }; + 288B8BA32517112300114B96 /* XCTestManifests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = XCTestManifests.swift; path = Tests/SwiftValidatorTests/XCTestManifests.swift; sourceTree = SOURCE_ROOT; }; 62D1AE1B1A1E6D4400E4DFF8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 62D1AE1C1A1E6D4400E4DFF8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 62D1AE1E1A1E6D4400E4DFF8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -33,7 +99,6 @@ 62D1AE2C1A1E6D4500E4DFF8 /* ValidatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ValidatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; FB465CB31B9884F400398388 /* SwiftValidator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftValidator.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FB465CBD1B9884F400398388 /* SwiftValidatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftValidatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - FB465CC51B9884F400398388 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,93 +127,125 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 62D1AE0E1A1E6D4400E4DFF8 = { + 288B8B1725170F0F00114B96 /* Sources */ = { isa = PBXGroup; children = ( - 288B8AF0251709B400114B96 /* Package.swift */, - 288B8AE4251705D600114B96 /* Sources */, - 288B8AE3251705CE00114B96 /* Tests */, - 62D1AE191A1E6D4400E4DFF8 /* Validator */, - 62D1AE2F1A1E6D4500E4DFF8 /* ValidatorTests */, - FB465CB41B9884F400398388 /* SwiftValidator */, - FB465CC31B9884F400398388 /* SwiftValidatorTests */, - 62D1AE181A1E6D4400E4DFF8 /* Products */, + 288B8B5B25170FED00114B96 /* SwiftValidator */, ); + path = Sources; sourceTree = ""; }; - 62D1AE181A1E6D4400E4DFF8 /* Products */ = { + 288B8B1E25170F4C00114B96 /* Rules */ = { isa = PBXGroup; children = ( - 62D1AE2C1A1E6D4500E4DFF8 /* ValidatorTests.xctest */, - FB465CB31B9884F400398388 /* SwiftValidator.framework */, - FB465CBD1B9884F400398388 /* SwiftValidatorTests.xctest */, - ); - name = Products; + 288B8B1F25170F4C00114B96 /* FullNameRule.swift */, + 288B8B2025170F4C00114B96 /* CardExpiryYearRule.swift */, + 288B8B2125170F4C00114B96 /* CharacterSetRule.swift */, + 288B8B2225170F4C00114B96 /* PasswordRule.swift */, + 288B8B2325170F4C00114B96 /* ExactLengthRule.swift */, + 288B8B2425170F4C00114B96 /* ConfirmRule.swift */, + 288B8B2525170F4C00114B96 /* MinLengthRule.swift */, + 288B8B2625170F4C00114B96 /* FloatRule.swift */, + 288B8B2725170F4C00114B96 /* MaxLengthRule.swift */, + 288B8B2825170F4C00114B96 /* CardExpiryMonthRule.swift */, + 288B8B2925170F4C00114B96 /* RegexRule.swift */, + 288B8B2A25170F4C00114B96 /* ZipCodeRule.swift */, + 288B8B2B25170F4C00114B96 /* HexColorRule.swift */, + 288B8B2C25170F4C00114B96 /* EmailRule.swift */, + 288B8B2D25170F4C00114B96 /* AlphaNumericRule.swift */, + 288B8B2E25170F4C00114B96 /* PhoneNumberRule.swift */, + 288B8B2F25170F4C00114B96 /* Rule.swift */, + 288B8B3025170F4C00114B96 /* RequiredRule.swift */, + 288B8B3125170F4C00114B96 /* IPV4Rule.swift */, + 288B8B3225170F4C00114B96 /* ValidationRule.swift */, + 288B8B3325170F4C00114B96 /* AlphaRule.swift */, + 288B8B3425170F4C00114B96 /* ISBNRule.swift */, + ); + path = Rules; sourceTree = ""; }; - 62D1AE191A1E6D4400E4DFF8 /* Validator */ = { + 288B8B5B25170FED00114B96 /* SwiftValidator */ = { isa = PBXGroup; children = ( - 62D1AE1C1A1E6D4400E4DFF8 /* AppDelegate.swift */, - 62D1AE1E1A1E6D4400E4DFF8 /* ViewController.swift */, - 62D1AE201A1E6D4400E4DFF8 /* Main.storyboard */, - 62D1AE231A1E6D4400E4DFF8 /* Images.xcassets */, - 62D1AE251A1E6D4400E4DFF8 /* LaunchScreen.xib */, - 62D1AE1A1A1E6D4400E4DFF8 /* Supporting Files */, + 288B8B882517104400114B96 /* Core */, + 288B8B1D25170F4800114B96 /* Info.plist */, + 288B8B802517102F00114B96 /* SwiftValidator.swift */, + 288B8B7B2517102600114B96 /* SwiftValidator.h */, + 288B8B1E25170F4C00114B96 /* Rules */, ); - path = Validator; + path = SwiftValidator; sourceTree = ""; }; - 62D1AE1A1A1E6D4400E4DFF8 /* Supporting Files */ = { + 288B8B882517104400114B96 /* Core */ = { isa = PBXGroup; children = ( - 62D1AE1B1A1E6D4400E4DFF8 /* Info.plist */, + 288B8B8C2517107100114B96 /* Validatable.swift */, + 288B8B892517107100114B96 /* ValidationDelegate.swift */, + 288B8B8A2517107100114B96 /* ValidationError.swift */, + 288B8B8D2517107100114B96 /* Validator.swift */, + 288B8B8B2517107100114B96 /* ValidatorDictionary.swift */, ); - name = "Supporting Files"; + path = Core; sourceTree = ""; }; - 62D1AE2F1A1E6D4500E4DFF8 /* ValidatorTests */ = { + 288B8B96251710D200114B96 /* Tests */ = { isa = PBXGroup; children = ( - 62D1AE301A1E6D4500E4DFF8 /* Supporting Files */, + 288B8B9C2517110800114B96 /* LinuxMain.swift */, + 288B8B97251710DC00114B96 /* SwiftValidatorTests */, + 288B8B982517110700114B96 /* SwiftValidatorTests-Bridging-Header.h */, ); - path = ValidatorTests; + path = Tests; sourceTree = ""; }; - 62D1AE301A1E6D4500E4DFF8 /* Supporting Files */ = { + 288B8B97251710DC00114B96 /* SwiftValidatorTests */ = { isa = PBXGroup; children = ( + 288B8BA22517112200114B96 /* Info.plist */, + 288B8BA12517112200114B96 /* SwiftValidatorTests.swift */, + 288B8BA32517112300114B96 /* XCTestManifests.swift */, ); - name = "Supporting Files"; + path = SwiftValidatorTests; sourceTree = ""; }; - FB465CB41B9884F400398388 /* SwiftValidator */ = { + 62D1AE0E1A1E6D4400E4DFF8 = { isa = PBXGroup; children = ( - FB465CB51B9884F400398388 /* Supporting Files */, + 288B8B96251710D200114B96 /* Tests */, + 288B8B1725170F0F00114B96 /* Sources */, + 288B8AF0251709B400114B96 /* Package.swift */, + 62D1AE191A1E6D4400E4DFF8 /* Validator */, + 62D1AE181A1E6D4400E4DFF8 /* Products */, ); - path = SwiftValidator; sourceTree = ""; }; - FB465CB51B9884F400398388 /* Supporting Files */ = { + 62D1AE181A1E6D4400E4DFF8 /* Products */ = { isa = PBXGroup; children = ( + 62D1AE2C1A1E6D4500E4DFF8 /* ValidatorTests.xctest */, + FB465CB31B9884F400398388 /* SwiftValidator.framework */, + FB465CBD1B9884F400398388 /* SwiftValidatorTests.xctest */, ); - name = "Supporting Files"; + name = Products; sourceTree = ""; }; - FB465CC31B9884F400398388 /* SwiftValidatorTests */ = { + 62D1AE191A1E6D4400E4DFF8 /* Validator */ = { isa = PBXGroup; children = ( - FB465CC41B9884F400398388 /* Supporting Files */, + 62D1AE1C1A1E6D4400E4DFF8 /* AppDelegate.swift */, + 62D1AE1E1A1E6D4400E4DFF8 /* ViewController.swift */, + 62D1AE201A1E6D4400E4DFF8 /* Main.storyboard */, + 62D1AE231A1E6D4400E4DFF8 /* Images.xcassets */, + 62D1AE251A1E6D4400E4DFF8 /* LaunchScreen.xib */, + 62D1AE1A1A1E6D4400E4DFF8 /* Supporting Files */, ); - path = SwiftValidatorTests; + path = Validator; sourceTree = ""; }; - FB465CC41B9884F400398388 /* Supporting Files */ = { + 62D1AE1A1A1E6D4400E4DFF8 /* Supporting Files */ = { isa = PBXGroup; children = ( - FB465CC51B9884F400398388 /* Info.plist */, + 62D1AE1B1A1E6D4400E4DFF8 /* Info.plist */, ); name = "Supporting Files"; sourceTree = ""; @@ -160,6 +257,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 288B8B7C2517102900114B96 /* SwiftValidator.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -241,7 +339,7 @@ }; FB465CBC1B9884F400398388 = { CreatedOnToolsVersion = 6.4; - LastSwiftMigration = 1020; + LastSwiftMigration = 1200; TestTargetID = 62D1AE161A1E6D4400E4DFF8; }; }; @@ -285,6 +383,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 288B8BA52517112300114B96 /* Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -302,6 +401,34 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 288B8B692517100B00114B96 /* PasswordRule.swift in Sources */, + 288B8B702517100B00114B96 /* MinLengthRule.swift in Sources */, + 288B8B712517100B00114B96 /* CharacterSetRule.swift in Sources */, + 288B8B652517100B00114B96 /* FloatRule.swift in Sources */, + 288B8B922517107100114B96 /* Validator.swift in Sources */, + 288B8B902517107100114B96 /* ValidatorDictionary.swift in Sources */, + 288B8B682517100B00114B96 /* RegexRule.swift in Sources */, + 288B8B812517102F00114B96 /* SwiftValidator.swift in Sources */, + 288B8B6A2517100B00114B96 /* Rule.swift in Sources */, + 288B8B6B2517100B00114B96 /* MaxLengthRule.swift in Sources */, + 288B8B5C2517100100114B96 /* FullNameRule.swift in Sources */, + 288B8B912517107100114B96 /* Validatable.swift in Sources */, + 288B8B6C2517100B00114B96 /* ZipCodeRule.swift in Sources */, + 288B8B672517100B00114B96 /* EmailRule.swift in Sources */, + 288B8B8F2517107100114B96 /* ValidationError.swift in Sources */, + 288B8B662517100B00114B96 /* ValidationRule.swift in Sources */, + 288B8B602517100400114B96 /* CardExpiryYearRule.swift in Sources */, + 288B8B732517100B00114B96 /* ConfirmRule.swift in Sources */, + 288B8B752517100B00114B96 /* CardExpiryMonthRule.swift in Sources */, + 288B8B772517100B00114B96 /* RequiredRule.swift in Sources */, + 288B8B722517100B00114B96 /* IPV4Rule.swift in Sources */, + 288B8B8E2517107100114B96 /* ValidationDelegate.swift in Sources */, + 288B8B6D2517100B00114B96 /* AlphaNumericRule.swift in Sources */, + 288B8B6E2517100B00114B96 /* HexColorRule.swift in Sources */, + 288B8B642517100B00114B96 /* ExactLengthRule.swift in Sources */, + 288B8B762517100B00114B96 /* PhoneNumberRule.swift in Sources */, + 288B8B6F2517100B00114B96 /* ISBNRule.swift in Sources */, + 288B8B742517100B00114B96 /* AlphaRule.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -309,6 +436,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 288B8BA42517112300114B96 /* SwiftValidatorTests.swift in Sources */, + 288B8B9D2517110800114B96 /* LinuxMain.swift in Sources */, + 288B8BA62517112300114B96 /* XCTestManifests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -532,6 +662,8 @@ FB465CCE1B9884F400398388 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", @@ -547,6 +679,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.levous.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Tests/SwiftValidatorTests-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Validator.app/Validator"; }; @@ -555,6 +689,8 @@ FB465CCF1B9884F400398388 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; FRAMEWORK_SEARCH_PATHS = ( @@ -567,6 +703,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.levous.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Tests/SwiftValidatorTests-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Validator.app/Validator"; From cc9c6c9920220a6872e63e300613e62b68f37e5e Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 22:42:53 -0600 Subject: [PATCH 07/19] SPM Support -Added iOS version. -Added dependency. --- Package.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 93080d8..76ef882 100644 --- a/Package.swift +++ b/Package.swift @@ -5,6 +5,7 @@ import PackageDescription let package = Package( name: "SwiftValidator", + platforms: [.iOS(.v8)], products: [ // Products define the executables and libraries produced by a package, and make them visible to other packages. .library( @@ -20,7 +21,7 @@ let package = Package( // Targets can depend on other targets in this package, and on products in packages which this package depends on. .target( name: "SwiftValidator", - dependencies: []), + dependencies: ["UIKit"]), .testTarget( name: "SwiftValidatorTests", dependencies: ["SwiftValidator"]), From d38d9b2d5b9d5cccf90510d8363b1b5977208d7e Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 22:46:19 -0600 Subject: [PATCH 08/19] SPM Support -UIKit --- Core/Validatable.swift | 1 + Package.swift | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/Validatable.swift b/Core/Validatable.swift index 4778f3a..1fd7d14 100644 --- a/Core/Validatable.swift +++ b/Core/Validatable.swift @@ -7,6 +7,7 @@ // import Foundation +import UIKit public typealias ValidatableField = AnyObject & Validatable diff --git a/Package.swift b/Package.swift index 76ef882..ce8acbf 100644 --- a/Package.swift +++ b/Package.swift @@ -21,7 +21,7 @@ let package = Package( // Targets can depend on other targets in this package, and on products in packages which this package depends on. .target( name: "SwiftValidator", - dependencies: ["UIKit"]), + dependencies: []), .testTarget( name: "SwiftValidatorTests", dependencies: ["SwiftValidator"]), From 10bd9a36065e8b02606637d318280d61243d5ddc Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 23:03:22 -0600 Subject: [PATCH 09/19] SPM Support -UIKit import. --- Sources/SwiftValidator/SwiftValidator.h | 2 +- Sources/SwiftValidator/SwiftValidator.swift | 4 +--- Validator.xcodeproj/project.pbxproj | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Sources/SwiftValidator/SwiftValidator.h b/Sources/SwiftValidator/SwiftValidator.h index ad88bfb..a2fb612 100644 --- a/Sources/SwiftValidator/SwiftValidator.h +++ b/Sources/SwiftValidator/SwiftValidator.h @@ -6,7 +6,7 @@ // Copyright (c) 2015 jpotts18. All rights reserved. // -#import +@import Foundation; //! Project version number for SwiftValidator. FOUNDATION_EXPORT double SwiftValidatorVersionNumber; diff --git a/Sources/SwiftValidator/SwiftValidator.swift b/Sources/SwiftValidator/SwiftValidator.swift index 18a5f89..7c3ce7f 100644 --- a/Sources/SwiftValidator/SwiftValidator.swift +++ b/Sources/SwiftValidator/SwiftValidator.swift @@ -1,3 +1 @@ -struct SwiftValidator { - var text = "Hello, World!" -} +let version = "5.1.0" diff --git a/Validator.xcodeproj/project.pbxproj b/Validator.xcodeproj/project.pbxproj index 75da46d..47190f9 100644 --- a/Validator.xcodeproj/project.pbxproj +++ b/Validator.xcodeproj/project.pbxproj @@ -167,11 +167,11 @@ 288B8B5B25170FED00114B96 /* SwiftValidator */ = { isa = PBXGroup; children = ( + 288B8B1E25170F4C00114B96 /* Rules */, 288B8B882517104400114B96 /* Core */, 288B8B1D25170F4800114B96 /* Info.plist */, 288B8B802517102F00114B96 /* SwiftValidator.swift */, 288B8B7B2517102600114B96 /* SwiftValidator.h */, - 288B8B1E25170F4C00114B96 /* Rules */, ); path = SwiftValidator; sourceTree = ""; From fc7e1e198c1c1675bb6c6f4e31bb7d1a9779cc8d Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 23:06:24 -0600 Subject: [PATCH 10/19] SPM Support -Removed Foundation import. --- Core/Validatable.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Core/Validatable.swift b/Core/Validatable.swift index 1fd7d14..c9fef2a 100644 --- a/Core/Validatable.swift +++ b/Core/Validatable.swift @@ -6,7 +6,6 @@ // Copyright © 2016 jpotts18. All rights reserved. // -import Foundation import UIKit public typealias ValidatableField = AnyObject & Validatable From 3aaa003a8d167f63fcc5b70da33a9989e8d96cb3 Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 23:10:26 -0600 Subject: [PATCH 11/19] SPM Support -Fixed files references --- .../SwiftValidator/Core}/Validatable.swift | 0 .../SwiftValidator/Core}/ValidationDelegate.swift | 0 .../SwiftValidator/Core}/ValidationError.swift | 0 {Core => Sources/SwiftValidator/Core}/Validator.swift | 0 .../SwiftValidator/Core}/ValidatorDictionary.swift | 0 Validator.xcodeproj/project.pbxproj | 10 +++++----- 6 files changed, 5 insertions(+), 5 deletions(-) rename {Core => Sources/SwiftValidator/Core}/Validatable.swift (100%) rename {Core => Sources/SwiftValidator/Core}/ValidationDelegate.swift (100%) rename {Core => Sources/SwiftValidator/Core}/ValidationError.swift (100%) rename {Core => Sources/SwiftValidator/Core}/Validator.swift (100%) rename {Core => Sources/SwiftValidator/Core}/ValidatorDictionary.swift (100%) diff --git a/Core/Validatable.swift b/Sources/SwiftValidator/Core/Validatable.swift similarity index 100% rename from Core/Validatable.swift rename to Sources/SwiftValidator/Core/Validatable.swift diff --git a/Core/ValidationDelegate.swift b/Sources/SwiftValidator/Core/ValidationDelegate.swift similarity index 100% rename from Core/ValidationDelegate.swift rename to Sources/SwiftValidator/Core/ValidationDelegate.swift diff --git a/Core/ValidationError.swift b/Sources/SwiftValidator/Core/ValidationError.swift similarity index 100% rename from Core/ValidationError.swift rename to Sources/SwiftValidator/Core/ValidationError.swift diff --git a/Core/Validator.swift b/Sources/SwiftValidator/Core/Validator.swift similarity index 100% rename from Core/Validator.swift rename to Sources/SwiftValidator/Core/Validator.swift diff --git a/Core/ValidatorDictionary.swift b/Sources/SwiftValidator/Core/ValidatorDictionary.swift similarity index 100% rename from Core/ValidatorDictionary.swift rename to Sources/SwiftValidator/Core/ValidatorDictionary.swift diff --git a/Validator.xcodeproj/project.pbxproj b/Validator.xcodeproj/project.pbxproj index 47190f9..946a44c 100644 --- a/Validator.xcodeproj/project.pbxproj +++ b/Validator.xcodeproj/project.pbxproj @@ -80,11 +80,11 @@ 288B8B3425170F4C00114B96 /* ISBNRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ISBNRule.swift; sourceTree = ""; }; 288B8B7B2517102600114B96 /* SwiftValidator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftValidator.h; sourceTree = ""; }; 288B8B802517102F00114B96 /* SwiftValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftValidator.swift; sourceTree = ""; }; - 288B8B892517107100114B96 /* ValidationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ValidationDelegate.swift; path = Core/ValidationDelegate.swift; sourceTree = SOURCE_ROOT; }; - 288B8B8A2517107100114B96 /* ValidationError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ValidationError.swift; path = Core/ValidationError.swift; sourceTree = SOURCE_ROOT; }; - 288B8B8B2517107100114B96 /* ValidatorDictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ValidatorDictionary.swift; path = Core/ValidatorDictionary.swift; sourceTree = SOURCE_ROOT; }; - 288B8B8C2517107100114B96 /* Validatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Validatable.swift; path = Core/Validatable.swift; sourceTree = SOURCE_ROOT; }; - 288B8B8D2517107100114B96 /* Validator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Validator.swift; path = Core/Validator.swift; sourceTree = SOURCE_ROOT; }; + 288B8B892517107100114B96 /* ValidationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ValidationDelegate.swift; path = Sources/SwiftValidator/Core/ValidationDelegate.swift; sourceTree = SOURCE_ROOT; }; + 288B8B8A2517107100114B96 /* ValidationError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ValidationError.swift; path = Sources/SwiftValidator/Core/ValidationError.swift; sourceTree = SOURCE_ROOT; }; + 288B8B8B2517107100114B96 /* ValidatorDictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ValidatorDictionary.swift; path = Sources/SwiftValidator/Core/ValidatorDictionary.swift; sourceTree = SOURCE_ROOT; }; + 288B8B8C2517107100114B96 /* Validatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Validatable.swift; path = Sources/SwiftValidator/Core/Validatable.swift; sourceTree = SOURCE_ROOT; }; + 288B8B8D2517107100114B96 /* Validator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Validator.swift; path = Sources/SwiftValidator/Core/Validator.swift; sourceTree = SOURCE_ROOT; }; 288B8B982517110700114B96 /* SwiftValidatorTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SwiftValidatorTests-Bridging-Header.h"; sourceTree = ""; }; 288B8B9C2517110800114B96 /* LinuxMain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LinuxMain.swift; path = Tests/LinuxMain.swift; sourceTree = SOURCE_ROOT; }; 288B8BA12517112200114B96 /* SwiftValidatorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftValidatorTests.swift; path = Tests/SwiftValidatorTests/SwiftValidatorTests.swift; sourceTree = SOURCE_ROOT; }; From f11573182a504a8b80fc058867719560b081edfc Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 23:15:44 -0600 Subject: [PATCH 12/19] SPM Support -Removed unused files. --- .../contents.xcworkspacedata | 7 + SwiftValidatorTests/Info.plist | 24 - SwiftValidatorTests/SwiftValidatorTests.swift | 486 ------------------ 3 files changed, 7 insertions(+), 510 deletions(-) create mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata delete mode 100644 SwiftValidatorTests/Info.plist delete mode 100644 SwiftValidatorTests/SwiftValidatorTests.swift diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SwiftValidatorTests/Info.plist b/SwiftValidatorTests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/SwiftValidatorTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/SwiftValidatorTests/SwiftValidatorTests.swift b/SwiftValidatorTests/SwiftValidatorTests.swift deleted file mode 100644 index 4672e21..0000000 --- a/SwiftValidatorTests/SwiftValidatorTests.swift +++ /dev/null @@ -1,486 +0,0 @@ -// -// SwiftValidatorTests.swift -// SwiftValidatorTests -// -// Created by Jeff Potter on 11/20/14. -// Copyright (c) 2014 jpotts18. All rights reserved. -// - -import UIKit -import XCTest -import Validator // example app -import SwiftValidator // framework - -class SwiftValidatorTests: XCTestCase { - - let USERNAME_REGEX = "^[a-z0-9_-]{3,16}$" - - let VALID_ZIP = "12345" - let INVALID_ZIP = "1234" - - let VALID_EMAIL = "jiggy@gmail.com" - let INVALID_EMAIL = "This is not a valid email" - - let CONFIRM_TXT_FIELD = UITextField() - let CONFIRM_TEXT = "Confirm this!" - let CONFIRM_TEXT_DIFF = "I am not the same as the string above" - - let VALID_PASSWORD = "Super$ecret" - let INVALID_PASSWORD = "abc" - - let VALID_FLOAT = "1234.444" - let INVALID_FLOAT = "1234.44.44" - - let VALID_CARD_EXPIRY_MONTH = "10" - let INVALID_CARD_EXPIRY_MONTH = "13" - - let VALID_CARD_EXPIRY_YEAR = "2018" - let INVALID_CARD_EXPIRY_YEAR = "2016" - - let LEN_3 = "hey" - let LEN_5 = "Howdy" - let LEN_20 = "Paint the cat orange" - - let REGISTER_TXT_VIEW = UITextView() - let REGISTER_TXT_FIELD = UITextField() - let REGISTER_VALIDATOR = Validator() - let REGISTER_RULES = [Rule]() - - let UNREGISTER_TXT_FIELD = UITextField() - let UNREGISTER_VALIDATOR = Validator() - let UNREGISTER_RULES = [Rule]() - - let UNREGISTER_ERRORS_TXT_FIELD = UITextField() - let UNREGISTER_ERRORS_VALIDATOR = Validator() - - let ERROR_LABEL = UILabel() - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - - // MARK: Expiry Month - - func testCardExpiryMonthValid() { - XCTAssertTrue(CardExpiryMonthRule().validate(VALID_CARD_EXPIRY_MONTH), "Expiry month Should be valid") - } - - func testCardExpiryMonthInvalid() { - XCTAssertFalse(CardExpiryMonthRule().validate(INVALID_CARD_EXPIRY_MONTH), "Expiry month Should be invalid") - } - - func testCardExpiryMonthmessage() { - XCTAssertNotNil(CardExpiryMonthRule().errorMessage()) - } - - // MARK: Expiry Year - - func testCardExpiryYearValid() { - XCTAssertTrue(CardExpiryYearRule().validate(VALID_CARD_EXPIRY_YEAR), "Expiry year Should be valid") - } - - func testCardExpiryYearInvalid() { - XCTAssertFalse(CardExpiryYearRule().validate(INVALID_CARD_EXPIRY_YEAR), "Expiry year Should be invalid") - } - - func testCardExpiryYearmessage() { - XCTAssertNotNil(CardExpiryYearRule().errorMessage()) - } - - - // MARK: Required - - func testRequired() { - XCTAssertTrue(RequiredRule().validate("Something"), "Required should be valid") - } - - func testRequiredInvalid() { - XCTAssertFalse(RequiredRule().validate(""), "Required should be invalid") - } - - func testRequiredMessage() { - XCTAssertNotNil(RequiredRule().errorMessage()) - } - - // MARK: Regex - - func testRegex(){ - XCTAssertTrue(RegexRule(regex: USERNAME_REGEX).validate("darth_vader8"), "RegexRule should be valid") - } - - func testRegexInvalid(){ - XCTAssertFalse(RegexRule(regex: USERNAME_REGEX).validate("DarthVader"), "RegexRule should be invalid") - } - - func testRegexMessage() { - XCTAssertNotNil(RegexRule(regex: USERNAME_REGEX).errorMessage()) - } - - // MARK: Zipcode - - func testZipCode() { - XCTAssertTrue(ZipCodeRule().validate(VALID_ZIP), "Zipcode should be valid") - } - - func testZipCodeInvalid() { - XCTAssertFalse(ZipCodeRule().validate(INVALID_ZIP), "Zipcode should be invalid") - } - - func testZipCodeMessage() { - XCTAssertNotNil(ZipCodeRule().errorMessage()) - } - - // MARK: Email - - func testEmail() { - XCTAssertTrue(EmailRule().validate(VALID_EMAIL), "Email should be valid") - } - - func testEmailInvalid() { - XCTAssertFalse(EmailRule().validate(INVALID_EMAIL), "Email should be invalid") - } - - func testEmailMessage() { - XCTAssertNotNil(EmailRule().errorMessage()) - } - - // MARK: Float - - func testFloat() { - XCTAssert(FloatRule().validate(VALID_FLOAT), "Float should be valid") - } - - func testFloatInvalid() { - XCTAssert(!FloatRule().validate(INVALID_FLOAT), "Float should be invalid") - XCTAssert(!FloatRule().validate(VALID_EMAIL), "Float should be invalid") - } - - func testFloatMessage() { - XCTAssertNotNil(FloatRule().errorMessage()) - } - - // MARK: Confirm against field - - func testConfirmSame(){ - CONFIRM_TXT_FIELD.text = CONFIRM_TEXT - XCTAssertTrue(ConfirmationRule(confirmField: CONFIRM_TXT_FIELD).validate(CONFIRM_TEXT), "Should confirm successfully") - } - - func testConfirmDifferent() { - CONFIRM_TXT_FIELD.text = CONFIRM_TEXT - XCTAssertFalse(ConfirmationRule(confirmField: CONFIRM_TXT_FIELD).validate(CONFIRM_TEXT_DIFF), "Should fail confirm") - } - - func testConfirmMessage() { - CONFIRM_TXT_FIELD.text = CONFIRM_TEXT - XCTAssertNotNil(ConfirmationRule(confirmField: CONFIRM_TXT_FIELD).errorMessage()) - } - - // MARK: Password - - func testPassword() { - XCTAssertTrue(PasswordRule().validate(VALID_PASSWORD), "Password should be valid") - } - - func testPasswordInvalid(){ - XCTAssertFalse(PasswordRule().validate(INVALID_PASSWORD), "Password is invalid") - } - - func testPasswordMessage() { - XCTAssertNotNil(PasswordRule().errorMessage()) - } - - func testPhoneNumber() { - XCTAssertTrue(PhoneNumberRule().validate("1234567890"), "Phone number should valid") - } - - func testPhoneNumberInvalid() { - XCTAssertFalse(PhoneNumberRule().validate("12345678901"), "Phone number should be invalid") - } - - func testPhoneNumberMessage() { - XCTAssertNotNil(PhoneNumberRule().errorMessage()) - } - - // MARK: Max Length - - func testMaxLength(){ - XCTAssertTrue(MaxLengthRule().validate(LEN_3),"Max Length should be valid") - } - - func testMaxLengthInvalid(){ - XCTAssertFalse(MaxLengthRule().validate(LEN_20),"Max Length should be invalid") - } - - func testMaxLengthParameterAndGreaterThan(){ - XCTAssertTrue(MaxLengthRule(length: 20).validate(LEN_20), "Max Length should be 20 and <= length") - } - - func testMaxLengthMessage() { - XCTAssertNotNil(MaxLengthRule(length: 20).errorMessage()) - } - - // MARK: Min Length - func testMinLength(){ - XCTAssertTrue(MinLengthRule().validate(LEN_3),"Min Length should be valid") - } - - func testMinLengthInvalid(){ - XCTAssertFalse(MinLengthRule().validate("no"),"Min Length should be Invalid") - } - - func testMinLengthWithParameter(){ - XCTAssertTrue(MinLengthRule(length: 5).validate(LEN_5), "Min Len should be set to 5 and >= length") - } - - func testMinLengthMessage() { - XCTAssertNotNil(MinLengthRule(length: 5).errorMessage()) - } - - func testExactLength(){ - XCTAssertTrue(ExactLengthRule(length: 5).validate(LEN_5), "Exact Len should be exactly 5") - } - - func testExactLengthInvalidGreaterThan(){ - XCTAssertFalse(ExactLengthRule(length: 6).validate(LEN_5), "Exact Len should be Invalid") - } - - func testExactLengthInvalidLessThan(){ - XCTAssertFalse(ExactLengthRule(length: 4).validate(LEN_5), "Exact Len should be Invalid") - } - - func testExactLengthMessage() { - XCTAssertNotNil(ExactLengthRule(length: 4).errorMessage()) - } - - // MARK: Full Name - - func testFullName(){ - XCTAssertTrue(FullNameRule().validate("Jeff Potter"), "Full Name should be valid") - } - - func testFullNameWith3Names(){ - XCTAssertTrue(FullNameRule().validate("Jeff Van Buren"), "Full Name should be valid") - } - - func testFullNameInvalid(){ - XCTAssertFalse(FullNameRule().validate("Carl"), "Full Name should be invalid") - } - - // MARK: ISBN - - func testValidISBN10() { - let validISBN10 = ["3836221195", "3-8362-2119-5", "3 8362 2119 5" , "1617290858", "1-61729-085-8", "1 61729 085-8" , "0007269706", "0-00-726970-6", "0 00 726970 6" , "3423214120", "3-423-21412-0", "3 423 21412 0", "340101319X", "3-401-01319-X", "3 401 01319 X"] - - for ISBN10 in validISBN10 { - XCTAssertTrue(ISBNRule().validate(ISBN10), "\(ISBN10) should be valid") - } - } - - func testInvalidISBN10() { - let invalidISBN10 = ["3423214121", "3-423-21412-1", "3 423 21412 1"] - - for ISBN10 in invalidISBN10 { - XCTAssertFalse(ISBNRule().validate(ISBN10), "\(ISBN10) should be invalid") - } - } - - // MARK: HexColor - - func testValidHexColors() { - let validHexes = ["#ff0034", "#CCCCCC", "fff", "#f00"] - for hex in validHexes { - XCTAssertTrue(HexColorRule().validate(hex), "\(hex) should be a valid Hex") - } - } - - func testInvalidHexColors() { - let validHexes = ["#ff", "fff0", "#ff12FG", ""] - for hex in validHexes { - XCTAssertFalse(HexColorRule().validate(hex), "\(hex) should be invalid Hex") - } - } - - //MARK: IPV4 - - func testValidIPV4() { - let validIPV4 = ["127.0.0.1" , "0.0.0.0" , "255.255.255.255" , "1.2.3.4"] - for ipv4 in validIPV4 { - XCTAssertTrue(IPV4Rule().validate(ipv4), "\(ipv4) should be a valid IPV4 address") - } - } - - func testInvalidIPV4() { - let invalidIPV4 = ["::1" , "2001:db8:0000:1:1:1:1:1" , "::ffff:127.0.0.1"] - for ipv4 in invalidIPV4 { - XCTAssertFalse(IPV4Rule().validate(ipv4), "\(ipv4) should be invalid IPV4 address") - } - } - - //MARK: AlphaNumeric - - func testValidAlphaNumeric() { - let validAlphaNumeric = ["abc123", "A1B2C35555"] - for alphaNum in validAlphaNumeric { - XCTAssertTrue(AlphaNumericRule().validate(alphaNum), "\(alphaNum) should be a valid alpha numeric string") - } - } - - func testInvalidAlphaNumeric() { - let invalidAlphaNumeric = ["abc ", "!!!!!", "ABC@DAGQW%!^$@%"] - for alphaNum in invalidAlphaNumeric { - XCTAssertFalse(AlphaNumericRule().validate(alphaNum), "\(alphaNum) should be invalid alpha numeric string") - } - } - - //MARK: Alpha - - func testValidAlpha() { - let validAlphaStrings = ["abc", "ABCDEFG", "AabeVsDvaW"] - for alpha in validAlphaStrings { - XCTAssertTrue(AlphaRule().validate(alpha), "\(alpha) should be valid alpha string") - } - } - - func testInvalidAlpha() { - let invalidAlphaStrings = ["abc1", " foo "] - for alpha in invalidAlphaStrings { - XCTAssertFalse(AlphaRule().validate(alpha), "\(alpha) should be invalid alpha string") - } - } - - // MARK: Register Field - func testRegisterTextView(){ - REGISTER_VALIDATOR.registerField(REGISTER_TXT_VIEW, rules: REGISTER_RULES) - XCTAssert(REGISTER_VALIDATOR.validations[REGISTER_TXT_VIEW] != nil, "Textfield should register") - } - - func testRegisterTextField(){ - REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, rules: REGISTER_RULES) - XCTAssert(REGISTER_VALIDATOR.validations[REGISTER_TXT_FIELD] != nil, "Textfield should register") - } - - func testUnregisterTextField(){ - UNREGISTER_VALIDATOR.registerField(UNREGISTER_TXT_FIELD, rules: UNREGISTER_RULES) - UNREGISTER_VALIDATOR.unregisterField(UNREGISTER_TXT_FIELD) - XCTAssert(UNREGISTER_VALIDATOR.validations[UNREGISTER_TXT_FIELD] == nil, "Textfield should unregister") - } - - func testUnregisterError(){ - UNREGISTER_ERRORS_VALIDATOR.registerField(UNREGISTER_ERRORS_TXT_FIELD, rules: [EmailRule()]) - UNREGISTER_ERRORS_TXT_FIELD.text = INVALID_EMAIL - UNREGISTER_ERRORS_VALIDATOR.validate { (errors) -> Void in - XCTAssert(errors.count == 1, "Should come back with errors") - } - UNREGISTER_ERRORS_VALIDATOR.unregisterField(UNREGISTER_ERRORS_TXT_FIELD) - UNREGISTER_ERRORS_VALIDATOR.validate { (errors) -> Void in - XCTAssert(errors.count == 0, "Should not come back with errors") - } - } - - // MARK: Validate Functions - - func testValidateWithCallback() { - REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, rules: [EmailRule()]) - REGISTER_TXT_FIELD.text = VALID_EMAIL - REGISTER_VALIDATOR.validate { (errors) -> Void in - XCTAssert(errors.count == 0, "Should not come back with errors") - } - REGISTER_TXT_FIELD.text = INVALID_EMAIL - REGISTER_VALIDATOR.validate { (errors) -> Void in - XCTAssert(errors.count == 1, "Should come back with 1 error") - } - } - - func testValidateSingleField() { - REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, rules: [EmailRule()]) - REGISTER_TXT_FIELD.text = VALID_EMAIL - REGISTER_VALIDATOR.validateField(REGISTER_TXT_FIELD) { error in - XCTAssert(error == nil, "Should not present error") - } - REGISTER_TXT_FIELD.text = INVALID_EMAIL - REGISTER_VALIDATOR.validateField(REGISTER_TXT_FIELD) { error in - XCTAssert(error?.errorMessage.characters.count ?? 0 > 0, "Should state 'invalid email'") - } - } - - func testValidateTextViewField() { - REGISTER_VALIDATOR.registerField(REGISTER_TXT_VIEW, rules: [RequiredRule()]) - REGISTER_TXT_VIEW.text = "Some notes" - REGISTER_VALIDATOR.validateField(REGISTER_TXT_VIEW) { error in - XCTAssert(error == nil, "Should not present error") - } - REGISTER_TXT_VIEW.text = nil - REGISTER_VALIDATOR.validateField(REGISTER_TXT_VIEW) { error in - XCTAssert(error!.errorMessage == "This field is required") - } - } - - // MARK: Validate error field gets it's text set to the error, if supplied - - func testNoErrorMessageSet() { - REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, errorLabel: ERROR_LABEL, rules: [EmailRule()]) - REGISTER_TXT_FIELD.text = VALID_EMAIL - REGISTER_VALIDATOR.validate { (errors) -> Void in - XCTAssert(errors.count == 0, "Should not come back with errors") - } - } - - func testErrorMessageSet() { - REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, errorLabel: ERROR_LABEL, rules: [EmailRule()]) - var successCount = 0 - var errorCount = 0 - REGISTER_VALIDATOR.styleTransformers(success: { (validationRule) -> Void in - successCount+=1 - }) { (validationError) -> Void in - errorCount+=1 - } - REGISTER_TXT_FIELD.text = INVALID_EMAIL - REGISTER_VALIDATOR.validate { (errors) -> Void in - XCTAssert(errors.count == 1, "Should come back with errors") - XCTAssert(errorCount == 1, "Should have called the error style transform once") - XCTAssert(successCount == 0, "Should not have called the success style transform as there are no successful fields") - } - } - - func testErrorMessageSetAndThenUnset() { - REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, errorLabel: ERROR_LABEL, rules: [EmailRule()]) - - var successCount = 0 - var errorCount = 0 - REGISTER_VALIDATOR.styleTransformers(success: { (validationRule) -> Void in - successCount+=1 - }) { (validationError) -> Void in - errorCount+=1 - } - - REGISTER_TXT_FIELD.text = INVALID_EMAIL - REGISTER_VALIDATOR.validate { (errors) -> Void in - XCTAssert(errors.count == 1, "Should come back with errors") - XCTAssert(errorCount == 1, "Should have called the error style transform once") - XCTAssert(successCount == 0, "Should not have called the success style transform as there are no successful fields") - self.REGISTER_TXT_FIELD.text = self.VALID_EMAIL - self.REGISTER_VALIDATOR.validate { (errors) -> Void in - XCTAssert(errors.count == 0, "Should not come back with errors: \(errors)") - XCTAssert(successCount == 1, "Should have called the success style transform once") - XCTAssert(errorCount == 1, "Should not have called the error style transform again") - } - } - } - - func testTextFieldBorderColorNotSet() { - REGISTER_VALIDATOR.registerField(REGISTER_TXT_FIELD, errorLabel: ERROR_LABEL, rules: [EmailRule()]) - REGISTER_TXT_FIELD.text = INVALID_EMAIL - REGISTER_VALIDATOR.validate { (errors) -> Void in - XCTAssert(errors.count == 1, "Should come back with errors") - XCTAssert(!(self.REGISTER_TXT_FIELD.layer.borderColor! == UIColor.red.cgColor), "Color shouldn't get set at all") - } - } -} From 391d0350683673095f44d73e6f264ad3c0413a0e Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 23:18:49 -0600 Subject: [PATCH 13/19] SPM Support -Fixed folder references. --- Validator.xcodeproj/project.pbxproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Validator.xcodeproj/project.pbxproj b/Validator.xcodeproj/project.pbxproj index 946a44c..2abb80f 100644 --- a/Validator.xcodeproj/project.pbxproj +++ b/Validator.xcodeproj/project.pbxproj @@ -80,11 +80,11 @@ 288B8B3425170F4C00114B96 /* ISBNRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ISBNRule.swift; sourceTree = ""; }; 288B8B7B2517102600114B96 /* SwiftValidator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftValidator.h; sourceTree = ""; }; 288B8B802517102F00114B96 /* SwiftValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftValidator.swift; sourceTree = ""; }; - 288B8B892517107100114B96 /* ValidationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ValidationDelegate.swift; path = Sources/SwiftValidator/Core/ValidationDelegate.swift; sourceTree = SOURCE_ROOT; }; - 288B8B8A2517107100114B96 /* ValidationError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ValidationError.swift; path = Sources/SwiftValidator/Core/ValidationError.swift; sourceTree = SOURCE_ROOT; }; - 288B8B8B2517107100114B96 /* ValidatorDictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ValidatorDictionary.swift; path = Sources/SwiftValidator/Core/ValidatorDictionary.swift; sourceTree = SOURCE_ROOT; }; - 288B8B8C2517107100114B96 /* Validatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Validatable.swift; path = Sources/SwiftValidator/Core/Validatable.swift; sourceTree = SOURCE_ROOT; }; - 288B8B8D2517107100114B96 /* Validator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Validator.swift; path = Sources/SwiftValidator/Core/Validator.swift; sourceTree = SOURCE_ROOT; }; + 288B8B892517107100114B96 /* ValidationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationDelegate.swift; sourceTree = ""; }; + 288B8B8A2517107100114B96 /* ValidationError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationError.swift; sourceTree = ""; }; + 288B8B8B2517107100114B96 /* ValidatorDictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidatorDictionary.swift; sourceTree = ""; }; + 288B8B8C2517107100114B96 /* Validatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Validatable.swift; sourceTree = ""; }; + 288B8B8D2517107100114B96 /* Validator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Validator.swift; sourceTree = ""; }; 288B8B982517110700114B96 /* SwiftValidatorTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SwiftValidatorTests-Bridging-Header.h"; sourceTree = ""; }; 288B8B9C2517110800114B96 /* LinuxMain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LinuxMain.swift; path = Tests/LinuxMain.swift; sourceTree = SOURCE_ROOT; }; 288B8BA12517112200114B96 /* SwiftValidatorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftValidatorTests.swift; path = Tests/SwiftValidatorTests/SwiftValidatorTests.swift; sourceTree = SOURCE_ROOT; }; From c7f017f9f558d4a3382615e859f8eb1de7ac6042 Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sat, 19 Sep 2020 23:58:40 -0600 Subject: [PATCH 14/19] SPM Support -Added SPM to README.md file. --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 79e3c7b..a8e4c91 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,12 @@ If you are using Carthage you will need to add this to your `Cartfile` github "jpotts18/SwiftValidator" ``` +If you are using Swift Package Manager you need to add this to your dependencies. + +```bash +https://github.com/SwiftValidatorCommunity/SwiftValidator +``` + ## Usage You can now import SwiftValidator framework into your files. From 74a529500c7de2d545aff2ffd0e05fefd2230f4a Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sun, 20 Sep 2020 00:37:28 -0600 Subject: [PATCH 15/19] SPM support Updated Xcode version. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 46ffccd..b4b0e6e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: objective-c -osx_image: xcode10.1 +osx_image: xcode11 xcode_sdk: iphonesimulator10.0 xcode_project: Validator.xcodeproj xcode_scheme: Validator From 751712c6c713c318eb6eb106233009ceeed079a3 Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sun, 20 Sep 2020 00:47:47 -0600 Subject: [PATCH 16/19] SPM support Removed invalid parameters. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b4b0e6e..cd18a5f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ xcode_scheme: Validator before_install: - gem install cocoapods -v '0.32.1' - - gem install xcpretty --no-rdoc --no-ri --no-document --quiet + - gem install xcpretty --no-document --quiet script: - xcodebuild clean build test -project Validator.xcodeproj -scheme Validator -sdk iphonesimulator -destination "platform=iOS Simulator,OS=10.0,name=iPhone 6" -enableCodeCoverage YES CODE_SIGNING_REQUIRED=NO | xcpretty From 03d3964c54b245e305ee9d0c242bcc7b932b1cf9 Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sun, 20 Sep 2020 00:53:05 -0600 Subject: [PATCH 17/19] SPM Update iOS version for testing. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index cd18a5f..82032b4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: objective-c osx_image: xcode11 -xcode_sdk: iphonesimulator10.0 +xcode_sdk: iphonesimulator11.0 xcode_project: Validator.xcodeproj xcode_scheme: Validator From fe2beb410f8242e0f52e2c2003e73d8a251d8554 Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sun, 20 Sep 2020 00:57:07 -0600 Subject: [PATCH 18/19] SPM support iOS version for testing. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 82032b4..682c5c4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: objective-c osx_image: xcode11 -xcode_sdk: iphonesimulator11.0 +xcode_sdk: iphonesimulator11.0.1 xcode_project: Validator.xcodeproj xcode_scheme: Validator @@ -9,7 +9,7 @@ before_install: - gem install xcpretty --no-document --quiet script: - - xcodebuild clean build test -project Validator.xcodeproj -scheme Validator -sdk iphonesimulator -destination "platform=iOS Simulator,OS=10.0,name=iPhone 6" -enableCodeCoverage YES CODE_SIGNING_REQUIRED=NO | xcpretty + - xcodebuild clean build test -project Validator.xcodeproj -scheme Validator -sdk iphonesimulator -destination "platform=iOS Simulator,OS=11.0.1,name=iPhone 6" -enableCodeCoverage YES CODE_SIGNING_REQUIRED=NO | xcpretty - pod lib lint after_success: From 46627946c63daef29140c1fe901ec8bd2c7d9e1c Mon Sep 17 00:00:00 2001 From: Lester Batres Date: Sun, 20 Sep 2020 11:00:07 -0600 Subject: [PATCH 19/19] SPM Support -Fixed test target. --- Tests/LinuxMain.swift | 7 - .../SwiftValidatorTests.swift | 6 +- Validator.xcodeproj/project.pbxproj | 152 +++++++----------- .../xcschemes/SwiftValidator.xcscheme | 22 ++- 4 files changed, 67 insertions(+), 120 deletions(-) delete mode 100644 Tests/LinuxMain.swift diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift deleted file mode 100644 index 9e383f1..0000000 --- a/Tests/LinuxMain.swift +++ /dev/null @@ -1,7 +0,0 @@ -import XCTest - -import SwiftValidatorTests - -var tests = [XCTestCaseEntry]() -tests += SwiftValidatorTests.allTests() -XCTMain(tests) diff --git a/Tests/SwiftValidatorTests/SwiftValidatorTests.swift b/Tests/SwiftValidatorTests/SwiftValidatorTests.swift index 4672e21..816310d 100644 --- a/Tests/SwiftValidatorTests/SwiftValidatorTests.swift +++ b/Tests/SwiftValidatorTests/SwiftValidatorTests.swift @@ -8,8 +8,6 @@ import UIKit import XCTest -import Validator // example app -import SwiftValidator // framework class SwiftValidatorTests: XCTestCase { @@ -34,7 +32,7 @@ class SwiftValidatorTests: XCTestCase { let VALID_CARD_EXPIRY_MONTH = "10" let INVALID_CARD_EXPIRY_MONTH = "13" - let VALID_CARD_EXPIRY_YEAR = "2018" + let VALID_CARD_EXPIRY_YEAR = "2021" let INVALID_CARD_EXPIRY_YEAR = "2016" let LEN_3 = "hey" @@ -407,7 +405,7 @@ class SwiftValidatorTests: XCTestCase { } REGISTER_TXT_FIELD.text = INVALID_EMAIL REGISTER_VALIDATOR.validateField(REGISTER_TXT_FIELD) { error in - XCTAssert(error?.errorMessage.characters.count ?? 0 > 0, "Should state 'invalid email'") + XCTAssert(error?.errorMessage.count ?? 0 > 0, "Should state 'invalid email'") } } diff --git a/Validator.xcodeproj/project.pbxproj b/Validator.xcodeproj/project.pbxproj index 2abb80f..4879765 100644 --- a/Validator.xcodeproj/project.pbxproj +++ b/Validator.xcodeproj/project.pbxproj @@ -7,6 +7,33 @@ objects = { /* Begin PBXBuildFile section */ + 2858C0CE2517C07D0087C315 /* ValidatorDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B8B2517107100114B96 /* ValidatorDictionary.swift */; }; + 2858C0CF2517C07D0087C315 /* Validatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B8C2517107100114B96 /* Validatable.swift */; }; + 2858C0D02517C07D0087C315 /* ValidationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B892517107100114B96 /* ValidationDelegate.swift */; }; + 2858C0D12517C07D0087C315 /* Validator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B8D2517107100114B96 /* Validator.swift */; }; + 2858C0D22517C07D0087C315 /* ValidationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B8A2517107100114B96 /* ValidationError.swift */; }; + 2858C0D52517C0880087C315 /* ZipCodeRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2A25170F4C00114B96 /* ZipCodeRule.swift */; }; + 2858C0D62517C0880087C315 /* AlphaNumericRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2D25170F4C00114B96 /* AlphaNumericRule.swift */; }; + 2858C0D72517C0880087C315 /* EmailRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2C25170F4C00114B96 /* EmailRule.swift */; }; + 2858C0D82517C0880087C315 /* Rule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2F25170F4C00114B96 /* Rule.swift */; }; + 2858C0D92517C0880087C315 /* CharacterSetRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2125170F4C00114B96 /* CharacterSetRule.swift */; }; + 2858C0DA2517C0880087C315 /* CardExpiryMonthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2825170F4C00114B96 /* CardExpiryMonthRule.swift */; }; + 2858C0DB2517C0880087C315 /* RegexRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2925170F4C00114B96 /* RegexRule.swift */; }; + 2858C0DC2517C0880087C315 /* RequiredRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B3025170F4C00114B96 /* RequiredRule.swift */; }; + 2858C0DD2517C0880087C315 /* IPV4Rule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B3125170F4C00114B96 /* IPV4Rule.swift */; }; + 2858C0DE2517C0880087C315 /* AlphaRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B3325170F4C00114B96 /* AlphaRule.swift */; }; + 2858C0DF2517C0880087C315 /* CardExpiryYearRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2025170F4C00114B96 /* CardExpiryYearRule.swift */; }; + 2858C0E02517C0880087C315 /* HexColorRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2B25170F4C00114B96 /* HexColorRule.swift */; }; + 2858C0E12517C0880087C315 /* MinLengthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2525170F4C00114B96 /* MinLengthRule.swift */; }; + 2858C0E22517C0880087C315 /* ISBNRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B3425170F4C00114B96 /* ISBNRule.swift */; }; + 2858C0E32517C0880087C315 /* PasswordRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2225170F4C00114B96 /* PasswordRule.swift */; }; + 2858C0E42517C0880087C315 /* ExactLengthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2325170F4C00114B96 /* ExactLengthRule.swift */; }; + 2858C0E52517C0880087C315 /* FloatRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2625170F4C00114B96 /* FloatRule.swift */; }; + 2858C0E62517C0880087C315 /* PhoneNumberRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2E25170F4C00114B96 /* PhoneNumberRule.swift */; }; + 2858C0E72517C0880087C315 /* ValidationRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B3225170F4C00114B96 /* ValidationRule.swift */; }; + 2858C0E82517C0880087C315 /* FullNameRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B1F25170F4C00114B96 /* FullNameRule.swift */; }; + 2858C0E92517C0880087C315 /* MaxLengthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2725170F4C00114B96 /* MaxLengthRule.swift */; }; + 2858C0EA2517C0880087C315 /* ConfirmRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2425170F4C00114B96 /* ConfirmRule.swift */; }; 288B8B5C2517100100114B96 /* FullNameRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B1F25170F4C00114B96 /* FullNameRule.swift */; }; 288B8B602517100400114B96 /* CardExpiryYearRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2025170F4C00114B96 /* CardExpiryYearRule.swift */; }; 288B8B642517100B00114B96 /* ExactLengthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B2325170F4C00114B96 /* ExactLengthRule.swift */; }; @@ -36,9 +63,7 @@ 288B8B902517107100114B96 /* ValidatorDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B8B2517107100114B96 /* ValidatorDictionary.swift */; }; 288B8B912517107100114B96 /* Validatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B8C2517107100114B96 /* Validatable.swift */; }; 288B8B922517107100114B96 /* Validator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B8D2517107100114B96 /* Validator.swift */; }; - 288B8B9D2517110800114B96 /* LinuxMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8B9C2517110800114B96 /* LinuxMain.swift */; }; 288B8BA42517112300114B96 /* SwiftValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8BA12517112200114B96 /* SwiftValidatorTests.swift */; }; - 288B8BA52517112300114B96 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 288B8BA22517112200114B96 /* Info.plist */; }; 288B8BA62517112300114B96 /* XCTestManifests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288B8BA32517112300114B96 /* XCTestManifests.swift */; }; FB465CBE1B9884F400398388 /* SwiftValidator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB465CB31B9884F400398388 /* SwiftValidator.framework */; }; /* End PBXBuildFile section */ @@ -86,7 +111,6 @@ 288B8B8C2517107100114B96 /* Validatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Validatable.swift; sourceTree = ""; }; 288B8B8D2517107100114B96 /* Validator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Validator.swift; sourceTree = ""; }; 288B8B982517110700114B96 /* SwiftValidatorTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SwiftValidatorTests-Bridging-Header.h"; sourceTree = ""; }; - 288B8B9C2517110800114B96 /* LinuxMain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LinuxMain.swift; path = Tests/LinuxMain.swift; sourceTree = SOURCE_ROOT; }; 288B8BA12517112200114B96 /* SwiftValidatorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftValidatorTests.swift; path = Tests/SwiftValidatorTests/SwiftValidatorTests.swift; sourceTree = SOURCE_ROOT; }; 288B8BA22517112200114B96 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Tests/SwiftValidatorTests/Info.plist; sourceTree = SOURCE_ROOT; }; 288B8BA32517112300114B96 /* XCTestManifests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = XCTestManifests.swift; path = Tests/SwiftValidatorTests/XCTestManifests.swift; sourceTree = SOURCE_ROOT; }; @@ -96,19 +120,11 @@ 62D1AE211A1E6D4400E4DFF8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 62D1AE231A1E6D4400E4DFF8 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 62D1AE261A1E6D4400E4DFF8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 62D1AE2C1A1E6D4500E4DFF8 /* ValidatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ValidatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; FB465CB31B9884F400398388 /* SwiftValidator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftValidator.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FB465CBD1B9884F400398388 /* SwiftValidatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftValidatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 62D1AE291A1E6D4500E4DFF8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; FB465CAF1B9884F400398388 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -191,7 +207,6 @@ 288B8B96251710D200114B96 /* Tests */ = { isa = PBXGroup; children = ( - 288B8B9C2517110800114B96 /* LinuxMain.swift */, 288B8B97251710DC00114B96 /* SwiftValidatorTests */, 288B8B982517110700114B96 /* SwiftValidatorTests-Bridging-Header.h */, ); @@ -222,7 +237,6 @@ 62D1AE181A1E6D4400E4DFF8 /* Products */ = { isa = PBXGroup; children = ( - 62D1AE2C1A1E6D4500E4DFF8 /* ValidatorTests.xctest */, FB465CB31B9884F400398388 /* SwiftValidator.framework */, FB465CBD1B9884F400398388 /* SwiftValidatorTests.xctest */, ); @@ -264,23 +278,6 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 62D1AE2B1A1E6D4500E4DFF8 /* ValidatorTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 62D1AE391A1E6D4500E4DFF8 /* Build configuration list for PBXNativeTarget "ValidatorTests" */; - buildPhases = ( - 62D1AE281A1E6D4500E4DFF8 /* Sources */, - 62D1AE291A1E6D4500E4DFF8 /* Frameworks */, - 62D1AE2A1A1E6D4500E4DFF8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ValidatorTests; - productName = ValidatorTests; - productReference = 62D1AE2C1A1E6D4500E4DFF8 /* ValidatorTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; FB465CB21B9884F400398388 /* SwiftValidator */ = { isa = PBXNativeTarget; buildConfigurationList = FB465CD01B9884F400398388 /* Build configuration list for PBXNativeTarget "SwiftValidator" */; @@ -328,11 +325,6 @@ LastUpgradeCheck = 0930; ORGANIZATIONNAME = jpotts18; TargetAttributes = { - 62D1AE2B1A1E6D4500E4DFF8 = { - CreatedOnToolsVersion = 6.1; - LastSwiftMigration = 0820; - TestTargetID = 62D1AE161A1E6D4400E4DFF8; - }; FB465CB21B9884F400398388 = { CreatedOnToolsVersion = 6.4; LastSwiftMigration = 1020; @@ -340,7 +332,6 @@ FB465CBC1B9884F400398388 = { CreatedOnToolsVersion = 6.4; LastSwiftMigration = 1200; - TestTargetID = 62D1AE161A1E6D4400E4DFF8; }; }; }; @@ -357,7 +348,6 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 62D1AE2B1A1E6D4500E4DFF8 /* ValidatorTests */, FB465CB21B9884F400398388 /* SwiftValidator */, FB465CBC1B9884F400398388 /* SwiftValidatorTests */, ); @@ -365,13 +355,6 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 62D1AE2A1A1E6D4500E4DFF8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; FB465CB11B9884F400398388 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -383,20 +366,12 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 288B8BA52517112300114B96 /* Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 62D1AE281A1E6D4500E4DFF8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; FB465CAE1B9884F400398388 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -436,9 +411,35 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 2858C0DB2517C0880087C315 /* RegexRule.swift in Sources */, + 2858C0D62517C0880087C315 /* AlphaNumericRule.swift in Sources */, + 2858C0DE2517C0880087C315 /* AlphaRule.swift in Sources */, + 2858C0E22517C0880087C315 /* ISBNRule.swift in Sources */, + 2858C0CF2517C07D0087C315 /* Validatable.swift in Sources */, + 2858C0CE2517C07D0087C315 /* ValidatorDictionary.swift in Sources */, 288B8BA42517112300114B96 /* SwiftValidatorTests.swift in Sources */, - 288B8B9D2517110800114B96 /* LinuxMain.swift in Sources */, + 2858C0E92517C0880087C315 /* MaxLengthRule.swift in Sources */, + 2858C0E32517C0880087C315 /* PasswordRule.swift in Sources */, + 2858C0E12517C0880087C315 /* MinLengthRule.swift in Sources */, + 2858C0DC2517C0880087C315 /* RequiredRule.swift in Sources */, + 2858C0EA2517C0880087C315 /* ConfirmRule.swift in Sources */, + 2858C0D72517C0880087C315 /* EmailRule.swift in Sources */, + 2858C0DF2517C0880087C315 /* CardExpiryYearRule.swift in Sources */, + 2858C0E82517C0880087C315 /* FullNameRule.swift in Sources */, + 2858C0D12517C07D0087C315 /* Validator.swift in Sources */, + 2858C0D92517C0880087C315 /* CharacterSetRule.swift in Sources */, + 2858C0E62517C0880087C315 /* PhoneNumberRule.swift in Sources */, + 2858C0D22517C07D0087C315 /* ValidationError.swift in Sources */, + 2858C0E02517C0880087C315 /* HexColorRule.swift in Sources */, + 2858C0E52517C0880087C315 /* FloatRule.swift in Sources */, + 2858C0DA2517C0880087C315 /* CardExpiryMonthRule.swift in Sources */, + 2858C0DD2517C0880087C315 /* IPV4Rule.swift in Sources */, 288B8BA62517112300114B96 /* XCTestManifests.swift in Sources */, + 2858C0D82517C0880087C315 /* Rule.swift in Sources */, + 2858C0D52517C0880087C315 /* ZipCodeRule.swift in Sources */, + 2858C0E72517C0880087C315 /* ValidationRule.swift in Sources */, + 2858C0D02517C07D0087C315 /* ValidationDelegate.swift in Sources */, + 2858C0E42517C0880087C315 /* ExactLengthRule.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -575,36 +576,6 @@ }; name = Release; }; - 62D1AE3A1A1E6D4500E4DFF8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ENABLE_MODULES = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = ValidatorTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "me.jeffpotter.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Validator.app/Validator"; - }; - name = Debug; - }; - 62D1AE3B1A1E6D4500E4DFF8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ENABLE_MODULES = YES; - INFOPLIST_FILE = ValidatorTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "me.jeffpotter.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Validator.app/Validator"; - }; - name = Release; - }; FB465CCC1B9884F400398388 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -674,7 +645,7 @@ "DEBUG=1", "$(inherited)", ); - INFOPLIST_FILE = SwiftValidatorTests/Info.plist; + INFOPLIST_FILE = Tests/SwiftValidatorTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.levous.$(PRODUCT_NAME:rfc1034identifier)"; @@ -682,7 +653,6 @@ SWIFT_OBJC_BRIDGING_HEADER = "Tests/SwiftValidatorTests-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Validator.app/Validator"; }; name = Debug; }; @@ -698,7 +668,7 @@ "$(inherited)", ); GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = SwiftValidatorTests/Info.plist; + INFOPLIST_FILE = Tests/SwiftValidatorTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.levous.$(PRODUCT_NAME:rfc1034identifier)"; @@ -706,7 +676,6 @@ SWIFT_OBJC_BRIDGING_HEADER = "Tests/SwiftValidatorTests-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Validator.app/Validator"; }; name = Release; }; @@ -722,15 +691,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 62D1AE391A1E6D4500E4DFF8 /* Build configuration list for PBXNativeTarget "ValidatorTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 62D1AE3A1A1E6D4500E4DFF8 /* Debug */, - 62D1AE3B1A1E6D4500E4DFF8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; FB465CD01B9884F400398388 /* Build configuration list for PBXNativeTarget "SwiftValidator" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Validator.xcodeproj/xcshareddata/xcschemes/SwiftValidator.xcscheme b/Validator.xcodeproj/xcshareddata/xcschemes/SwiftValidator.xcscheme index d6ae464..ba12fd2 100644 --- a/Validator.xcodeproj/xcshareddata/xcschemes/SwiftValidator.xcscheme +++ b/Validator.xcodeproj/xcshareddata/xcschemes/SwiftValidator.xcscheme @@ -41,6 +41,15 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> + + + + @@ -53,17 +62,6 @@ - - - - - - - -