diff --git a/Sources/RegexBuilder/Algorithms.swift b/Sources/RegexBuilder/Algorithms.swift index f1f6d97a0..444f1a14b 100644 --- a/Sources/RegexBuilder/Algorithms.swift +++ b/Sources/RegexBuilder/Algorithms.swift @@ -52,7 +52,7 @@ extension BidirectionalCollection where SubSequence == Substring { public func contains( @RegexComponentBuilder _ content: () -> R ) -> Bool { - contains(content()) + contains(pattern: content()) } /// Returns the range of the first match for the regex within this collection, @@ -104,7 +104,7 @@ extension BidirectionalCollection where SubSequence == Substring { omittingEmptySubsequences: Bool = true, @RegexComponentBuilder separator: () -> R ) -> [SubSequence] { - split(separator: separator(), maxSplits: maxSplits, omittingEmptySubsequences: omittingEmptySubsequences) + split(pattern: separator(), maxSplits: maxSplits, omittingEmptySubsequences: omittingEmptySubsequences) } /// Returns a Boolean value indicating whether the initial elements of this diff --git a/Sources/_StringProcessing/Algorithms/Algorithms/Contains.swift b/Sources/_StringProcessing/Algorithms/Algorithms/Contains.swift index 2a1ef72a2..42883e0b1 100644 --- a/Sources/_StringProcessing/Algorithms/Algorithms/Contains.swift +++ b/Sources/_StringProcessing/Algorithms/Algorithms/Contains.swift @@ -28,7 +28,7 @@ extension Collection where Element: Equatable { /// - Returns: `true` if the collection contains the specified sequence, /// otherwise `false`. @available(SwiftStdlib 5.7, *) - public func contains(_ other: C) -> Bool + public func contains(pattern other: C) -> Bool where C.Element == Element { firstRange(of: other) != nil @@ -46,20 +46,6 @@ extension BidirectionalCollection where Element: Comparable { } } -// Overload breakers - -extension StringProtocol { - @available(SwiftStdlib 5.7, *) - public func contains(_ other: String) -> Bool { - firstRange(of: other) != nil - } - - @available(SwiftStdlib 5.7, *) - public func contains(_ other: Substring) -> Bool { - firstRange(of: other) != nil - } -} - // MARK: Regex algorithms extension BidirectionalCollection where SubSequence == Substring { @@ -69,7 +55,7 @@ extension BidirectionalCollection where SubSequence == Substring { /// - Returns: `true` if the regex was found in the collection, otherwise /// `false`. @available(SwiftStdlib 5.7, *) - public func contains(_ regex: R) -> Bool { + public func contains(pattern regex: R) -> Bool { contains(RegexConsumer(regex)) } } diff --git a/Sources/_StringProcessing/Algorithms/Algorithms/Split.swift b/Sources/_StringProcessing/Algorithms/Algorithms/Split.swift index ab465c382..5ca33831f 100644 --- a/Sources/_StringProcessing/Algorithms/Algorithms/Split.swift +++ b/Sources/_StringProcessing/Algorithms/Algorithms/Split.swift @@ -309,11 +309,11 @@ extension Collection where Element: Equatable { /// elements. @available(SwiftStdlib 5.7, *) public func split( - separator: C, + pattern: C, maxSplits: Int = .max, omittingEmptySubsequences: Bool = true ) -> [SubSequence] where C.Element == Element { - Array(split(by: ZSearcher(pattern: Array(separator), by: ==), maxSplits: maxSplits, omittingEmptySubsequences: omittingEmptySubsequences)) + Array(split(by: ZSearcher(pattern: Array(pattern), by: ==), maxSplits: maxSplits, omittingEmptySubsequences: omittingEmptySubsequences)) } } @@ -384,10 +384,10 @@ extension BidirectionalCollection where SubSequence == Substring { /// elements. @_disfavoredOverload public func split( - separator: R, + pattern: R, maxSplits: Int = .max, omittingEmptySubsequences: Bool = true ) -> [SubSequence] { - Array(split(by: RegexConsumer(separator), maxSplits: maxSplits, omittingEmptySubsequences: omittingEmptySubsequences)) + Array(split(by: RegexConsumer(pattern), maxSplits: maxSplits, omittingEmptySubsequences: omittingEmptySubsequences)) } } diff --git a/Tests/RegexTests/AlgorithmsInternalsTests.swift b/Tests/RegexTests/AlgorithmsInternalsTests.swift index f0d556744..4065e87ca 100644 --- a/Tests/RegexTests/AlgorithmsInternalsTests.swift +++ b/Tests/RegexTests/AlgorithmsInternalsTests.swift @@ -17,10 +17,10 @@ extension AlgorithmTests { func testAdHoc() { let r = try! Regex("a|b+") - XCTAssert("palindrome".contains(r)) - XCTAssert("botany".contains(r)) - XCTAssert("antiquing".contains(r)) - XCTAssertFalse("cdef".contains(r)) + XCTAssert("palindrome".contains(pattern: r)) + XCTAssert("botany".contains(pattern: r)) + XCTAssert("antiquing".contains(pattern: r)) + XCTAssertFalse("cdef".contains(pattern: r)) let str = "a string with the letter b in it" let first = str.firstRange(of: r) diff --git a/Tests/RegexTests/AlgorithmsTests.swift b/Tests/RegexTests/AlgorithmsTests.swift index d63333c01..896a73815 100644 --- a/Tests/RegexTests/AlgorithmsTests.swift +++ b/Tests/RegexTests/AlgorithmsTests.swift @@ -45,8 +45,8 @@ class AlgorithmTests: XCTestCase { for start in 0..<9 { for end in start..<9 { - XCTAssertTrue((0..<10).contains(start...end)) - XCTAssertFalse((0..<10).contains(start...10)) + XCTAssertTrue((0..<10).contains(pattern: start...end)) + XCTAssertFalse((0..<10).contains(pattern: start...10)) } } } @@ -124,7 +124,7 @@ class AlgorithmTests: XCTestCase { file: StaticString = #file, line: UInt = #line ) { let regex = try! Regex(regex) - let actual = Array(string.split(separator: regex, omittingEmptySubsequences: false)) + let actual = Array(string.split(pattern: regex, omittingEmptySubsequences: false)) XCTAssertEqual(actual, expected, file: file, line: line) } @@ -136,8 +136,8 @@ class AlgorithmTests: XCTestCase { expectSplit("a____a____a", "_+", ["a", "a", "a"]) expectSplit("____a____a____a____", "_+", ["", "a", "a", "a", ""]) - XCTAssertEqual("".split(separator: ""), []) - XCTAssertEqual("".split(separator: "", omittingEmptySubsequences: false), [""]) + XCTAssertEqual("".split(pattern: ""), []) + XCTAssertEqual("".split(pattern: "", omittingEmptySubsequences: false), [""]) // Test that original `split` functions are still accessible let splitRef = "abcd".split @@ -149,36 +149,36 @@ class AlgorithmTests: XCTestCase { func testSplitPermutations() throws { let splitRegex = try Regex(#"\|"#) XCTAssertEqual( - "a|a|||a|a".split(separator: splitRegex), + "a|a|||a|a".split(pattern: splitRegex), ["a", "a", "a", "a"]) XCTAssertEqual( - "a|a|||a|a".split(separator: splitRegex, omittingEmptySubsequences: false), + "a|a|||a|a".split(pattern: splitRegex, omittingEmptySubsequences: false), ["a", "a", "", "", "a", "a"]) XCTAssertEqual( - "a|a|||a|a".split(separator: splitRegex, maxSplits: 2), + "a|a|||a|a".split(pattern: splitRegex, maxSplits: 2), ["a", "a", "||a|a"]) XCTAssertEqual( - "a|a|||a|a|||a|a|||".split(separator: "|||"), + "a|a|||a|a|||a|a|||".split(pattern: "|||"), ["a|a", "a|a", "a|a"]) XCTAssertEqual( - "a|a|||a|a|||a|a|||".split(separator: "|||", omittingEmptySubsequences: false), + "a|a|||a|a|||a|a|||".split(pattern: "|||", omittingEmptySubsequences: false), ["a|a", "a|a", "a|a", ""]) XCTAssertEqual( - "a|a|||a|a|||a|a|||".split(separator: "|||", maxSplits: 2), + "a|a|||a|a|||a|a|||".split(pattern: "|||", maxSplits: 2), ["a|a", "a|a", "a|a|||"]) XCTAssertEqual( - "aaaa".split(separator: ""), + "aaaa".split(pattern: ""), ["a", "a", "a", "a"]) XCTAssertEqual( - "aaaa".split(separator: "", omittingEmptySubsequences: false), + "aaaa".split(pattern: "", omittingEmptySubsequences: false), ["", "a", "a", "a", "a", ""]) XCTAssertEqual( - "aaaa".split(separator: "", maxSplits: 2), + "aaaa".split(pattern: "", maxSplits: 2), ["a", "a", "aa"]) XCTAssertEqual( - "aaaa".split(separator: "", maxSplits: 2, omittingEmptySubsequences: false), + "aaaa".split(pattern: "", maxSplits: 2, omittingEmptySubsequences: false), ["", "a", "aaa"]) // Fuzzing the input and parameters @@ -205,11 +205,11 @@ class AlgorithmTests: XCTestCase { maxSplits: maxSplits, omittingEmptySubsequences: omitEmpty) let regexActual = str.split( - separator: splitRegex, + pattern: splitRegex, maxSplits: maxSplits, omittingEmptySubsequences: omitEmpty) let stringActual = str.split( - separator: "|" as String, + pattern: "|", maxSplits: maxSplits, omittingEmptySubsequences: omitEmpty) XCTAssertEqual(regexActual, expected, """ diff --git a/Tests/RegexTests/MatchTests.swift b/Tests/RegexTests/MatchTests.swift index 89a645375..3acdf7ba2 100644 --- a/Tests/RegexTests/MatchTests.swift +++ b/Tests/RegexTests/MatchTests.swift @@ -1352,12 +1352,12 @@ extension RegexTests { 04: Arkansas 05: California """ - XCTAssertTrue(string.contains(try Regex(#"^\d+"#))) + XCTAssertTrue(string.contains(pattern: try Regex(#"^\d+"#))) XCTAssertEqual(string.ranges(of: try Regex(#"^\d+"#)).count, 1) XCTAssertEqual(string.ranges(of: try Regex(#"(?m)^\d+"#)).count, 5) let regex = try Regex(#"^\d+: [\w ]+$"#) - XCTAssertFalse(string.contains(regex)) + XCTAssertFalse(string.contains(pattern: regex)) let allRanges = string.ranges(of: regex.anchorsMatchLineEndings()) XCTAssertEqual(allRanges.count, 5) } @@ -1396,12 +1396,12 @@ extension RegexTests { func testOptionMethods() throws { let regex = try Regex("c.f.") - XCTAssertTrue ("cafe".contains(regex)) - XCTAssertFalse("CaFe".contains(regex)) + XCTAssertTrue ("cafe".contains(pattern: regex)) + XCTAssertFalse("CaFe".contains(pattern: regex)) let caseInsensitiveRegex = regex.ignoresCase() - XCTAssertTrue("cafe".contains(caseInsensitiveRegex)) - XCTAssertTrue("CaFe".contains(caseInsensitiveRegex)) + XCTAssertTrue("cafe".contains(pattern: caseInsensitiveRegex)) + XCTAssertTrue("CaFe".contains(pattern: caseInsensitiveRegex)) } // MARK: Character Semantics diff --git a/Tests/RegexTests/UTS18Tests.swift b/Tests/RegexTests/UTS18Tests.swift index d13b47b8d..9b335b2ba 100644 --- a/Tests/RegexTests/UTS18Tests.swift +++ b/Tests/RegexTests/UTS18Tests.swift @@ -119,17 +119,17 @@ extension UTS18Tests { // Script and Script_Extensions // U+3042 あ HIRAGANA LETTER A Hira {Hira} - XCTAssertTrue("\u{3042}".contains(regex(#"\p{Hira}"#))) - XCTAssertTrue("\u{3042}".contains(regex(#"\p{sc=Hira}"#))) - XCTAssertTrue("\u{3042}".contains(regex(#"\p{scx=Hira}"#))) + XCTAssertTrue("\u{3042}".contains(pattern: regex(#"\p{Hira}"#))) + XCTAssertTrue("\u{3042}".contains(pattern: regex(#"\p{sc=Hira}"#))) + XCTAssertTrue("\u{3042}".contains(pattern: regex(#"\p{scx=Hira}"#))) // U+30FC γƒΌ KATAKANA-HIRAGANA PROLONGED SOUND MARK Zyyy = Common {Hira, Kana} - XCTAssertTrue("\u{30FC}".contains(regex(#"\p{Hira}"#))) // Implicit = Script_Extensions - XCTAssertTrue("\u{30FC}".contains(regex(#"\p{Kana}"#))) - XCTAssertTrue("\u{30FC}".contains(regex(#"\p{sc=Zyyy}"#))) // Explicit = Script - XCTAssertTrue("\u{30FC}".contains(regex(#"\p{scx=Hira}"#))) - XCTAssertTrue("\u{30FC}".contains(regex(#"\p{scx=Kana}"#))) - XCTAssertFalse("\u{30FC}".contains(regex(#"\p{sc=Hira}"#))) - XCTAssertFalse("\u{30FC}".contains(regex(#"\p{sc=Kana}"#))) + XCTAssertTrue("\u{30FC}".contains(pattern: regex(#"\p{Hira}"#))) // Implicit = Script_Extensions + XCTAssertTrue("\u{30FC}".contains(pattern: regex(#"\p{Kana}"#))) + XCTAssertTrue("\u{30FC}".contains(pattern: regex(#"\p{sc=Zyyy}"#))) // Explicit = Script + XCTAssertTrue("\u{30FC}".contains(pattern: regex(#"\p{scx=Hira}"#))) + XCTAssertTrue("\u{30FC}".contains(pattern: regex(#"\p{scx=Kana}"#))) + XCTAssertFalse("\u{30FC}".contains(pattern: regex(#"\p{sc=Hira}"#))) + XCTAssertFalse("\u{30FC}".contains(pattern: regex(#"\p{sc=Kana}"#))) // Uppercase, etc expectFirstMatch(input, regex(#"\p{Uppercase}+"#), input[pos: ..<3]) @@ -143,8 +143,8 @@ extension UTS18Tests { // Block vs Writing System let greekScalar = "Θ" // U+0398 let greekExtendedScalar = "αΌ€" // U+1F00 - XCTAssertTrue(greekScalar.contains(regex(#"\p{Greek}"#))) - XCTAssertTrue(greekExtendedScalar.contains(regex(#"\p{Greek}"#))) + XCTAssertTrue(greekScalar.contains(pattern: regex(#"\p{Greek}"#))) + XCTAssertTrue(greekExtendedScalar.contains(pattern: regex(#"\p{Greek}"#))) } func testProperties_XFail() { @@ -196,7 +196,7 @@ extension UTS18Tests { // Non-ASCII lowercase + non-lowercase ASCII expectFirstMatch(input, regex(#"[\p{lowercase}~~\p{ascii}]+"#), input[pos: ..<3]) - XCTAssertTrue("123%&^ABC".contains(regex(#"^[\p{lowercase}~~\p{ascii}]+$"#))) + XCTAssertTrue("123%&^ABC".contains(pattern: regex(#"^[\p{lowercase}~~\p{ascii}]+$"#))) } func testSubtractionAndIntersectionPrecedence() { @@ -298,10 +298,10 @@ extension UTS18Tests { XCTAssertEqual(lines.count, 10) // Does not contain an empty line - XCTAssertFalse(lineInput.contains(regex(#"^$"#))) + XCTAssertFalse(lineInput.contains(pattern: regex(#"^$"#))) // Does contain an empty line (between \n and \r, which are reversed here) let empty = "\n\r" - XCTAssertTrue(empty.contains(regex(#"^$"#).anchorsMatchLineEndings())) + XCTAssertTrue(empty.contains(pattern: regex(#"^$"#).anchorsMatchLineEndings())) } // RL1.7 Supplementary Code Points @@ -312,9 +312,9 @@ extension UTS18Tests { // surrogate followed by a trailing surrogate shall be handled as a single // code point in matching. func testSupplementaryCodePoints() { - XCTAssertTrue("πŸ‘".contains(regex(#"\u{1F44D}"#))) - XCTAssertTrue("πŸ‘".contains(regex(#"[\u{1F440}-\u{1F44F}]"#))) - XCTAssertTrue("πŸ‘πŸ‘Ž".contains(regex(#"^[\u{1F440}-\u{1F44F}]+$"#))) + XCTAssertTrue("πŸ‘".contains(pattern: regex(#"\u{1F44D}"#))) + XCTAssertTrue("πŸ‘".contains(pattern: regex(#"[\u{1F440}-\u{1F44F}]"#))) + XCTAssertTrue("πŸ‘πŸ‘Ž".contains(pattern: regex(#"^[\u{1F440}-\u{1F44F}]+$"#))) } } @@ -348,7 +348,7 @@ extension UTS18Tests { for (regexNum, regex) in regexes.enumerated() { for (equivNum, equiv) in equivalents.enumerated() { XCTAssertTrue( - equiv.contains(regex), + equiv.contains(pattern: regex), "Grapheme cluster semantics: Regex \(regexNum) didn't match with string \(equivNum)") } } @@ -359,11 +359,11 @@ extension UTS18Tests { let regex = regex.matchingSemantics(.unicodeScalar) if regexNum == equivNum { XCTAssertTrue( - equiv.contains(regex), + equiv.contains(pattern: regex), "Unicode scalar semantics: Regex \(regexNum) didn't match with string \(equivNum)") } else { XCTAssertFalse( - equiv.contains(regex), + equiv.contains(pattern: regex), "Unicode scalar semantics: Regex \(regexNum) incorrectly matched with string \(equivNum)") } } @@ -376,16 +376,16 @@ extension UTS18Tests { // matching against an arbitrary extended grapheme cluster, Character Classes // with Strings, and extended grapheme cluster boundaries. func testExtendedGraphemeClusters() { - XCTAssertTrue("abcdefπŸ‡¬πŸ‡­".contains(regex(#"abcdef.$"#))) - XCTAssertTrue("abcdefπŸ‡¬πŸ‡­".contains(regex(#"abcdef\X$"#))) - XCTAssertTrue("abcdefπŸ‡¬πŸ‡­".contains(regex(#"abcdef\X$"#).matchingSemantics(.unicodeScalar))) - XCTAssertTrue("abcdefπŸ‡¬πŸ‡­".contains(regex(#"abcdef.+\y"#).matchingSemantics(.unicodeScalar))) + XCTAssertTrue("abcdefπŸ‡¬πŸ‡­".contains(pattern: regex(#"abcdef.$"#))) + XCTAssertTrue("abcdefπŸ‡¬πŸ‡­".contains(pattern: regex(#"abcdef\X$"#))) + XCTAssertTrue("abcdefπŸ‡¬πŸ‡­".contains(pattern: regex(#"abcdef\X$"#).matchingSemantics(.unicodeScalar))) + XCTAssertTrue("abcdefπŸ‡¬πŸ‡­".contains(pattern: regex(#"abcdef.+\y"#).matchingSemantics(.unicodeScalar))) } func testCharacterClassesWithStrings() { let regex = regex(#"[a-zπŸ§πŸ‡§πŸ‡ͺπŸ‡§πŸ‡«πŸ‡§πŸ‡¬]"#) - XCTAssertTrue("🧐".contains(regex)) - XCTAssertTrue("πŸ‡§πŸ‡«".contains(regex)) + XCTAssertTrue("🧐".contains(pattern: regex)) + XCTAssertTrue("πŸ‡§πŸ‡«".contains(pattern: regex)) } // RL2.3 Default Word Boundaries @@ -411,55 +411,55 @@ extension UTS18Tests { // named characters. func testNameProperty() throws { // Name property - XCTAssertTrue("\u{FEFF}".contains(regex(#"\p{name=ZERO WIDTH NO-BREAK SPACE}"#))) + XCTAssertTrue("\u{FEFF}".contains(pattern: regex(#"\p{name=ZERO WIDTH NO-BREAK SPACE}"#))) // Name property and Matching Rules - XCTAssertTrue("\u{FEFF}".contains(regex(#"\p{name=zerowidthno breakspace}"#))) + XCTAssertTrue("\u{FEFF}".contains(pattern: regex(#"\p{name=zerowidthno breakspace}"#))) // Computed name - XCTAssertTrue("κ°•".contains(regex(#"\p{name=HANGUL SYLLABLE GANG}"#))) + XCTAssertTrue("κ°•".contains(pattern: regex(#"\p{name=HANGUL SYLLABLE GANG}"#))) // Graphic symbol - XCTAssertTrue("\u{1F514}".contains(regex(#"\p{name=BELL}"#))) + XCTAssertTrue("\u{1F514}".contains(pattern: regex(#"\p{name=BELL}"#))) // Name match failures - XCTAssertFalse("\u{FEFF}".contains(regex(#"\p{name=ZERO WIDTH NO-BRAKE SPACE}"#))) - XCTAssertFalse("\u{FEFF}".contains(regex(#"\p{name=ZERO WIDTH NO-BREAK SPACE ZZZZ}"#))) - XCTAssertFalse("\u{FEFF}".contains(regex(#"\p{name=ZERO WIDTH NO-BREAK}"#))) - XCTAssertFalse("\u{FEFF}".contains(regex(#"\p{name=z}"#))) + XCTAssertFalse("\u{FEFF}".contains(pattern: regex(#"\p{name=ZERO WIDTH NO-BRAKE SPACE}"#))) + XCTAssertFalse("\u{FEFF}".contains(pattern: regex(#"\p{name=ZERO WIDTH NO-BREAK SPACE ZZZZ}"#))) + XCTAssertFalse("\u{FEFF}".contains(pattern: regex(#"\p{name=ZERO WIDTH NO-BREAK}"#))) + XCTAssertFalse("\u{FEFF}".contains(pattern: regex(#"\p{name=z}"#))) } func testNameProperty_XFail() throws { XCTExpectFailure("Need more expansive name alias matching") { // Name_Alias property - XCTAssertTrue("\u{FEFF}".contains(regex(#"\p{name=BYTE ORDER MARK}"#))) + XCTAssertTrue("\u{FEFF}".contains(pattern: regex(#"\p{name=BYTE ORDER MARK}"#))) // Name_Alias property (again) - XCTAssertTrue("\u{FEFF}".contains(regex(#"\p{name=BOM}"#))) + XCTAssertTrue("\u{FEFF}".contains(pattern: regex(#"\p{name=BOM}"#))) // Control character - XCTAssertTrue("\u{7}".contains(regex(#"\p{name=BEL}"#))) + XCTAssertTrue("\u{7}".contains(pattern: regex(#"\p{name=BEL}"#))) } } func testIndividuallyNamedCharacters() { - XCTAssertTrue("\u{263A}".contains(regex(#"\N{WHITE SMILING FACE}"#))) - XCTAssertTrue("\u{3B1}".contains(regex(#"\N{GREEK SMALL LETTER ALPHA}"#))) - XCTAssertTrue("\u{10450}".contains(regex(#"\N{SHAVIAN LETTER PEEP}"#))) + XCTAssertTrue("\u{263A}".contains(pattern: regex(#"\N{WHITE SMILING FACE}"#))) + XCTAssertTrue("\u{3B1}".contains(pattern: regex(#"\N{GREEK SMALL LETTER ALPHA}"#))) + XCTAssertTrue("\u{10450}".contains(pattern: regex(#"\N{SHAVIAN LETTER PEEP}"#))) - XCTAssertTrue("\u{FEFF}".contains(regex(#"\N{ZERO WIDTH NO-BREAK SPACE}"#))) - XCTAssertTrue("κ°•".contains(regex(#"\N{HANGUL SYLLABLE GANG}"#))) - XCTAssertTrue("\u{1F514}".contains(regex(#"\N{BELL}"#))) - XCTAssertTrue("🐯".contains(regex(#"\N{TIGER FACE}"#))) - XCTAssertFalse("🐯".contains(regex(#"\N{TIEGR FACE}"#))) + XCTAssertTrue("\u{FEFF}".contains(pattern: regex(#"\N{ZERO WIDTH NO-BREAK SPACE}"#))) + XCTAssertTrue("κ°•".contains(pattern: regex(#"\N{HANGUL SYLLABLE GANG}"#))) + XCTAssertTrue("\u{1F514}".contains(pattern: regex(#"\N{BELL}"#))) + XCTAssertTrue("🐯".contains(pattern: regex(#"\N{TIGER FACE}"#))) + XCTAssertFalse("🐯".contains(pattern: regex(#"\N{TIEGR FACE}"#))) // Loose matching - XCTAssertTrue("\u{263A}".contains(regex(#"\N{whitesmilingface}"#))) - XCTAssertTrue("\u{263A}".contains(regex(#"\N{wHiTe_sMiLiNg_fAcE}"#))) - XCTAssertTrue("\u{263A}".contains(regex(#"\N{White Smiling-Face}"#))) - XCTAssertTrue("\u{FEFF}".contains(regex(#"\N{zerowidthno breakspace}"#))) + XCTAssertTrue("\u{263A}".contains(pattern: regex(#"\N{whitesmilingface}"#))) + XCTAssertTrue("\u{263A}".contains(pattern: regex(#"\N{wHiTe_sMiLiNg_fAcE}"#))) + XCTAssertTrue("\u{263A}".contains(pattern: regex(#"\N{White Smiling-Face}"#))) + XCTAssertTrue("\u{FEFF}".contains(pattern: regex(#"\N{zerowidthno breakspace}"#))) // Matching semantic level - XCTAssertFalse("πŸ‘©β€πŸ‘©β€πŸ‘§β€πŸ‘¦".contains(regex(#".\N{ZERO WIDTH JOINER}"#))) - XCTAssertTrue("πŸ‘©β€πŸ‘©β€πŸ‘§β€πŸ‘¦".contains(regex(#"(?u).\N{ZERO WIDTH JOINER}"#))) + XCTAssertFalse("πŸ‘©β€πŸ‘©β€πŸ‘§β€πŸ‘¦".contains(pattern: regex(#".\N{ZERO WIDTH JOINER}"#))) + XCTAssertTrue("πŸ‘©β€πŸ‘©β€πŸ‘§β€πŸ‘¦".contains(pattern: regex(#"(?u).\N{ZERO WIDTH JOINER}"#))) } func testIndividuallyNamedCharacters_XFail() { @@ -469,15 +469,15 @@ extension UTS18Tests { } XCTExpectFailure("Other named char failures -- investigate") { - XCTAssertTrue("\u{C}".contains(regex(#"\N{FORM FEED}"#))) - XCTAssertTrue("\u{FEFF}".contains(regex(#"\N{BYTE ORDER MARK}"#))) - XCTAssertTrue("\u{FEFF}".contains(regex(#"\N{BOM}"#))) - XCTAssertTrue("\u{7}".contains(regex(#"\N{BEL}"#))) + XCTAssertTrue("\u{C}".contains(pattern: regex(#"\N{FORM FEED}"#))) + XCTAssertTrue("\u{FEFF}".contains(pattern: regex(#"\N{BYTE ORDER MARK}"#))) + XCTAssertTrue("\u{FEFF}".contains(pattern: regex(#"\N{BOM}"#))) + XCTAssertTrue("\u{7}".contains(pattern: regex(#"\N{BEL}"#))) } XCTExpectFailure("Need to recognize invalid names at compile time") { XCTFail("This should be a compilation error, not a match failure:") - XCTAssertFalse("abc".contains(regex(#"\N{NOT AN ACTUAL CHARACTER NAME}"#))) + XCTAssertFalse("abc".contains(pattern: regex(#"\N{NOT AN ACTUAL CHARACTER NAME}"#))) } } @@ -551,9 +551,9 @@ extension UTS18Tests { // Case_Ignorable // Changes_When_Lowercased // Changes_When_Uppercased - XCTAssertTrue("a".contains(regex(#"\p{Changes_When_Uppercased}"#))) - XCTAssertTrue("a".contains(regex(#"\p{Changes_When_Uppercased=true}"#))) - XCTAssertFalse("A".contains(regex(#"\p{Changes_When_Uppercased}"#))) + XCTAssertTrue("a".contains(pattern: regex(#"\p{Changes_When_Uppercased}"#))) + XCTAssertTrue("a".contains(pattern: regex(#"\p{Changes_When_Uppercased=true}"#))) + XCTAssertFalse("A".contains(pattern: regex(#"\p{Changes_When_Uppercased}"#))) // Changes_When_Titlecased // Changes_When_Casefolded // Changes_When_Casemapped