Convert Foundation Extension Testst o Swift Testing

This commit is contained in:
Otavio Cordeiro 2025-12-22 07:40:39 +01:00
parent 3448f88c22
commit 8de3f9f680
3 changed files with 201 additions and 161 deletions

View file

@ -1,9 +1,11 @@
import XCTest import Testing
@testable import FoundationExtensions @testable import FoundationExtensions
final class ArrayContainsTests: XCTestCase { @Suite("ArrayContains Tests")
struct ArrayContainsTests {
func test_containsPartial_withMatchingSubstring_returnsTrue() { @Test("It should return true when array contains element with matching substring")
func containsPartial_withMatchingSubstring_returnsTrue() {
// Given // Given
let array = ["apple", "banana", "orange"] let array = ["apple", "banana", "orange"]
let partial = "app" let partial = "app"
@ -12,13 +14,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when array contains element with matching substring" "It should return true when array contains element with matching substring"
) )
} }
func test_containsPartial_withMultipleMatches_returnsTrue() { @Test("It should return true when multiple elements contain the partial string")
func containsPartial_withMultipleMatches_returnsTrue() {
// Given // Given
let array = ["application", "approach", "apple", "banana"] let array = ["application", "approach", "apple", "banana"]
let partial = "app" let partial = "app"
@ -27,13 +30,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when multiple elements contain the partial string" "It should return true when multiple elements contain the partial string"
) )
} }
func test_containsPartial_withNoMatches_returnsFalse() { @Test("It should return false when no elements contain the partial string")
func containsPartial_withNoMatches_returnsFalse() {
// Given // Given
let array = ["banana", "orange", "grape"] let array = ["banana", "orange", "grape"]
let partial = "app" let partial = "app"
@ -42,13 +46,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertFalse( #expect(
result, !result,
"It should return false when no elements contain the partial string" "It should return false when no elements contain the partial string"
) )
} }
func test_containsPartial_withUppercasePartial_returnsTrue() { @Test("It should return true when partial string matches case-insensitively")
func containsPartial_withUppercasePartial_returnsTrue() {
// Given // Given
let array = ["apple", "banana", "orange"] let array = ["apple", "banana", "orange"]
let partial = "APP" let partial = "APP"
@ -57,13 +62,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when partial string matches case-insensitively" "It should return true when partial string matches case-insensitively"
) )
} }
func test_containsPartial_withMixedCasePartial_returnsTrue() { @Test("It should return true with mixed case partial string")
func containsPartial_withMixedCasePartial_returnsTrue() {
// Given // Given
let array = ["application", "BANANA", "OrAnGe"] let array = ["application", "BANANA", "OrAnGe"]
let partial = "aPp" let partial = "aPp"
@ -72,13 +78,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true with mixed case partial string" "It should return true with mixed case partial string"
) )
} }
func test_containsPartial_withUppercaseArrayElements_returnsTrue() { @Test("It should return true when array elements are uppercase but partial is lowercase")
func containsPartial_withUppercaseArrayElements_returnsTrue() {
// Given // Given
let array = ["APPLE", "BANANA", "ORANGE"] let array = ["APPLE", "BANANA", "ORANGE"]
let partial = "app" let partial = "app"
@ -87,13 +94,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when array elements are uppercase but partial is lowercase" "It should return true when array elements are uppercase but partial is lowercase"
) )
} }
func test_containsPartial_withEmptyArray_returnsFalse() { @Test("It should return false when array is empty")
func containsPartial_withEmptyArray_returnsFalse() {
// Given // Given
let array: [String] = [] let array: [String] = []
let partial = "app" let partial = "app"
@ -102,13 +110,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertFalse( #expect(
result, !result,
"It should return false when array is empty" "It should return false when array is empty"
) )
} }
func test_containsPartial_withEmptyPartialString_returnsFalse() { @Test("It should return false when partial string is empty (empty string matches nothing)")
func containsPartial_withEmptyPartialString_returnsFalse() {
// Given // Given
let array = ["apple", "banana", "orange"] let array = ["apple", "banana", "orange"]
let partial = "" let partial = ""
@ -117,13 +126,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertFalse( #expect(
result, !result,
"It should return false when partial string is empty (empty string matches nothing)" "It should return false when partial string is empty (empty string matches nothing)"
) )
} }
func test_containsPartial_withEmptyArrayAndEmptyPartial_returnsFalse() { @Test("It should return false when both array and partial string are empty")
func containsPartial_withEmptyArrayAndEmptyPartial_returnsFalse() {
// Given // Given
let array: [String] = [] let array: [String] = []
let partial = "" let partial = ""
@ -132,13 +142,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertFalse( #expect(
result, !result,
"It should return false when both array and partial string are empty" "It should return false when both array and partial string are empty"
) )
} }
func test_containsPartial_withEmptyStringInArray_returnsFalse() { @Test("It should return false when array contains empty string and partial is empty (empty string matches nothing)")
func containsPartial_withEmptyStringInArray_returnsFalse() {
// Given // Given
let array = ["apple", "", "banana"] let array = ["apple", "", "banana"]
let partial = "" let partial = ""
@ -147,13 +158,16 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertFalse( #expect(
result, !result,
"It should return false when array contains empty string and partial is empty (empty string matches nothing)" "It should return false when array contains empty string and partial is empty (empty string matches nothing)"
) )
} }
func test_containsPartial_withSearchingInEmptyString_returnsFalse() { @Test(
"It should return true when searching for non-empty partial in array with empty string (should match 'apple')"
)
func containsPartial_withSearchingInEmptyString_returnsFalse() {
// Given // Given
let array = ["apple", "", "banana"] let array = ["apple", "", "banana"]
let partial = "app" let partial = "app"
@ -162,13 +176,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when searching for non-empty partial in array with empty string (should match 'apple')" "It should return true when searching for non-empty partial in array with empty string (should match 'apple')"
) )
} }
func test_containsPartial_withWhitespacePartial_returnsTrue() { @Test("It should return true when partial is whitespace and array contains strings with spaces")
func containsPartial_withWhitespacePartial_returnsTrue() {
// Given // Given
let array = ["hello world", "banana", "orange"] let array = ["hello world", "banana", "orange"]
let partial = " " let partial = " "
@ -177,13 +192,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when partial is whitespace and array contains strings with spaces" "It should return true when partial is whitespace and array contains strings with spaces"
) )
} }
func test_containsPartial_withWhitespaceInPartial_returnsTrue() { @Test("It should return true when partial contains whitespace and matches substring with spaces")
func containsPartial_withWhitespaceInPartial_returnsTrue() {
// Given // Given
let array = ["hello world", "banana split", "orange juice"] let array = ["hello world", "banana split", "orange juice"]
let partial = "lo wo" let partial = "lo wo"
@ -192,13 +208,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when partial contains whitespace and matches substring with spaces" "It should return true when partial contains whitespace and matches substring with spaces"
) )
} }
func test_containsPartial_withTrailingWhitespace_returnsTrue() { @Test("It should return true when array element has trailing whitespace")
func containsPartial_withTrailingWhitespace_returnsTrue() {
// Given // Given
let array = ["apple ", "banana", "orange"] let array = ["apple ", "banana", "orange"]
let partial = "apple" let partial = "apple"
@ -207,13 +224,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when array element has trailing whitespace" "It should return true when array element has trailing whitespace"
) )
} }
func test_containsPartial_withLeadingWhitespace_returnsTrue() { @Test("It should return true when array element has leading whitespace")
func containsPartial_withLeadingWhitespace_returnsTrue() {
// Given // Given
let array = [" apple", "banana", "orange"] let array = [" apple", "banana", "orange"]
let partial = "apple" let partial = "apple"
@ -222,13 +240,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when array element has leading whitespace" "It should return true when array element has leading whitespace"
) )
} }
func test_containsPartial_withSpecialCharacters_returnsTrue() { @Test("It should return true when partial contains special characters and matches")
func containsPartial_withSpecialCharacters_returnsTrue() {
// Given // Given
let array = ["test@email.com", "user123", "hello-world"] let array = ["test@email.com", "user123", "hello-world"]
let partial = "@email" let partial = "@email"
@ -237,13 +256,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when partial contains special characters and matches" "It should return true when partial contains special characters and matches"
) )
} }
func test_containsPartial_withNumbersInPartial_returnsTrue() { @Test("It should return true when partial contains numbers and matches")
func containsPartial_withNumbersInPartial_returnsTrue() {
// Given // Given
let array = ["user123", "test456", "admin"] let array = ["user123", "test456", "admin"]
let partial = "123" let partial = "123"
@ -252,13 +272,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when partial contains numbers and matches" "It should return true when partial contains numbers and matches"
) )
} }
func test_containsPartial_withUnicodeCharacters_returnsTrue() { @Test("It should return true when partial contains unicode characters and matches")
func containsPartial_withUnicodeCharacters_returnsTrue() {
// Given // Given
let array = ["café", "naïve", "résumé"] let array = ["café", "naïve", "résumé"]
let partial = "café" let partial = "café"
@ -267,13 +288,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when partial contains unicode characters and matches" "It should return true when partial contains unicode characters and matches"
) )
} }
func test_containsPartial_withEmojiCharacters_returnsTrue() { @Test("It should return true when partial contains emoji and matches")
func containsPartial_withEmojiCharacters_returnsTrue() {
// Given // Given
let array = ["Hello 👋", "Good morning", "Have a nice day"] let array = ["Hello 👋", "Good morning", "Have a nice day"]
let partial = "👋" let partial = "👋"
@ -282,13 +304,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when partial contains emoji and matches" "It should return true when partial contains emoji and matches"
) )
} }
func test_containsPartial_withSingleCharacterPartial_returnsTrue() { @Test("It should return true when partial is single character and matches")
func containsPartial_withSingleCharacterPartial_returnsTrue() {
// Given // Given
let array = ["apple", "banana", "orange"] let array = ["apple", "banana", "orange"]
let partial = "a" let partial = "a"
@ -297,13 +320,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when partial is single character and matches" "It should return true when partial is single character and matches"
) )
} }
func test_containsPartial_withSingleCharacterNoMatch_returnsFalse() { @Test("It should return false when single character partial doesn't match any element")
func containsPartial_withSingleCharacterNoMatch_returnsFalse() {
// Given // Given
let array = ["apple", "banana", "orange"] let array = ["apple", "banana", "orange"]
let partial = "z" let partial = "z"
@ -312,13 +336,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertFalse( #expect(
result, !result,
"It should return false when single character partial doesn't match any element" "It should return false when single character partial doesn't match any element"
) )
} }
func test_containsPartial_withSingleCharacterArray_returnsTrue() { @Test("It should return true when array contains single characters and partial matches")
func containsPartial_withSingleCharacterArray_returnsTrue() {
// Given // Given
let array = ["a", "b", "c"] let array = ["a", "b", "c"]
let partial = "a" let partial = "a"
@ -327,13 +352,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when array contains single characters and partial matches" "It should return true when array contains single characters and partial matches"
) )
} }
func test_containsPartial_withExactMatch_returnsTrue() { @Test("It should return true when partial exactly matches an array element")
func containsPartial_withExactMatch_returnsTrue() {
// Given // Given
let array = ["apple", "banana", "orange"] let array = ["apple", "banana", "orange"]
let partial = "apple" let partial = "apple"
@ -342,13 +368,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when partial exactly matches an array element" "It should return true when partial exactly matches an array element"
) )
} }
func test_containsPartial_withExactMatchDifferentCase_returnsTrue() { @Test("It should return true when partial exactly matches with different case")
func containsPartial_withExactMatchDifferentCase_returnsTrue() {
// Given // Given
let array = ["Apple", "Banana", "Orange"] let array = ["Apple", "Banana", "Orange"]
let partial = "APPLE" let partial = "APPLE"
@ -357,13 +384,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when partial exactly matches with different case" "It should return true when partial exactly matches with different case"
) )
} }
func test_containsPartial_withAccentedCharacters_returnsFalse() { @Test("It should return false when plain text doesn't match accented characters exactly")
func containsPartial_withAccentedCharacters_returnsFalse() {
// Given // Given
let array = ["café", "résumé", "naïve"] let array = ["café", "résumé", "naïve"]
let partial = "cafe" let partial = "cafe"
@ -372,13 +400,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertFalse( #expect(
result, !result,
"It should return false when plain text doesn't match accented characters exactly" "It should return false when plain text doesn't match accented characters exactly"
) )
} }
func test_containsPartial_withMatchingAccentedCharacters_returnsTrue() { @Test("It should return true when accented characters match exactly")
func containsPartial_withMatchingAccentedCharacters_returnsTrue() {
// Given // Given
let array = ["café", "résumé", "naïve"] let array = ["café", "résumé", "naïve"]
let partial = "café" let partial = "café"
@ -387,13 +416,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when accented characters match exactly" "It should return true when accented characters match exactly"
) )
} }
func test_containsPartial_withGermanUmlaut_returnsFalse() { @Test("It should return false when plain text doesn't match umlauts exactly")
func containsPartial_withGermanUmlaut_returnsFalse() {
// Given // Given
let array = ["Müller", "Straße", "Käse"] let array = ["Müller", "Straße", "Käse"]
let partial = "muller" let partial = "muller"
@ -402,13 +432,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertFalse( #expect(
result, !result,
"It should return false when plain text doesn't match umlauts exactly" "It should return false when plain text doesn't match umlauts exactly"
) )
} }
func test_containsPartial_withMatchingUmlaut_returnsTrue() { @Test("It should return true when umlauts match exactly")
func containsPartial_withMatchingUmlaut_returnsTrue() {
// Given // Given
let array = ["Müller", "Straße", "Käse"] let array = ["Müller", "Straße", "Käse"]
let partial = "Müller" let partial = "Müller"
@ -417,13 +448,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when umlauts match exactly" "It should return true when umlauts match exactly"
) )
} }
func test_containsPartial_withCaseInsensitiveUmlaut_returnsTrue() { @Test("It should return true when case-insensitive matching works with umlauts")
func containsPartial_withCaseInsensitiveUmlaut_returnsTrue() {
// Given // Given
let array = ["Müller", "Straße", "Käse"] let array = ["Müller", "Straße", "Käse"]
let partial = "müller" let partial = "müller"
@ -432,13 +464,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when case-insensitive matching works with umlauts" "It should return true when case-insensitive matching works with umlauts"
) )
} }
func test_containsPartial_withVeryLongString_returnsTrue() { @Test("It should return true when searching in very long strings")
func containsPartial_withVeryLongString_returnsTrue() {
// Given // Given
let longString = String(repeating: "a", count: 1000) + "target" + String(repeating: "b", count: 1000) let longString = String(repeating: "a", count: 1000) + "target" + String(repeating: "b", count: 1000)
let array = [longString, "short", "medium"] let array = [longString, "short", "medium"]
@ -448,13 +481,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when searching in very long strings" "It should return true when searching in very long strings"
) )
} }
func test_containsPartial_withPartialLongerThanElements_returnsFalse() { @Test("It should return false when partial string is longer than all array elements")
func containsPartial_withPartialLongerThanElements_returnsFalse() {
// Given // Given
let array = ["a", "bb", "ccc"] let array = ["a", "bb", "ccc"]
let partial = "longpartialstring" let partial = "longpartialstring"
@ -463,13 +497,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertFalse( #expect(
result, !result,
"It should return false when partial string is longer than all array elements" "It should return false when partial string is longer than all array elements"
) )
} }
func test_containsPartial_withSubstringAtEnd_returnsTrue() { @Test("It should return true when partial matches at the end of an element")
func containsPartial_withSubstringAtEnd_returnsTrue() {
// Given // Given
let array = ["something", "another", "endapp"] let array = ["something", "another", "endapp"]
let partial = "app" let partial = "app"
@ -478,13 +513,14 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when partial matches at the end of an element" "It should return true when partial matches at the end of an element"
) )
} }
func test_containsPartial_withSubstringInMiddle_returnsTrue() { @Test("It should return true when partial matches in the middle of an element")
func containsPartial_withSubstringInMiddle_returnsTrue() {
// Given // Given
let array = ["something", "mapplication", "other"] let array = ["something", "mapplication", "other"]
let partial = "app" let partial = "app"
@ -493,7 +529,7 @@ final class ArrayContainsTests: XCTestCase {
let result = array.containsPartial(partial) let result = array.containsPartial(partial)
// Then // Then
XCTAssertTrue( #expect(
result, result,
"It should return true when partial matches in the middle of an element" "It should return true when partial matches in the middle of an element"
) )

View file

@ -1,9 +1,12 @@
import XCTest import Foundation
import Testing
@testable import FoundationExtensions @testable import FoundationExtensions
final class URLImagePreviewTests: XCTestCase { @Suite("URLImagePreview Tests")
struct URLImagePreviewTests {
func test_imagePreviewURL_withStandardImageURL_insertsPreviewBeforeExtension() { @Test("It should replace the file extension with .preview.jpg")
func imagePreviewURL_withStandardImageURL_insertsPreviewBeforeExtension() {
// Given // Given
let url = URL(string: "https://cdn.some.pics/user/image.jpg")! let url = URL(string: "https://cdn.some.pics/user/image.jpg")!
@ -11,14 +14,14 @@ final class URLImagePreviewTests: XCTestCase {
let result = url.imagePreviewURL let result = url.imagePreviewURL
// Then // Then
XCTAssertEqual( #expect(
result.absoluteString, result.absoluteString == "https://cdn.some.pics/user/image.preview.jpg",
"https://cdn.some.pics/user/image.preview.jpg",
"It should replace the file extension with .preview.jpg" "It should replace the file extension with .preview.jpg"
) )
} }
func test_imagePreviewURL_withPNGImage_insertsPreviewBeforeExtension() { @Test("It should replace PNG extension with .preview.jpg")
func imagePreviewURL_withPNGImage_insertsPreviewBeforeExtension() {
// Given // Given
let url = URL(string: "https://example.com/photos/sunset.png")! let url = URL(string: "https://example.com/photos/sunset.png")!
@ -26,14 +29,14 @@ final class URLImagePreviewTests: XCTestCase {
let result = url.imagePreviewURL let result = url.imagePreviewURL
// Then // Then
XCTAssertEqual( #expect(
result.absoluteString, result.absoluteString == "https://example.com/photos/sunset.preview.jpg",
"https://example.com/photos/sunset.preview.jpg",
"It should replace PNG extension with .preview.jpg" "It should replace PNG extension with .preview.jpg"
) )
} }
func test_imagePreviewURL_withNoExtension_appendsPreview() { @Test("It should append .preview.jpg when there is no file extension")
func imagePreviewURL_withNoExtension_appendsPreview() {
// Given // Given
let url = URL(string: "https://example.com/images/photo")! let url = URL(string: "https://example.com/images/photo")!
@ -41,14 +44,14 @@ final class URLImagePreviewTests: XCTestCase {
let result = url.imagePreviewURL let result = url.imagePreviewURL
// Then // Then
XCTAssertEqual( #expect(
result.absoluteString, result.absoluteString == "https://example.com/images/photo.preview.jpg",
"https://example.com/images/photo.preview.jpg",
"It should append .preview.jpg when there is no file extension" "It should append .preview.jpg when there is no file extension"
) )
} }
func test_imagePreviewURL_withComplexFilename_insertsPreviewCorrectly() { @Test("It should replace the extension with .preview.jpg for complex filenames")
func imagePreviewURL_withComplexFilename_insertsPreviewCorrectly() {
// Given // Given
let url = URL(string: "https://cdn.example.com/user-uploads/my-vacation-photo.jpeg")! let url = URL(string: "https://cdn.example.com/user-uploads/my-vacation-photo.jpeg")!
@ -56,14 +59,14 @@ final class URLImagePreviewTests: XCTestCase {
let result = url.imagePreviewURL let result = url.imagePreviewURL
// Then // Then
XCTAssertEqual( #expect(
result.absoluteString, result.absoluteString == "https://cdn.example.com/user-uploads/my-vacation-photo.preview.jpg",
"https://cdn.example.com/user-uploads/my-vacation-photo.preview.jpg",
"It should replace the extension with .preview.jpg for complex filenames" "It should replace the extension with .preview.jpg for complex filenames"
) )
} }
func test_imagePreviewURL_withQueryParameters_preservesQuery() { @Test("It should preserve query parameters and use .preview.jpg extension")
func imagePreviewURL_withQueryParameters_preservesQuery() {
// Given // Given
let url = URL(string: "https://api.example.com/images/photo.jpg?size=large&quality=high")! let url = URL(string: "https://api.example.com/images/photo.jpg?size=large&quality=high")!
@ -71,14 +74,14 @@ final class URLImagePreviewTests: XCTestCase {
let result = url.imagePreviewURL let result = url.imagePreviewURL
// Then // Then
XCTAssertEqual( #expect(
result.absoluteString, result.absoluteString == "https://api.example.com/images/photo.preview.jpg?size=large&quality=high",
"https://api.example.com/images/photo.preview.jpg?size=large&quality=high",
"It should preserve query parameters and use .preview.jpg extension" "It should preserve query parameters and use .preview.jpg extension"
) )
} }
func test_imagePreviewURL_withNestedDirectories_maintainsDirectoryStructure() { @Test("It should maintain the full directory structure and use .preview.jpg extension")
func imagePreviewURL_withNestedDirectories_maintainsDirectoryStructure() {
// Given // Given
let url = URL(string: "https://storage.example.com/users/123/albums/vacation/beach.gif")! let url = URL(string: "https://storage.example.com/users/123/albums/vacation/beach.gif")!
@ -86,14 +89,14 @@ final class URLImagePreviewTests: XCTestCase {
let result = url.imagePreviewURL let result = url.imagePreviewURL
// Then // Then
XCTAssertEqual( #expect(
result.absoluteString, result.absoluteString == "https://storage.example.com/users/123/albums/vacation/beach.preview.jpg",
"https://storage.example.com/users/123/albums/vacation/beach.preview.jpg",
"It should maintain the full directory structure and use .preview.jpg extension" "It should maintain the full directory structure and use .preview.jpg extension"
) )
} }
func test_imagePreviewURL_withLocalFileURL_insertsPreviewCorrectly() { @Test("It should work with local file URLs and use .preview.jpg extension")
func imagePreviewURL_withLocalFileURL_insertsPreviewCorrectly() {
// Given // Given
let url = URL(fileURLWithPath: "/Users/test/Documents/screenshot.png") let url = URL(fileURLWithPath: "/Users/test/Documents/screenshot.png")
@ -101,14 +104,14 @@ final class URLImagePreviewTests: XCTestCase {
let result = url.imagePreviewURL let result = url.imagePreviewURL
// Then // Then
XCTAssertEqual( #expect(
result.path, result.path == "/Users/test/Documents/screenshot.preview.jpg",
"/Users/test/Documents/screenshot.preview.jpg",
"It should work with local file URLs and use .preview.jpg extension" "It should work with local file URLs and use .preview.jpg extension"
) )
} }
func test_imagePreviewURL_withMultipleDots_insertsPreviewBeforeLastExtension() { @Test("It should replace the last extension with .preview.jpg when multiple dots exist")
func imagePreviewURL_withMultipleDots_insertsPreviewBeforeLastExtension() {
// Given // Given
let url = URL(string: "https://example.com/files/image.backup.jpg")! let url = URL(string: "https://example.com/files/image.backup.jpg")!
@ -116,14 +119,14 @@ final class URLImagePreviewTests: XCTestCase {
let result = url.imagePreviewURL let result = url.imagePreviewURL
// Then // Then
XCTAssertEqual( #expect(
result.absoluteString, result.absoluteString == "https://example.com/files/image.backup.preview.jpg",
"https://example.com/files/image.backup.preview.jpg",
"It should replace the last extension with .preview.jpg when multiple dots exist" "It should replace the last extension with .preview.jpg when multiple dots exist"
) )
} }
func test_imagePreviewURL_withSingleCharacterFilename_insertsPreviewCorrectly() { @Test("It should handle single character filenames and use .preview.jpg extension")
func imagePreviewURL_withSingleCharacterFilename_insertsPreviewCorrectly() {
// Given // Given
let url = URL(string: "https://example.com/a.jpg")! let url = URL(string: "https://example.com/a.jpg")!
@ -131,9 +134,8 @@ final class URLImagePreviewTests: XCTestCase {
let result = url.imagePreviewURL let result = url.imagePreviewURL
// Then // Then
XCTAssertEqual( #expect(
result.absoluteString, result.absoluteString == "https://example.com/a.preview.jpg",
"https://example.com/a.preview.jpg",
"It should handle single character filenames and use .preview.jpg extension" "It should handle single character filenames and use .preview.jpg extension"
) )
} }

View file

@ -1,9 +1,12 @@
import XCTest import Foundation
import Testing
@testable import FoundationExtensions @testable import FoundationExtensions
final class URLMarkdownTests: XCTestCase { @Suite("URLMarkdown Tests")
struct URLMarkdownTests {
func test_markdownFormatted_withTitleAndDefaultIsImage_returnsMarkdownLink() { @Test("It should return a markdown link with custom title")
func markdownFormatted_withTitleAndDefaultIsImage_returnsMarkdownLink() {
// Given // Given
let url = URL(string: "https://example.com")! let url = URL(string: "https://example.com")!
let title = "Example Website" let title = "Example Website"
@ -12,14 +15,14 @@ final class URLMarkdownTests: XCTestCase {
let result = url.markdownFormatted(title: title) let result = url.markdownFormatted(title: title)
// Then // Then
XCTAssertEqual( #expect(
result, result == "[Example Website](https://example.com)",
"[Example Website](https://example.com)",
"It should return a markdown link with custom title" "It should return a markdown link with custom title"
) )
} }
func test_markdownFormatted_withTitleAndIsImageFalse_returnsMarkdownLink() { @Test("It should return a markdown link when isImage is explicitly false")
func markdownFormatted_withTitleAndIsImageFalse_returnsMarkdownLink() {
// Given // Given
let url = URL(string: "https://example.com")! let url = URL(string: "https://example.com")!
let title = "Example Website" let title = "Example Website"
@ -28,14 +31,14 @@ final class URLMarkdownTests: XCTestCase {
let result = url.markdownFormatted(title: title, isImage: false) let result = url.markdownFormatted(title: title, isImage: false)
// Then // Then
XCTAssertEqual( #expect(
result, result == "[Example Website](https://example.com)",
"[Example Website](https://example.com)",
"It should return a markdown link when isImage is explicitly false" "It should return a markdown link when isImage is explicitly false"
) )
} }
func test_markdownFormatted_withTitleAndIsImageTrue_returnsMarkdownImage() { @Test("It should return a markdown image with custom alt text")
func markdownFormatted_withTitleAndIsImageTrue_returnsMarkdownImage() {
// Given // Given
let url = URL(string: "https://example.com/image.jpg")! let url = URL(string: "https://example.com/image.jpg")!
let title = "My Image" let title = "My Image"
@ -44,14 +47,14 @@ final class URLMarkdownTests: XCTestCase {
let result = url.markdownFormatted(title: title, isImage: true) let result = url.markdownFormatted(title: title, isImage: true)
// Then // Then
XCTAssertEqual( #expect(
result, result == "![My Image](https://example.com/image.jpg)",
"![My Image](https://example.com/image.jpg)",
"It should return a markdown image with custom alt text" "It should return a markdown image with custom alt text"
) )
} }
func test_markdownFormatted_withNoTitleAndDefaultIsImage_returnsMarkdownLinkWithURL() { @Test("It should return a markdown link using URL as both title and link when no title provided")
func markdownFormatted_withNoTitleAndDefaultIsImage_returnsMarkdownLinkWithURL() {
// Given // Given
let url = URL(string: "https://example.com")! let url = URL(string: "https://example.com")!
@ -59,14 +62,14 @@ final class URLMarkdownTests: XCTestCase {
let result = url.markdownFormatted() let result = url.markdownFormatted()
// Then // Then
XCTAssertEqual( #expect(
result, result == "[https://example.com](https://example.com)",
"[https://example.com](https://example.com)",
"It should return a markdown link using URL as both title and link when no title provided" "It should return a markdown link using URL as both title and link when no title provided"
) )
} }
func test_markdownFormatted_withNoTitleAndIsImageTrue_returnsMarkdownImageWithURL() { @Test("It should return a markdown image using URL as both alt text and source when no title provided")
func markdownFormatted_withNoTitleAndIsImageTrue_returnsMarkdownImageWithURL() {
// Given // Given
let url = URL(string: "https://example.com/photo.png")! let url = URL(string: "https://example.com/photo.png")!
@ -74,14 +77,14 @@ final class URLMarkdownTests: XCTestCase {
let result = url.markdownFormatted(isImage: true) let result = url.markdownFormatted(isImage: true)
// Then // Then
XCTAssertEqual( #expect(
result, result == "![https://example.com/photo.png](https://example.com/photo.png)",
"![https://example.com/photo.png](https://example.com/photo.png)",
"It should return a markdown image using URL as both alt text and source when no title provided" "It should return a markdown image using URL as both alt text and source when no title provided"
) )
} }
func test_markdownFormatted_withEmptyTitle_returnsMarkdownLinkWithURL() { @Test("It should return a markdown link with empty title text when empty string provided")
func markdownFormatted_withEmptyTitle_returnsMarkdownLinkWithURL() {
// Given // Given
let url = URL(string: "https://example.com")! let url = URL(string: "https://example.com")!
let title = "" let title = ""
@ -90,14 +93,14 @@ final class URLMarkdownTests: XCTestCase {
let result = url.markdownFormatted(title: title) let result = url.markdownFormatted(title: title)
// Then // Then
XCTAssertEqual( #expect(
result, result == "[](https://example.com)",
"[](https://example.com)",
"It should return a markdown link with empty title text when empty string provided" "It should return a markdown link with empty title text when empty string provided"
) )
} }
func test_markdownFormatted_withEmptyTitleAndIsImageTrue_returnsMarkdownImageWithEmptyAlt() { @Test("It should return a markdown image with empty alt text when empty string provided")
func markdownFormatted_withEmptyTitleAndIsImageTrue_returnsMarkdownImageWithEmptyAlt() {
// Given // Given
let url = URL(string: "https://example.com/image.gif")! let url = URL(string: "https://example.com/image.gif")!
let title = "" let title = ""
@ -106,14 +109,14 @@ final class URLMarkdownTests: XCTestCase {
let result = url.markdownFormatted(title: title, isImage: true) let result = url.markdownFormatted(title: title, isImage: true)
// Then // Then
XCTAssertEqual( #expect(
result, result == "![](https://example.com/image.gif)",
"![](https://example.com/image.gif)",
"It should return a markdown image with empty alt text when empty string provided" "It should return a markdown image with empty alt text when empty string provided"
) )
} }
func test_markdownFormatted_withComplexURL_returnsCorrectMarkdownLink() { @Test("It should handle complex URLs with paths, queries, and fragments")
func markdownFormatted_withComplexURL_returnsCorrectMarkdownLink() {
// Given // Given
let url = URL(string: "https://example.com/path/to/resource?query=value&other=param#section")! let url = URL(string: "https://example.com/path/to/resource?query=value&other=param#section")!
let title = "Complex URL" let title = "Complex URL"
@ -122,14 +125,14 @@ final class URLMarkdownTests: XCTestCase {
let result = url.markdownFormatted(title: title) let result = url.markdownFormatted(title: title)
// Then // Then
XCTAssertEqual( #expect(
result, result == "[Complex URL](https://example.com/path/to/resource?query=value&other=param#section)",
"[Complex URL](https://example.com/path/to/resource?query=value&other=param#section)",
"It should handle complex URLs with paths, queries, and fragments" "It should handle complex URLs with paths, queries, and fragments"
) )
} }
func test_markdownFormatted_withLocalFileURL_returnsCorrectMarkdownLink() { @Test("It should handle local file URLs correctly")
func markdownFormatted_withLocalFileURL_returnsCorrectMarkdownLink() {
// Given // Given
let url = URL(fileURLWithPath: "/Users/test/document.pdf") let url = URL(fileURLWithPath: "/Users/test/document.pdf")
let title = "Local Document" let title = "Local Document"
@ -138,14 +141,14 @@ final class URLMarkdownTests: XCTestCase {
let result = url.markdownFormatted(title: title) let result = url.markdownFormatted(title: title)
// Then // Then
XCTAssertEqual( #expect(
result, result == "[Local Document](file:///Users/test/document.pdf)",
"[Local Document](file:///Users/test/document.pdf)",
"It should handle local file URLs correctly" "It should handle local file URLs correctly"
) )
} }
func test_markdownFormatted_withSpecialCharactersInTitle_returnsMarkdownLinkWithSpecialChars() { @Test("It should preserve special characters in title without escaping")
func markdownFormatted_withSpecialCharactersInTitle_returnsMarkdownLinkWithSpecialChars() {
// Given // Given
let url = URL(string: "https://example.com")! let url = URL(string: "https://example.com")!
let title = "Special [Characters] & Symbols" let title = "Special [Characters] & Symbols"
@ -154,14 +157,14 @@ final class URLMarkdownTests: XCTestCase {
let result = url.markdownFormatted(title: title) let result = url.markdownFormatted(title: title)
// Then // Then
XCTAssertEqual( #expect(
result, result == "[Special [Characters] & Symbols](https://example.com)",
"[Special [Characters] & Symbols](https://example.com)",
"It should preserve special characters in title without escaping" "It should preserve special characters in title without escaping"
) )
} }
func test_markdownFormatted_withUnicodeInTitle_returnsMarkdownLinkWithUnicode() { @Test("It should handle unicode characters and emojis in title correctly")
func markdownFormatted_withUnicodeInTitle_returnsMarkdownLinkWithUnicode() {
// Given // Given
let url = URL(string: "https://example.com")! let url = URL(string: "https://example.com")!
let title = "Café & Naïve résumé 🌟" let title = "Café & Naïve résumé 🌟"
@ -170,9 +173,8 @@ final class URLMarkdownTests: XCTestCase {
let result = url.markdownFormatted(title: title, isImage: true) let result = url.markdownFormatted(title: title, isImage: true)
// Then // Then
XCTAssertEqual( #expect(
result, result == "![Café & Naïve résumé 🌟](https://example.com)",
"![Café & Naïve résumé 🌟](https://example.com)",
"It should handle unicode characters and emojis in title correctly" "It should handle unicode characters and emojis in title correctly"
) )
} }