1import Foundation
23classPasswordGenerator {
4funcgenerate() -> String {
5letuppercaseLetter = String(Unicode.Scalar(65 + Int(arc4random_uniform(26)))!)
6letlowercaseLetter = String(Unicode.Scalar(97 + Int(arc4random_uniform(26)))!)
7letdigit = String(Int(arc4random_uniform(10)))
8letspecialCharacter = "!@#$%^&*()_+-=[]{}|;:'\",.<>?/`~"9letspecialChar = String(specialCharacter[specialCharacter.index(specialCharacter.startIndex, offsetBy: Int(arc4random_uniform(UInt32(specialCharacter.count))))])
1011varpassword = uppercaseLetter + lowercaseLetter + digit + specialChar
1213while password.count < 8 {
14letrandomChar = String(Unicode.Scalar(33 + Int(arc4random_uniform(94)))!)
15 password += randomChar
16 }
1718return password
19 }
20}
2122functest_password_has_at_least_eight_characters() {
23letsut = PasswordGenerator()
24letpassword = sut.generate()
25if password.count < 8 {
26fail("Password should have at least eight characters")
27 }
28}
2930functest_password_contains_at_least_one_uppercase_letter() {
31letsut = PasswordGenerator()
32letpassword = sut.generate()
33letuppercaseRange = password.rangeOfCharacter(from: .uppercaseLetters)
34if uppercaseRange == nil {
35fail("Password should contain at least one uppercase letter")
36 }
37}
3839functest_password_contains_at_least_one_lowercase_letter() {
40letsut = PasswordGenerator()
41letpassword = sut.generate()
42letlowercaseRange = password.rangeOfCharacter(from: .lowercaseLetters)
43if lowercaseRange == nil {
44fail("Password should contain at least one lowercase letter")
45 }
46}
4748functest_password_contains_at_least_one_digit() {
49letsut = PasswordGenerator()
50letpassword = sut.generate()
51letdigitRange = password.rangeOfCharacter(from: .decimalDigits)
52if digitRange == nil {
53fail("Password should contain at least one digit")
54 }
55}
5657functest_password_contains_at_least_one_special_character() {
58letsut = PasswordGenerator()
59letpassword = sut.generate()
60letspecialCharacters = CharacterSet(charactersIn: "!@#$%^&*()_+-=[]{}|;:'\",.<>?/`~")
61letspecialCharRange = password.rangeOfCharacter(from: specialCharacters)
62if specialCharRange == nil {
63fail("Password should contain at least one special character")
64 }
65}
6667functest_password_does_not_contain_spaces() {
68letsut = PasswordGenerator()
69letpassword = sut.generate()
70if password.contains(" ") {
71fail("Password should not contain spaces")
72 }
73}
7475functest_password_is_unique() {
76letsut = PasswordGenerator()
77letpassword1 = sut.generate()
78letpassword2 = sut.generate()
79if password1 == password2 {
80fail("Generated passwords should be unique")
81 }
82}
8384functest_password_meets_all_criteria() {
85letsut = PasswordGenerator()
86letpassword = sut.generate()
8788Comprueba que la contraseña tiene al menos una letra mayúscula89letuppercaseRange = password.rangeOfCharacter(from: .uppercaseLetters)
90if uppercaseRange == nil {
91fail("Password should contain at least one uppercase letter")
92 }
9394Comprueba que la contraseña tiene al menos una letra minúscula95letlowercaseRange = password.rangeOfCharacter(from: .lowercaseLetters)
96if lowercaseRange == nil {
97fail("Password should contain at least one lowercase letter")
98 }
99100Comprueba que la contraseña tiene al menos un dígito101letdigitRange = password.rangeOfCharacter(from: .decimalDigits)
102if digitRange == nil {
103fail("Password should contain at least one digit")
104 }
105106Comprueba que la contraseña tiene al menos un carácter especial107letspecialCharacters = CharacterSet(charactersIn: "!@#$%^&*()_+-=[]{}|;:'\",.<>?/`~")
108letspecialCharRange = password.rangeOfCharacter(from: specialCharacters)
109if specialCharRange == nil {
110fail("Password should contain at least one special character")
111 }
112113Comprueba que la contraseña no contiene espacios114if password.contains(" ") {
115fail("Password should not contain spaces")
116 }
117118Comprueba que la longitud es al menos 8 caracteres119if password.count < 8 {
120fail("Password should have at least eight characters")
121 }
122}
123124test_password_has_at_least_eight_characters()
125test_password_contains_at_least_one_uppercase_letter()
126test_password_contains_at_least_one_lowercase_letter()
127test_password_contains_at_least_one_digit()
128test_password_contains_at_least_one_special_character()
129test_password_does_not_contain_spaces()
130test_password_is_unique()
131test_password_meets_all_criteria()
132133Función auxiliar para imprimir el fallo134funcfail(_ description: String, function: String = #function) {
135print("❌ — \(function), \(description)")
136}