//===--- MutableRawSpanTests.swift ----------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2025 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // RUN: %target-run-stdlib-swift // REQUIRES: executable_test import StdlibUnittest var suite = TestSuite("MutableRawSpan Tests") defer { runAllTests() } suite.test("Basic Initializer") .skip(.custom( { if #available(SwiftStdlib 6.2, *) { false } else { true } }, reason: "Requires Swift 6.2's standard library" )) .code { guard #available(SwiftStdlib 6.2, *) else { return } var s = Array("\(#file)+\(#function)--\(Int.random(in: 1000...9999))".utf8) s.withUnsafeMutableBytes { var b = MutableRawSpan(_unsafeBytes: $0) expectEqual(b.byteCount, $0.count) expectFalse(b.isEmpty) expectEqual(b.byteOffsets, 0..<$0.count) b = MutableRawSpan() expectEqual(b.byteCount, 0) } } private struct Padded: BitwiseCopyable { var storage: (Int64, Int8) } suite.test("Initializer from MutableSpan") .require(.stdlib_6_2).code { guard #available(SwiftStdlib 6.2, *) else { return } var array = [0, 1, 2].map({ Padded(storage: (Int64($0), Int8($0))) }) array.withUnsafeMutableBufferPointer { var span = MutableSpan(_unsafeElements: $0) var rawSpan = MutableRawSpan(_elements: &span) expectEqual(rawSpan.byteCount, $0.count * MemoryLayout.stride) rawSpan.storeBytes(of: 15, as: Int64.self) } expectEqual(array[0].storage.0, 15) var slice = array.prefix(1) slice.withUnsafeMutableBufferPointer { expectEqual($0.count, 1) var span = MutableSpan(_unsafeElements: $0) var rawSpan = MutableRawSpan(_elements: &span) expectEqual(rawSpan.byteCount, MemoryLayout.size) rawSpan.storeBytes(of: 3, as: Int64.self) } expectEqual(slice[0].storage.0, 3) } suite.test("isEmpty property") .skip(.custom( { if #available(SwiftStdlib 6.2, *) { false } else { true } }, reason: "Requires Swift 6.2's standard library" )) .code { guard #available(SwiftStdlib 6.2, *) else { return } var array = [0, 1, 2] array.withUnsafeMutableBufferPointer { var span = MutableRawSpan(_unsafeElements: $0) expectFalse(span.isEmpty) let e = $0.extracting(0..<0) span = MutableRawSpan(_unsafeElements: e) expectTrue(span.isEmpty) } } suite.test("indices property") .skip(.custom( { if #available(SwiftStdlib 6.2, *) { false } else { true } }, reason: "Requires Swift 6.2's standard library" )) .code { guard #available(SwiftStdlib 6.2, *) else { return } let capacity = 4 as UInt8 var a = Array(0...stride let s0 = span.unsafeLoad(as: String.self) expectEqual(s0.contains("0"), true) let s1 = span.unsafeLoad(fromByteOffset: stride, as: String.self) expectEqual(s1.contains("1"), true) let s2 = span.unsafeLoad(fromUncheckedByteOffset: 2*stride, as: String.self) expectEqual(s2.contains("2"), true) } } suite.test("unsafeLoadUnaligned(as:)") .skip(.custom( { if #available(SwiftStdlib 6.2, *) { false } else { true } }, reason: "Requires Swift 6.2's standard library" )) .code { guard #available(SwiftStdlib 6.2, *) else { return } let capacity = 64 var a = Array(0...stride/2, as: UInt.self ) } expectEqual(a[0].littleEndian & 0xffff, 0xff) expectEqual(a[0].bigEndian & 0xffff, 0xffff) } suite.test("_mutatingExtracting()") .skip(.custom( { if #available(SwiftStdlib 6.2, *) { false } else { true } }, reason: "Requires Swift 6.2's standard library" )) .code { guard #available(SwiftStdlib 6.2, *) else { return } let capacity = 4 var b = (0...stride, alignment: MemoryLayout.alignment ) defer { b.deallocate() } _ = b.initializeMemory(as: Int64.self, fromContentsOf: 0..