blob: bb4893ccecf6b55d2ec4d4c4f4b8ed471a80bd56 [file] [log] [blame]
// RUN: %target-run-simple-swiftgyb
// REQUIRES: executable_test
// This test requires that the standard library calls ICU
// directly. It is not specific to Linux, it is just that on
// Apple platforms we are using the NSString bridge right now.
// REQUIRES: OS=linux-gnu
import StdlibUnittest
import StdlibUnicodeUnittest
func assertASCIIRepresentationIfPossible(_ s: String) {
for us in s.unicodeScalars {
if !us.isASCII {
return
}
}
precondition(s._core.isASCII)
}
func forceUTF16Representation(_ s: String) -> String {
var s = s
s += "\u{fffd}"
s.removeSubrange(s.index(before: s.endIndex)..<s.endIndex)
precondition(!s._core.isASCII)
return s
}
func calculateSortOrder(_ tests: inout [StringComparisonTest]) {
tests.sort {
collationElements(
$0.collationElements,
areLessThan: $1.collationElements
)
}
tests[0].order = 0
for i in tests.indices.dropFirst() {
if collationElements(
tests[i - 1].collationElements,
areLessThan: tests[i].collationElements
) {
tests[i].order = tests[i - 1].order! + 1
} else {
tests[i].order = tests[i - 1].order!
}
}
}
func checkStringHashableComparable(
_ tests: [StringComparisonTest],
stackTrace: SourceLocStack = SourceLocStack(),
file: String = #file, line: UInt = #line
) {
var tests = tests
calculateSortOrder(&tests)
func comparisonOracle(_ i: Int, _ j: Int) -> ExpectedComparisonResult {
return tests[i].order! <=> tests[j].order!
}
checkHashable(
tests.map { $0.string },
equalityOracle: { comparisonOracle($0, $1).isEQ() },
stackTrace: stackTrace.pushIf(true, file: file, line: line))
checkComparable(
tests.map { $0.string },
oracle: comparisonOracle,
stackTrace: stackTrace.pushIf(true, file: file, line: line))
}
var StringTests = TestSuite("StringTests")
StringTests.test("StringComparisonTest.allTests: tests are in ASCII representation")
.forEach(in: StringComparisonTest.allTests) {
test in
assertASCIIRepresentationIfPossible(test.string)
}
StringTests.test("Comparable") {
let allTestsInUTF16Representation = StringComparisonTest.allTests.map {
test -> StringComparisonTest in
return StringComparisonTest(
forceUTF16Representation(test.string),
test.collationElements,
sourceLocation: SourceLoc(
test.loc.file,
test.loc.line,
comment: (test.loc.comment ?? "") + "\nin Unicode representation"))
}
checkStringHashableComparable(StringComparisonTest.allTests + allTestsInUTF16Representation)
}
runAllTests()