@@ -95,7 +95,6 @@ class TestNSString : XCTestCase {
95
95
( " test_ExternalRepresentation " , test_ExternalRepresentation) ,
96
96
( " test_mutableStringConstructor " , test_mutableStringConstructor) ,
97
97
( " test_emptyStringPrefixAndSuffix " , test_emptyStringPrefixAndSuffix) ,
98
- ( " test_PrefixSuffix " , test_PrefixSuffix) ,
99
98
( " test_reflection " , { _ in test_reflection } ) ,
100
99
( " test_replacingOccurrences " , test_replacingOccurrences) ,
101
100
( " test_getLineStart " , test_getLineStart) ,
@@ -1210,225 +1209,6 @@ class TestNSString : XCTestCase {
1210
1209
}
1211
1210
}
1212
1211
1213
- struct ComparisonTest {
1214
- enum TestBehavior {
1215
- case run
1216
- case expectedFailure( String )
1217
- case skip( String )
1218
- }
1219
- let lhs : String
1220
- let rhs : String
1221
- let loc : UInt
1222
- let behavior : TestBehavior
1223
-
1224
- var expectedFailure : Bool {
1225
- if case . expectedFailure = behavior {
1226
- return true
1227
- } else {
1228
- return false
1229
- }
1230
- }
1231
-
1232
- init (
1233
- _ lhs: String , _ rhs: String ,
1234
- expectedFailure xfailReason: String = " " ,
1235
- skip skipReason: String = " " ,
1236
- line: UInt = #line
1237
- ) {
1238
- self . lhs = lhs
1239
- self . rhs = rhs
1240
- self . loc = line
1241
-
1242
- switch ( xfailReason. isEmpty, skipReason. isEmpty) {
1243
- case ( false , true ) :
1244
- behavior = . expectedFailure( xfailReason)
1245
- case ( _, false ) :
1246
- behavior = . skip( skipReason)
1247
- default :
1248
- behavior = . run
1249
- }
1250
- }
1251
- }
1252
-
1253
- let comparisonTests : [ ComparisonTest ] = [
1254
- ComparisonTest ( " " , " " ) ,
1255
- ComparisonTest ( " " , " a " ) ,
1256
-
1257
- // ASCII cases
1258
- ComparisonTest ( " t " , " tt " ) ,
1259
- ComparisonTest ( " t " , " Tt " ) ,
1260
- ComparisonTest ( " \u{0} " , " " ,
1261
- skip: " rdar://problem/37686816 " ) ,
1262
- ComparisonTest ( " \u{0} " , " \u{0} " ,
1263
- expectedFailure: " https://bugs.swift.org/browse/SR-332 " ) ,
1264
- ComparisonTest ( " \r \n " , " t " ) ,
1265
- ComparisonTest ( " \r \n " , " \n " ,
1266
- expectedFailure: " blocked on rdar://problem/19036555 " ) ,
1267
- ComparisonTest ( " \u{0} " , " \u{0} \u{0} " ,
1268
- expectedFailure: " rdar://problem/19034601 " ) ,
1269
-
1270
- // Whitespace
1271
- // U+000A LINE FEED (LF)
1272
- // U+000B LINE TABULATION
1273
- // U+000C FORM FEED (FF)
1274
- // U+0085 NEXT LINE (NEL)
1275
- // U+2028 LINE SEPARATOR
1276
- // U+2029 PARAGRAPH SEPARATOR
1277
- ComparisonTest ( " \u{0085} " , " \n " ) ,
1278
- ComparisonTest ( " \u{000b} " , " \n " ) ,
1279
- ComparisonTest ( " \u{000c} " , " \n " ) ,
1280
- ComparisonTest ( " \u{2028} " , " \n " ) ,
1281
- ComparisonTest ( " \u{2029} " , " \n " ) ,
1282
- ComparisonTest ( " \r \n \r \n " , " \r \n " ) ,
1283
-
1284
- // U+0301 COMBINING ACUTE ACCENT
1285
- // U+00E1 LATIN SMALL LETTER A WITH ACUTE
1286
- ComparisonTest ( " a \u{301} " , " \u{e1} " ) ,
1287
- ComparisonTest ( " a " , " a \u{301} " ) ,
1288
- ComparisonTest ( " a " , " \u{e1} " ) ,
1289
-
1290
- // U+304B HIRAGANA LETTER KA
1291
- // U+304C HIRAGANA LETTER GA
1292
- // U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
1293
- ComparisonTest ( " \u{304b} " , " \u{304b} " ) ,
1294
- ComparisonTest ( " \u{304c} " , " \u{304c} " ) ,
1295
- ComparisonTest ( " \u{304b} " , " \u{304c} " ) ,
1296
- ComparisonTest ( " \u{304b} " , " \u{304c} \u{3099} " ) ,
1297
- ComparisonTest ( " \u{304c} " , " \u{304b} \u{3099} " ) ,
1298
- ComparisonTest ( " \u{304c} " , " \u{304c} \u{3099} " ) ,
1299
-
1300
- // U+212B ANGSTROM SIGN
1301
- // U+030A COMBINING RING ABOVE
1302
- // U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
1303
- ComparisonTest ( " \u{212b} " , " A \u{30a} " ) ,
1304
- ComparisonTest ( " \u{212b} " , " \u{c5} " ) ,
1305
- ComparisonTest ( " A \u{30a} " , " \u{c5} " ) ,
1306
- ComparisonTest ( " A \u{30a} " , " a " ) ,
1307
- ComparisonTest ( " A " , " A \u{30a} " ) ,
1308
-
1309
- // U+2126 OHM SIGN
1310
- // U+03A9 GREEK CAPITAL LETTER OMEGA
1311
- ComparisonTest ( " \u{2126} " , " \u{03a9} " ) ,
1312
-
1313
- // U+0323 COMBINING DOT BELOW
1314
- // U+0307 COMBINING DOT ABOVE
1315
- // U+1E63 LATIN SMALL LETTER S WITH DOT BELOW
1316
- // U+1E69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
1317
- ComparisonTest ( " \u{1e69} " , " s \u{323} \u{307} " ) ,
1318
- ComparisonTest ( " \u{1e69} " , " s \u{307} \u{323} " ) ,
1319
- ComparisonTest ( " \u{1e69} " , " \u{1e63} \u{307} " ) ,
1320
- ComparisonTest ( " \u{1e63} " , " s \u{323} " ) ,
1321
- ComparisonTest ( " \u{1e63} \u{307} " , " s \u{323} \u{307} " ) ,
1322
- ComparisonTest ( " \u{1e63} \u{307} " , " s \u{307} \u{323} " ) ,
1323
- ComparisonTest ( " s \u{323} " , " \u{1e69} " ) ,
1324
-
1325
- // U+FB01 LATIN SMALL LIGATURE FI
1326
- ComparisonTest ( " \u{fb01} " , " \u{fb01} " ) ,
1327
- ComparisonTest ( " fi " , " \u{fb01} " ) ,
1328
-
1329
- // U+1F1E7 REGIONAL INDICATOR SYMBOL LETTER B
1330
- // \u{1F1E7}\u{1F1E7} Flag of Barbados
1331
- ComparisonTest ( " \u{1F1E7} " , " \u{1F1E7} \u{1F1E7} " ) ,
1332
-
1333
- // Test that Unicode collation is performed in deterministic mode.
1334
- //
1335
- // U+0301 COMBINING ACUTE ACCENT
1336
- // U+0341 COMBINING ACUTE TONE MARK
1337
- // U+0954 DEVANAGARI ACUTE ACCENT
1338
- //
1339
- // Collation elements from DUCET:
1340
- // 0301 ; [.0000.0024.0002] # COMBINING ACUTE ACCENT
1341
- // 0341 ; [.0000.0024.0002] # COMBINING ACUTE TONE MARK
1342
- // 0954 ; [.0000.0024.0002] # DEVANAGARI ACUTE ACCENT
1343
- //
1344
- // U+0301 and U+0954 don't decompose in the canonical decomposition mapping.
1345
- // U+0341 has a canonical decomposition mapping of U+0301.
1346
- ComparisonTest ( " \u{0301} " , " \u{0341} " ) ,
1347
- ComparisonTest ( " \u{0301} " , " \u{0954} " ) ,
1348
- ComparisonTest ( " \u{0341} " , " \u{0954} " ) ,
1349
- ]
1350
-
1351
- enum Stack : Swift . Error {
1352
- case Stack( [ UInt ] )
1353
- }
1354
-
1355
- func checkHasPrefixHasSuffix( _ lhs: String , _ rhs: String , _ stack: [ UInt ] ) -> Int {
1356
- if ( lhs == " " && rhs == " " ) {
1357
- var failures = 0
1358
- failures += lhs. hasPrefix ( rhs) ? 0 : 1
1359
- failures += lhs. hasSuffix ( rhs) ? 0 : 1
1360
- return failures
1361
- } else if lhs == " " {
1362
- var failures = 0
1363
- failures += lhs. hasPrefix ( rhs) ? 1 : 0
1364
- failures += lhs. hasSuffix ( rhs) ? 1 : 0
1365
- return failures
1366
- } else if rhs == " " {
1367
- var failures = 0
1368
- failures += lhs. hasPrefix ( rhs) ? 0 : 1
1369
- failures += lhs. hasSuffix ( rhs) ? 0 : 1
1370
- return failures
1371
- }
1372
-
1373
- // To determine the expected results, compare grapheme clusters,
1374
- // scalar-to-scalar, of the NFD form of the strings.
1375
- let lhsNFDGraphemeClusters =
1376
- lhs. decomposedStringWithCanonicalMapping. map {
1377
- Array ( String ( $0) . unicodeScalars)
1378
- }
1379
- let rhsNFDGraphemeClusters =
1380
- rhs. decomposedStringWithCanonicalMapping. map {
1381
- Array ( String ( $0) . unicodeScalars)
1382
- }
1383
- let expectHasPrefix = lhsNFDGraphemeClusters. starts (
1384
- with: rhsNFDGraphemeClusters, by: ( == ) )
1385
- let expectHasSuffix =
1386
- lhsNFDGraphemeClusters. lazy. reversed ( ) . starts (
1387
- with: rhsNFDGraphemeClusters. lazy. reversed ( ) , by: ( == ) )
1388
-
1389
- func testFailure( _ lhs: Bool , _ rhs: Bool , _ stack: [ UInt ] ) -> Int {
1390
- guard lhs == rhs else {
1391
- // print(stack)
1392
- return 1
1393
- }
1394
- return 0
1395
- }
1396
-
1397
- var failures = 0
1398
- failures += testFailure ( expectHasPrefix, lhs. hasPrefix ( rhs) , stack + [ #line] )
1399
- failures += testFailure ( expectHasSuffix, lhs. hasSuffix ( rhs) , stack + [ #line] )
1400
- return failures
1401
- }
1402
-
1403
- extension TestNSString {
1404
- func test_PrefixSuffix( ) {
1405
- for test in comparisonTests {
1406
- if case . skip = test. behavior {
1407
- continue
1408
- }
1409
-
1410
- var failures = 0
1411
- failures += checkHasPrefixHasSuffix ( test. lhs, test. rhs, [ test. loc, #line] )
1412
- failures += checkHasPrefixHasSuffix ( test. rhs, test. lhs, [ test. loc, #line] )
1413
-
1414
- let fragment = " abc "
1415
- let combiner = " \u{0301} "
1416
-
1417
- failures += checkHasPrefixHasSuffix ( test. lhs + fragment, test. rhs, [ test. loc, #line] )
1418
- failures += checkHasPrefixHasSuffix ( fragment + test. lhs, test. rhs, [ test. loc, #line] )
1419
- failures += checkHasPrefixHasSuffix ( test. lhs + combiner, test. rhs, [ test. loc, #line] )
1420
- failures += checkHasPrefixHasSuffix ( combiner + test. lhs, test. rhs, [ test. loc, #line] )
1421
-
1422
- let fail = ( failures > 0 )
1423
- if fail {
1424
- // print("Prefix/Suffix case \(test.loc): \(failures) failures")
1425
- // print("Failures were\(test.expectedFailure ? "" : " not") expected")
1426
- }
1427
- XCTAssert ( test. expectedFailure == fail, " Unexpected \( test. expectedFailure ? " success " : " failure " ) : \( test. loc) " )
1428
- }
1429
- }
1430
- }
1431
-
1432
1212
func test_reflection( ) {
1433
1213
}
1434
1214
0 commit comments