Files
swift-mirror/test/stdlib/Span/InlineSpanProperties.swift
2025-04-09 09:56:06 -07:00

149 lines
4.2 KiB
Swift

//===--- InlineSpanProperties.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(-enable-experimental-feature AddressableTypes -enable-experimental-feature LifetimeDependence -enable-experimental-feature ValueGenerics)
// REQUIRES: executable_test
// REQUIRES: swift_feature_AddressableTypes
// REQUIRES: swift_feature_LifetimeDependence
// REQUIRES: swift_feature_ValueGenerics
import StdlibUnittest
var suite = TestSuite("Span properties backed by inline storage")
defer { runAllTests() }
suite.test("CollectionOfOne.span 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 s = "A long string that is absolutely not smol at all."
let u = Array(s.utf8)
let c = CollectionOfOne(consume s)
s = ""
let span = c.span
expectEqual(span.count, 1)
let v = Array(span[0].utf8)
expectEqual(u, v)
}
suite.test("CollectionOfOne.span property (simple)")
.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 c = CollectionOfOne(Int.random(in: 0..<100000))
let span = c.span
expectEqual(span.count, c.indices.count)
expectEqual(span[0], c[0])
}
struct Padded: BitwiseCopyable {
var storage: (Int64, Int8)
}
suite.test("CollectionOfOne.span stride test")
.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 c = CollectionOfOne(Padded(storage: (-1, 1)))
let span = c.span
let bytes = span.bytes
expectEqual(bytes.byteCount, MemoryLayout.size(ofValue: c))
}
suite.test("CollectionOfOne.mutableSpan property (simple)")
.require(.stdlib_6_2).code {
guard #available(SwiftStdlib 6.2, *) else { return }
var c = CollectionOfOne(Int.random(in: 0..<100000))
expectEqual(c.count, 1)
var span = c.mutableSpan
expectEqual(span.count, 1)
span[0] = Int.random(in: .min..<0)
let r = span[0]
expectEqual(c[0], r)
}
suite.test("InlineArray.span 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 s = InlineArray<5, Int>(repeating: 0)
s[3] = .random(in: 0..<1000)
let span = s.span
expectEqual(span.count, s.count)
for i in s.indices {
expectEqual(span[i], s[i])
}
}
suite.test("InlineArray.span property (String)")
.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 = InlineArray<5, String>(repeating: "0")
s[3] = String(Int.random(in: 0..<1000))
let span = s.span
expectEqual(span.count, s.count)
for i in s.indices {
expectEqual(span[i], s[i])
}
}
suite.test("InlineArray.mutableSpan property")
.require(.stdlib_6_2).code
{
guard #available(SwiftStdlib 6.2, *) else { return }
var v = InlineArray<5, Int>(repeating: 0)
let c = v.count
var span = v.mutableSpan
expectEqual(span.count, c)
span[3] = Int.random(in: .min..<0)
let r = span[3]
expectEqual(v[3], r)
}
suite.test("InlineArray.mutableSpan property (String)")
.require(.stdlib_6_2).code
{
guard #available(SwiftStdlib 6.2, *) else { return }
var v = InlineArray<5, String>(repeating: "0")
let c = v.count
var span = v.mutableSpan
expectEqual(span.count, c)
span[3] = String(repeating: "0", count: Int.random(in: 100..<500))
let s = span[3]
expectTrue(s._isIdentical(to: v[3]))
}