| // RUN: %target-run-simple-swift |
| // REQUIRES: executable_test |
| |
| import StdlibUnittest |
| |
| var CharacterPropertiesTests = TestSuite("StringTests") |
| |
| CharacterPropertiesTests.test("ASCII queries") { |
| for cu in (0 as UInt32)...(0x7F as UInt32) { |
| let c = Character(Unicode.Scalar(cu)!) |
| expectTrue(c.isASCII) |
| expectEqual(cu, UInt32(c.asciiValue!)) |
| } |
| expectTrue(Character("\r\n").isASCII) |
| expectEqual(Character("\n").asciiValue, Character("\r\n").asciiValue) |
| |
| expectFalse(Character("⅚").isASCII) |
| expectFalse(Character("“").isASCII) |
| expectFalse(Character("e\u{301}").isASCII) |
| } |
| |
| CharacterPropertiesTests.test("Hex queries") { |
| let hexDigits: Array<Character> = [ |
| "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", // 0-9 |
| "a", "b", "c", "d", "e", "f", // 10-15 |
| "A", "B", "C", "D", "E", "F", // 16-21 |
| "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", // 22-31 |
| "A", "B", "C", "D", "E", "F", // 32-37 |
| "a", "b", "c", "d", "e", "f", // 38-43 |
| ] |
| |
| // Ensure below loop logic is correct with a couple hard-coded checks |
| expectEqual(1, Character("1").hexDigitValue!) |
| expectEqual(2, Character("2").hexDigitValue!) |
| expectEqual(11, Character("B").hexDigitValue!) |
| expectEqual(12, Character("c").hexDigitValue!) |
| expectEqual(14, Character("e").hexDigitValue!) |
| expectEqual(15, Character("f").hexDigitValue!) |
| |
| for i in hexDigits.indices { |
| let hexValue = hexDigits[i].hexDigitValue! |
| switch i { |
| case 0...15: expectEqual(i, hexValue) |
| case 16...21: expectEqual(i-6, hexValue) |
| case 22...37: expectEqual(i-22, hexValue) |
| case 38...43: expectEqual(i-28, hexValue) |
| default: print(i); fatalError("unreachable") |
| } |
| } |
| |
| expectNil(Character("㊈").hexDigitValue) |
| expectNil(Character("Ⅴ").hexDigitValue) |
| expectNil(Character("7\u{301}").hexDigitValue) |
| } |
| |
| CharacterPropertiesTests.test("Numbers") { |
| // Some hard coded tests |
| expectTrue(Character("⅚").isNumber) |
| expectTrue(Character("5️⃣").isNumber) |
| expectTrue(Character("𝟠").isNumber) |
| expectTrue(Character("㊈").isNumber) |
| expectTrue(Character("7").isNumber) |
| expectTrue(Character("𐹾").isNumber) // RUMI FRACTION 2/3 |
| |
| expectFalse(Character("A").isNumber) |
| expectFalse(Character("Z").isNumber) |
| } |
| |
| CharacterPropertiesTests.test("Whole Numbers") { |
| // Random smattering of hard-coded tests |
| expectEqual(0, Character("↉").wholeNumberValue) // baseball scoring |
| expectEqual(0, Character("𝟶").wholeNumberValue) // math monospace |
| expectEqual(1, Character("1").wholeNumberValue) |
| expectEqual(1, Character("𒐴").wholeNumberValue) |
| expectEqual(1, Character("ⅰ").wholeNumberValue) // small roman numeral |
| expectEqual(1, Character("𝟏").wholeNumberValue) // math bold |
| expectEqual(2, Character("②").wholeNumberValue) |
| expectEqual(2, Character("٢").wholeNumberValue) |
| expectEqual(2, Character("২").wholeNumberValue) |
| expectEqual(2, Character("੨").wholeNumberValue) |
| expectEqual(2, Character("૨").wholeNumberValue) |
| expectEqual(3, Character("³").wholeNumberValue) |
| expectEqual(4, Character("٤").wholeNumberValue) |
| expectEqual(4, Character("൪").wholeNumberValue) |
| expectEqual(4, Character("೪").wholeNumberValue) |
| expectEqual(4, Character("౪").wholeNumberValue) |
| expectEqual(4, Character("௪").wholeNumberValue) |
| expectEqual(4, Character("୪").wholeNumberValue) |
| expectEqual(4, Character("૪").wholeNumberValue) |
| expectEqual(4, Character("੪").wholeNumberValue) |
| expectEqual(4, Character("๔").wholeNumberValue) |
| expectEqual(4, Character("໔").wholeNumberValue) |
| expectEqual(5, Character("५").wholeNumberValue) |
| expectEqual(5, Character("༥").wholeNumberValue) |
| expectEqual(5, Character("፭").wholeNumberValue) |
| expectEqual(5, Character("᠕").wholeNumberValue) |
| expectEqual(5, Character("Ⅴ").wholeNumberValue) // Roman numeral |
| expectEqual(5, Character("𐌡").wholeNumberValue) |
| expectEqual(5, Character("߅").wholeNumberValue) |
| expectEqual(5, Character("᭕").wholeNumberValue) |
| expectEqual(5, Character("𝍤").wholeNumberValue) |
| expectEqual(5, Character("᮵").wholeNumberValue) |
| expectEqual(6, Character("六").wholeNumberValue) |
| expectEqual(6, Character("六").wholeNumberValue) // Compatibility |
| expectEqual(7, Character("𝟩").wholeNumberValue) // Math san-serif |
| expectEqual(7, Character("㈦").wholeNumberValue) |
| expectEqual(7, Character("㊆").wholeNumberValue) |
| expectEqual(7, Character("𑁭").wholeNumberValue) |
| expectEqual(8, Character("꧘").wholeNumberValue) |
| expectEqual(8, Character("᪈").wholeNumberValue) |
| expectEqual(8, Character("᪘").wholeNumberValue) |
| expectEqual(8, Character("꩘").wholeNumberValue) |
| expectEqual(9, Character("๙").wholeNumberValue) |
| |
| expectEqual(18, Character("⒅").wholeNumberValue) |
| expectEqual(20, Character("⑳").wholeNumberValue) |
| expectEqual(20, Character("𐄑").wholeNumberValue) |
| expectEqual(20, Character("𐏔").wholeNumberValue) |
| expectEqual(20, Character("𐤘").wholeNumberValue) |
| expectEqual(20, Character("〹").wholeNumberValue) |
| expectEqual(50, Character("ↆ").wholeNumberValue) |
| expectEqual(70, Character("𑁡").wholeNumberValue) |
| expectEqual(90, Character("𐍁").wholeNumberValue) |
| expectEqual(1_000, Character("𑁥").wholeNumberValue) |
| expectEqual(5_000, Character("ↁ").wholeNumberValue) |
| expectEqual(10_000, Character("万").wholeNumberValue) |
| |
| expectFalse(Character("7\u{301}").isWholeNumber) |
| } |
| |
| CharacterPropertiesTests.test("Casing") { |
| let eAccent = Character("\u{0065}\u{0301}") |
| let EAccent = Character("\u{0045}\u{0301}") |
| expectTrue(eAccent.isLowercase && eAccent.isCased) |
| expectFalse(eAccent.isUppercase) |
| expectTrue(EAccent.isUppercase && EAccent.isCased) |
| expectFalse(EAccent.isLowercase) |
| |
| expectTrue(Character("И").isUppercase) |
| expectTrue(Character("и").isLowercase) |
| expectTrue(Character("Π").isUppercase) |
| expectTrue(Character("π").isLowercase) |
| |
| expectEqual("SS", Character("ß").uppercased()) |
| |
| // Some versions of ICU on Linux (62.1) have a bug producing the wrong value |
| // when lowercasing "ẞ". Darwin platforms never shipped this version, so |
| // conditionally test based on platform. |
| #if canImport(Darwin) |
| expectEqual("ß", Character("ẞ").lowercased()) |
| #endif |
| |
| expectEqual("и", Character("И").lowercased()) |
| expectEqual("И", Character("и").uppercased()) |
| expectEqual("π", Character("Π").lowercased()) |
| expectEqual("Π", Character("π").uppercased()) |
| } |
| |
| CharacterPropertiesTests.test("Punctuation") { |
| expectTrue(Character("!").isPunctuation) |
| expectTrue(Character("؟").isPunctuation) |
| expectTrue(Character("…").isPunctuation) |
| expectTrue(Character("—").isPunctuation) |
| expectTrue(Character("“").isPunctuation) |
| |
| expectTrue(Character("﹏").isPunctuation) // compatibility |
| } |
| |
| CharacterPropertiesTests.test("Symbols") { |
| // Other symbols |
| expectTrue(Character("🌍").isSymbol) |
| expectTrue(Character("👽").isSymbol) |
| expectTrue(Character("®").isSymbol) |
| expectTrue(Character("⌹").isSymbol) |
| expectTrue(Character("⡆").isSymbol) |
| |
| // Currency |
| expectTrue(Character("$").isCurrencySymbol) |
| expectTrue(Character("¥").isCurrencySymbol) |
| expectTrue(Character("€").isCurrencySymbol) |
| |
| // Math symbols |
| expectTrue(Character("∩").isSymbol) |
| expectTrue(Character("∩").isMathSymbol) |
| expectTrue(Character("+").isSymbol) |
| expectTrue(Character("+").isMathSymbol) |
| expectTrue(Character("⟺").isSymbol) |
| expectTrue(Character("⟺").isMathSymbol) |
| expectTrue(Character("∫").isSymbol) |
| expectTrue(Character("∫").isMathSymbol) |
| |
| // Math symbols that are letters |
| expectFalse(Character("ϰ").isSymbol) |
| expectTrue(Character("ϰ").isMathSymbol) |
| } |
| |
| CharacterPropertiesTests.test("Whitespace") { |
| expectTrue(Character("\t").isWhitespace) |
| expectTrue(Character(" ").isWhitespace) |
| expectTrue(Character("\u{2029}").isWhitespace) |
| expectTrue(Character("\u{3000}").isWhitespace) |
| } |
| |
| CharacterPropertiesTests.test("Newline") { |
| expectTrue(Character("\n").isNewline) |
| expectTrue(Character("\r").isNewline) |
| expectTrue(Character("\r\n").isNewline) |
| expectTrue(Character("\u{0085}").isNewline) |
| expectTrue(Character("\u{2028}").isNewline) |
| expectTrue(Character("\u{2029}").isNewline) |
| } |
| |
| runAllTests() |
| |