blob: 930f1da81c01419f7e6383f31162dff84c4cfc43 [file] [log] [blame]
// 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()