| // 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() |
| |