// RUN: %empty-directory(%t) // RUN: cp %s %t/main.swift // RUN: %target-build-swift -Xfrontend -disable-access-control -module-name a %t/main.swift %S/../Inputs/SmallStringTestUtilities.swift -o %t.out -O // RUN: %target-codesign %t.out // RUN: %target-run %t.out // REQUIRES: executable_test // REQUIRES: CPU=arm64 || CPU=x86_64 // // Tests for small strings // import StdlibUnittest #if _runtime(_ObjC) import Foundation #endif var SmallStringTests = TestSuite("SmallStringTests") SmallStringTests.test("FitsInSmall") { func runTest(_ input: String) throws { let tiny = Array(input.utf8) // Constructed from UTF-8 code units guard let small = _SmallString(tiny) else { throw "Didn't fit" } verifySmallString(small, input) // Constructed from UTF-16 code units guard let fromUTF16Small = _SmallString(Array(input.utf16)) else { throw "Failed from utf-16" } verifySmallString(fromUTF16Small, input) } // Pass tests // expectDoesNotThrow({ try runTest("ab😇c") }) expectDoesNotThrow({ try runTest("0123456789abcde") }) expectDoesNotThrow({ try runTest("👨‍👦") }) expectDoesNotThrow({ try runTest("") }) // Fail tests // expectThrows("Didn't fit", { try runTest("0123456789abcdef") }) expectThrows("Didn't fit", { try runTest("👩‍👦‍👦") }) for cu in (0 as UInt32)...(0x10FFFF as UInt32) { // TODO: Iterate over all scalars when we support UTF-8, and possibly move // this to validation suite. guard let scalar = Unicode.Scalar(cu) else { continue } guard cu <= 0x7F else { break } expectDoesNotThrow({ try runTest(String(scalar)) }) } } SmallStringTests.test("Append, repeating") { let strings = [ "", "a", "bc", "def", "hijk", "lmnop", "qrstuv", "xyzzzzz", "01234567", "890123456", "7890123456", "78901234567", "890123456789", "0123456789012", "34567890123456", "789012345678901", ] let smallstrings = strings.compactMap { _SmallString(Array($0.utf8)) } expectEqual(strings.count, smallstrings.count) for (small, str) in zip(smallstrings, strings) { verifySmallString(small, str) } for i in 0.. _SmallString.capacity { continue } verifySmallString(lhs._appending(rhs)!, (strings[i] + strings[j])) verifySmallString(rhs._appending(lhs)!, (strings[j] + strings[i])) } } for i in 0.. 15) } } } } runAllTests()