Files
swift-mirror/test/stdlib/CharacterProperties.swift
2018-11-27 10:22:52 -05:00

215 lines
8.1 KiB
Swift
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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
"", "", "", "", "", "", "", "", "", "", // 22-31
"", "", "", "", "", "", // 32-37
"", "", "", "", "", "", // 38-43
]
// Ensure below loop logic is correct with a couple hard-coded checks
expectEqual(1, Character("1").hexDigitValue!)
expectEqual(2, Character("").hexDigitValue!)
expectEqual(11, Character("").hexDigitValue!)
expectEqual(12, Character("c").hexDigitValue!)
expectEqual(14, Character("").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()