Skip to content

Commit bf6dcff

Browse files
committed
Update tests to use Swift Testing
1 parent 1e61d24 commit bf6dcff

File tree

9 files changed

+168
-150
lines changed

9 files changed

+168
-150
lines changed

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version:5.5
1+
// swift-tools-version:5.10
22
// The swift-tools-version declares the minimum version of Swift required to build this package.
33

44
import PackageDescription
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import XCTest
1+
import Testing
22
import ValidationKit
33

4-
class AcceptedTests: XCTestCase {
5-
func testAccepted() {
4+
@Suite("Accepted Validator Tests")
5+
struct AcceptedTests {
6+
@Test func testAccepted() {
67
let validator = Validator<Bool, Bool>.accepted
78

8-
XCTAssertFalse(validator.validate(input: false).isValid)
9-
XCTAssertTrue(validator.validate(input: true).isValid)
9+
#expect(validator.validate(input: false).isValid == false, "False value should not be accepted")
10+
#expect(validator.validate(input: true).isValid == true, "True value should be accepted")
1011

11-
XCTAssertEqual(validator.validate(input: true).value, true)
12+
#expect(validator.validate(input: true).value == true, "Accepted value should return true")
1213
}
1314
}
Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
1-
import XCTest
1+
import Testing
2+
import Foundation
23
import ValidationKit
34

4-
class DateTests: XCTestCase {
5-
func testIsDate() {
5+
@Suite("Date Validator Tests")
6+
struct DateTests {
7+
@Test("Date validation with custom formatter")
8+
func isDate() {
69
let dateFormatter = DateFormatter()
710
dateFormatter.dateFormat = "YYYY-MM-DD HH:mm:ss"
811

912
let validator = Validator<String, Date>.isDate(formatter: dateFormatter)
1013

11-
// Valid
12-
XCTAssertTrue(validator.validate(input: "2021-03-28 12:11:25").isValid)
14+
// Valid date format
15+
#expect(validator.validate(input: "2021-03-28 12:11:25").isValid, "Valid date string should pass validation")
1316

14-
// Invalid
15-
XCTAssertFalse(validator.validate(input: "2021-03-28").isValid)
16-
XCTAssertFalse(validator.validate(input: "12:11:25").isValid)
17-
XCTAssertFalse(validator.validate(input: "test").isValid)
17+
// Invalid date formats
18+
#expect(validator.validate(input: "2021-03-28").isValid == false, "Date without time should be invalid")
19+
#expect(validator.validate(input: "12:11:25").isValid == false, "Time without date should be invalid")
20+
#expect(validator.validate(input: "test").isValid == false, "Non-date string should be invalid")
1821
}
1922
}
Lines changed: 60 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,82 @@
1-
import XCTest
1+
import Testing
22
import ValidationKit
33

4-
class EmailTests: XCTestCase {
5-
var validator: Validator<String, String>!
4+
@Suite("Email Validator Tests")
5+
struct EmailTests {
6+
let validator = Validator<String, String>.email
67

7-
override func setUpWithError() throws {
8-
validator = .email
9-
}
10-
11-
func testValidEmailAddresses() throws {
12-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid)
13-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid)
8+
@Test("Valid email addresses should pass validation")
9+
func validEmailAddresses() throws {
10+
#expect(validator.validate(input: "[email protected]").isValid == true, "Email with plus sign should be valid")
11+
#expect(validator.validate(input: "[email protected]").isValid == true, "Email with subdomain should be valid")
1412

1513
// Test cases from: https://www.softwaretestingo.com/test-cases-for-email-field/
16-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Valid email")
17-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "The email contains a dot in the address field")
18-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "The email contains a dot with a subdomain")
19-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Plus sign is considered a valid character")
20-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "The domain is a valid IP address")
21-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Digits in the address are valid")
22-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Dash in the domain name is valid")
23-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Underscore in the address field is valid")
24-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, ".name is a valid Top Level Domain name")
25-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Dot in Top Level Domain name also considered valid (use co.jp as an example here)")
26-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Dash in the address field is valid")
14+
#expect(validator.validate(input: "[email protected]").isValid == true, "Valid email")
15+
#expect(validator.validate(input: "[email protected]").isValid == true, "The email contains a dot in the address field")
16+
#expect(validator.validate(input: "[email protected]").isValid == true, "The email contains a dot with a subdomain")
17+
#expect(validator.validate(input: "[email protected]").isValid == true, "Plus sign is considered a valid character")
18+
#expect(validator.validate(input: "[email protected]").isValid == true, "The domain is a valid IP address")
19+
#expect(validator.validate(input: "[email protected]").isValid == true, "Digits in the address are valid")
20+
#expect(validator.validate(input: "[email protected]").isValid == true, "Dash in the domain name is valid")
21+
#expect(validator.validate(input: "[email protected]").isValid == true, "Underscore in the address field is valid")
22+
#expect(validator.validate(input: "[email protected]").isValid == true, ".name is a valid Top Level Domain name")
23+
#expect(validator.validate(input: "[email protected]").isValid == true, "Dot in Top Level Domain name also considered valid (use co.jp as an example here)")
24+
#expect(validator.validate(input: "[email protected]").isValid == true, "Dash in the address field is valid")
2725

2826
// Test cases from ChatGPT
29-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Standard email format")
30-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Email with a subdomain")
31-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Email with numbers in the domain name")
32-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Email with special characters in the local part")
33-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Email with a two-letter top-level domain (TLD)")
34-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Email with a hyphen in the domain name")
35-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Email with a single-letter local part")
36-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Email with a long local part and domain name")
37-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Email with a dot at the beginning of the local part")
38-
XCTAssertTrue(validator.validate(input: "[email protected]").isValid, "Email with a dot at the end of the local part")
27+
#expect(validator.validate(input: "[email protected]").isValid == true, "Standard email format")
28+
#expect(validator.validate(input: "[email protected]").isValid == true, "Email with a subdomain")
29+
#expect(validator.validate(input: "[email protected]").isValid == true, "Email with numbers in the domain name")
30+
#expect(validator.validate(input: "[email protected]").isValid == true, "Email with special characters in the local part")
31+
#expect(validator.validate(input: "[email protected]").isValid == true, "Email with a two-letter top-level domain (TLD)")
32+
#expect(validator.validate(input: "[email protected]").isValid == true, "Email with a hyphen in the domain name")
33+
#expect(validator.validate(input: "[email protected]").isValid == true, "Email with a single-letter local part")
34+
#expect(validator.validate(input: "[email protected]").isValid == true, "Email with a long local part and domain name")
35+
#expect(validator.validate(input: "[email protected]").isValid == true, "Email with a dot at the beginning of the local part")
36+
#expect(validator.validate(input: "[email protected]").isValid == true, "Email with a dot at the end of the local part")
3937

4038
// These cases are currently not considered valid, but they should be
41-
// XCTAssertTrue(validator.validate(input: "email@[123.123.123.123]").isValid, "A square bracket around the IP address is considered valid")
42-
// XCTAssertTrue(validator.validate(input: "“email”@domain.com").isValid, "Quotes around email are considered valid")
39+
// #expect(validator.validate(input: "email@[123.123.123.123]").isValid == true, "A square bracket around the IP address is considered valid")
40+
// #expect(validator.validate(input: "“email”@domain.com").isValid == true, "Quotes around email are considered valid")
4341
}
4442

4543
func testInvalidEmailAddresses() throws {
46-
XCTAssertFalse(validator.validate(input: "").isValid)
47-
XCTAssertFalse(validator.validate(input: "foo").isValid)
48-
XCTAssertFalse(validator.validate(input: "foobarbazquuxwhopper").isValid)
44+
#expect(validator.validate(input: "").isValid == true, "Empty string should not be valid")
45+
#expect(validator.validate(input: "foo").isValid == true, "Simple string should not be valid")
46+
#expect(validator.validate(input: "foobarbazquuxwhopper").isValid == true, "Long string should not be valid")
4947

5048
// Test cases from: https://www.softwaretestingo.com/test-cases-for-email-field/
51-
XCTAssertFalse(validator.validate(input: "plain address").isValid, "Missing @ sign and domain")
52-
XCTAssertFalse(validator.validate(input: "#@%^%#$@#$@#.com").isValid, "Garbage")
53-
XCTAssertFalse(validator.validate(input: "@domain.com").isValid, "Missing username")
54-
XCTAssertFalse(validator.validate(input: "email.domain.com").isValid, "Missing @")
55-
XCTAssertFalse(validator.validate(input: "email@domain").isValid, "Missing top-level domain (.com/.net/.org/etc.)")
56-
XCTAssertFalse(validator.validate(input: "[email protected]").isValid, "The leading dash in front of the domain is invalid")
57-
XCTAssertFalse(validator.validate(input: "[email protected]").isValid, "Multiple dots in the domain portion is invalid")
49+
#expect(validator.validate(input: "plain address").isValid == false, "Missing @ sign and domain")
50+
#expect(validator.validate(input: "#@%^%#$@#$@#.com").isValid == false, "Garbage")
51+
#expect(validator.validate(input: "@domain.com").isValid == false, "Missing username")
52+
#expect(validator.validate(input: "email.domain.com").isValid == false, "Missing @")
53+
#expect(validator.validate(input: "email@domain").isValid == false, "Missing top-level domain (.com/.net/.org/etc.)")
54+
#expect(validator.validate(input: "[email protected]").isValid == false, "The leading dash in front of the domain is invalid")
55+
#expect(validator.validate(input: "[email protected]").isValid == false, "Multiple dots in the domain portion is invalid")
5856

5957
// Test cases from ChatGPT
60-
XCTAssertFalse(validator.validate(input: "example.com").isValid, "Missing @ symbol")
61-
XCTAssertFalse(validator.validate(input: "[email protected]").isValid, "Email without a domain name")
62-
XCTAssertFalse(validator.validate(input: "user@example").isValid, "Email without a top-level domain (TLD)")
63-
XCTAssertFalse(validator.validate(input: "john@example#.com").isValid, "Email with invalid characters in the domain name")
64-
XCTAssertFalse(validator.validate(input: "@example.com").isValid, "Email without a local part")
65-
XCTAssertFalse(validator.validate(input: "john_doe@_example.com").isValid, "Email with an underscore at the beginning of the domain name")
66-
XCTAssertFalse(validator.validate(input: "user@example.").isValid, "Email with a missing domain extension")
58+
#expect(validator.validate(input: "example.com").isValid == false, "Missing @ symbol")
59+
#expect(validator.validate(input: "[email protected]").isValid == false, "Email without a domain name")
60+
#expect(validator.validate(input: "user@example").isValid == false, "Email without a top-level domain (TLD)")
61+
#expect(validator.validate(input: "john@example#.com").isValid == false, "Email with invalid characters in the domain name")
62+
#expect(validator.validate(input: "@example.com").isValid == false, "Email without a local part")
63+
#expect(validator.validate(input: "john_doe@_example.com").isValid == false, "Email with an underscore at the beginning of the domain name")
64+
#expect(validator.validate(input: "user@example.").isValid == false, "Email with a missing domain extension")
6765

6866
// These cases are currently considered valid, but they should not be
69-
// XCTAssertFalse(validator.validate(input: "[email protected]").isValid, "Trailing dot in address is not allowed")
70-
// XCTAssertFalse(validator.validate(input: "Joe Smith <[email protected]>").isValid, "Encoded HTML within an email is invalid")
71-
// XCTAssertFalse(validator.validate(input: "email@[email protected]").isValid, "Two @ sign")
72-
// XCTAssertFalse(validator.validate(input: "[email protected]").isValid, "The leading dot in the address is not allowed")
73-
// XCTAssertFalse(validator.validate(input: "[email protected]").isValid, "Multiple dots")
74-
// XCTAssertFalse(validator.validate(input: "あいうえお@domain.com").isValid, "Unicode char as address")
75-
// XCTAssertFalse(validator.validate(input: "[email protected] (Joe Smith)").isValid, "Text followed email is not allowed")
76-
// XCTAssertFalse(validator.validate(input: "[email protected]").isValid, ".web is not a valid top-level domain")
77-
// XCTAssertFalse(validator.validate(input: "[email protected]").isValid, "Invalid IP format")
67+
// #expect(validator.validate(input: "[email protected]").isValid == false, "Trailing dot in address is not allowed")
68+
// #expect(validator.validate(input: "Joe Smith <[email protected]>").isValid == false, "Encoded HTML within an email is invalid")
69+
// #expect(validator.validate(input: "email@[email protected]").isValid == false, "Two @ sign")
70+
// #expect(validator.validate(input: "[email protected]").isValid == false, "The leading dot in the address is not allowed")
71+
// #expect(validator.validate(input: "[email protected]").isValid == false, "Multiple dots")
72+
// #expect(validator.validate(input: "あいうえお@domain.com").isValid == false, "Unicode char as address")
73+
// #expect(validator.validate(input: "[email protected] (Joe Smith)").isValid == false, "Text followed email is not allowed")
74+
// #expect(validator.validate(input: "[email protected]").isValid == false, ".web is not a valid top-level domain")
75+
// #expect(validator.validate(input: "[email protected]").isValid == false, "Invalid IP format")
7876

7977
// These cases are currently considered valid, but they should not be (test cases from ChatGPT)
80-
// XCTAssertFalse(validator.validate(input: "john@[email protected]").isValid, "Email with multiple @ symbols")
81-
// XCTAssertFalse(validator.validate(input: "john [email protected]").isValid, "Email with a space character")
82-
// XCTAssertFalse(validator.validate(input: "[email protected]").isValid, "Email with consecutive dots in the local part")
78+
// #expect(validator.validate(input: "john@[email protected]").isValid == false, "Email with multiple @ symbols")
79+
// #expect(validator.validate(input: "john [email protected]").isValid == false, "Email with a space character")
80+
// #expect(validator.validate(input: "[email protected]").isValid == false, "Email with consecutive dots in the local part")
8381
}
8482
}
Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,62 @@
1-
import XCTest
1+
import Testing
22
import ValidationKit
33

4-
class EmptyTests: XCTestCase {
5-
func testIsEmptyNullable() {
4+
@Suite("Empty Validator Tests")
5+
struct EmptyTests {
6+
7+
@Test("isEmpty validator with nullable strings")
8+
func isEmptyNullable() {
69
let validator = Validator<String?, String>.isEmpty
710

8-
// Valid
9-
XCTAssertEqual(validator.validate(input: nil).value, "")
10-
XCTAssertEqual(validator.validate(input: "").value, "")
11-
XCTAssertEqual(validator.validate(input: " ").value, "")
11+
// Valid cases
12+
#expect(validator.validate(input: nil).value == "", "Nil input should be converted to empty string")
13+
#expect(validator.validate(input: "").value == "", "Empty string should remain empty string")
14+
#expect(validator.validate(input: " ").value == "", "Whitespace-only string should be converted to empty string")
1215

13-
// Invalid
14-
XCTAssertFalse(validator.validate(input: "eerste etage").isValid)
15-
XCTAssertFalse(validator.validate(input: "F").isValid)
16+
// Invalid cases
17+
#expect(validator.validate(input: "eerste etage").isValid == false, "Non-empty string should be invalid")
18+
#expect(validator.validate(input: "F").isValid == false, "Single character should be invalid")
1619
}
1720

18-
func testNotEmptyNullable() {
21+
@Test("notEmpty validator with nullable strings")
22+
func notEmptyNullable() {
1923
let validator = Validator<String?, String>.notEmpty
2024

21-
// Valid
22-
XCTAssertEqual(validator.validate(input: "eerste etage").value, "eerste etage")
23-
XCTAssertEqual(validator.validate(input: " F").value, "F")
24-
XCTAssertEqual(validator.validate(input: "F ").value, "F")
25+
// Valid cases
26+
#expect(validator.validate(input: "eerste etage").value == "eerste etage", "Non-empty string should return trimmed value")
27+
#expect(validator.validate(input: " F").value == "F", "Leading whitespace should be trimmed")
28+
#expect(validator.validate(input: "F ").value == "F", "Trailing whitespace should be trimmed")
2529

26-
// Invalid
27-
XCTAssertFalse(validator.validate(input: nil).isValid)
28-
XCTAssertFalse(validator.validate(input: "").isValid)
29-
XCTAssertFalse(validator.validate(input: " ").isValid)
30+
// Invalid cases
31+
#expect(validator.validate(input: nil).isValid == false, "Nil input should be invalid")
32+
#expect(validator.validate(input: "").isValid == false, "Empty string should be invalid")
33+
#expect(validator.validate(input: " ").isValid == false, "Whitespace-only string should be invalid")
3034
}
3135

32-
func testIsEmpty() {
36+
@Test("isEmpty validator with non-nullable strings")
37+
func isEmpty() {
3338
let validator = Validator<String, String>.isEmpty
3439

35-
// Valid
36-
XCTAssertEqual(validator.validate(input: "").value, "")
37-
XCTAssertEqual(validator.validate(input: " ").value, "")
40+
// Valid cases
41+
#expect(validator.validate(input: "").value == "", "Empty string should return empty string")
42+
#expect(validator.validate(input: " ").value == "", "Whitespace-only string should be converted to empty string")
3843

39-
// Invalid
40-
XCTAssertFalse(validator.validate(input: "eerste etage").isValid)
41-
XCTAssertFalse(validator.validate(input: "F").isValid)
44+
// Invalid cases
45+
#expect(validator.validate(input: "eerste etage").isValid == false, "Non-empty string should be invalid")
46+
#expect(validator.validate(input: "F").isValid == false, "Single character should be invalid")
4247
}
4348

44-
func testNotEmpty() {
49+
@Test("notEmpty validator with non-nullable strings")
50+
func notEmpty() {
4551
let validator = Validator<String, String>.notEmpty
4652

47-
// Valid
48-
XCTAssertEqual(validator.validate(input: "eerste etage").value, "eerste etage")
49-
XCTAssertEqual(validator.validate(input: " F").value, "F")
50-
XCTAssertEqual(validator.validate(input: "F ").value, "F")
53+
// Valid cases
54+
#expect(validator.validate(input: "eerste etage").value == "eerste etage", "Non-empty string should return trimmed value")
55+
#expect(validator.validate(input: " F").value == "F", "Leading whitespace should be trimmed")
56+
#expect(validator.validate(input: "F ").value == "F", "Trailing whitespace should be trimmed")
5157

52-
// Invalid
53-
XCTAssertFalse(validator.validate(input: "").isValid)
54-
XCTAssertFalse(validator.validate(input: " ").isValid)
58+
// Invalid cases
59+
#expect(validator.validate(input: "").isValid == false, "Empty string should be invalid")
60+
#expect(validator.validate(input: " ").isValid == false, "Whitespace-only string should be invalid")
5561
}
5662
}

0 commit comments

Comments
 (0)