Files
swift-mirror/validation-test/stdlib/UnicodeScalarProperties.swift
2025-01-15 14:09:57 -08:00

273 lines
9.8 KiB
Swift

// RUN: %target-run-simple-swift %S/../../utils/gen-unicode-data/Data/16/
// REQUIRES: executable_test
// REQUIRES: long_test
// REQUIRES: optimized_stdlib
// REQUIRES: objc_interop
// This test requires access to Unicode data files in the source tree, so
// it doesn't currently support testing on a remote device. (rdar://98993795)
// UNSUPPORTED: remote_run
// UNSUPPORTED: device_run
@_spi(_Unicode)
import Swift
import StdlibUnittest
import StdlibUnicodeUnittest
var UnicodeScalarPropertiesTest = TestSuite("UnicodeScalarProperties")
//===----------------------------------------------------------------------===//
// Binary Properties
//===----------------------------------------------------------------------===//
if #available(SwiftStdlib 6.1, *) {
UnicodeScalarPropertiesTest.test("Binary Properties") {
// First, check that we correctly parsed the unicode data tables to be able
// to test against.
// We have 48 properties, but some properties have 'Other_' properties which
// are included in them, so count those as well.
expectEqual(56, binaryProperties.keys.count)
for i in 0x0 ... 0x10FFFF {
guard let scalar = Unicode.Scalar(i) else {
continue
}
func check(_ property: String) -> Bool {
binaryProperties[property]!.contains(scalar)
}
let props = scalar.properties
expectEqual(props.isAlphabetic, check("Alphabetic") || check("Other_Alphabetic"))
expectEqual(props.isASCIIHexDigit, check("ASCII_Hex_Digit"))
expectEqual(props.isBidiControl, check("Bidi_Control"))
expectEqual(props.isBidiMirrored, check("Bidi_Mirrored"))
expectEqual(props.isCased, check("Cased"))
expectEqual(props.isCaseIgnorable, check("Case_Ignorable"))
expectEqual(props.changesWhenCaseFolded, check("Changes_When_Casefolded"))
expectEqual(props.changesWhenCaseMapped, check("Changes_When_Casemapped"))
expectEqual(props.changesWhenLowercased, check("Changes_When_Lowercased"))
expectEqual(props.changesWhenNFKCCaseFolded, check("Changes_When_NFKC_Casefolded"))
expectEqual(props.changesWhenTitlecased, check("Changes_When_Titlecased"))
expectEqual(props.changesWhenUppercased, check("Changes_When_Uppercased"))
expectEqual(props.isDash, check("Dash"))
expectEqual(props.isDefaultIgnorableCodePoint, check("Default_Ignorable_Code_Point") || check("Other_Default_Ignorable_Code_Point"))
expectEqual(props.isDeprecated, check("Deprecated"))
expectEqual(props.isDiacritic, check("Diacritic"))
expectEqual(props.isEmoji, check("Emoji"))
expectEqual(props.isEmojiModifier, check("Emoji_Modifier"))
expectEqual(props.isEmojiModifierBase, check("Emoji_Modifier_Base"))
expectEqual(props.isEmojiPresentation, check("Emoji_Presentation"))
expectEqual(props.isExtender, check("Extender"))
expectEqual(props.isFullCompositionExclusion, check("Full_Composition_Exclusion"))
expectEqual(props.isGraphemeBase, check("Grapheme_Base"))
expectEqual(props.isGraphemeExtend, check("Grapheme_Extend") || check("Other_Grapheme_Extend"))
expectEqual(props.isHexDigit, check("Hex_Digit"))
expectEqual(props.isIDContinue, check("ID_Continue") || check("Other_ID_Continue"))
expectEqual(props.isIDStart, check("ID_Start") || check("Other_ID_Start"))
expectEqual(props.isIdeographic, check("Ideographic"))
expectEqual(props.isIDSBinaryOperator, check("IDS_Binary_Operator"))
expectEqual(props.isIDSTrinaryOperator, check("IDS_Trinary_Operator"))
expectEqual(props.isJoinControl, check("Join_Control"))
expectEqual(props.isLogicalOrderException, check("Logical_Order_Exception"))
expectEqual(props.isLowercase, check("Lowercase") || check("Other_Lowercase"))
expectEqual(props.isMath, check("Math") || check("Other_Math"))
expectEqual(props.isNoncharacterCodePoint, check("Noncharacter_Code_Point"))
expectEqual(props.isPatternSyntax, check("Pattern_Syntax"))
expectEqual(props.isPatternWhitespace, check("Pattern_White_Space"))
expectEqual(props.isQuotationMark, check("Quotation_Mark"))
expectEqual(props.isRadical, check("Radical"))
expectEqual(props.isSentenceTerminal, check("Sentence_Terminal"))
expectEqual(props.isSoftDotted, check("Soft_Dotted"))
expectEqual(props.isTerminalPunctuation, check("Terminal_Punctuation"))
expectEqual(props.isUnifiedIdeograph, check("Unified_Ideograph"))
expectEqual(props.isUppercase, check("Uppercase") || check("Other_Uppercase"))
expectEqual(props.isVariationSelector, check("Variation_Selector"))
expectEqual(props.isWhitespace, check("White_Space"))
expectEqual(props.isXIDContinue, check("XID_Continue"))
expectEqual(props.isXIDStart, check("XID_Start"))
}
}
}
//===----------------------------------------------------------------------===//
// Numeric Properties
//===----------------------------------------------------------------------===//
if #available(SwiftStdlib 6.1, *) {
UnicodeScalarPropertiesTest.test("Numeric Properties") {
for i in 0x0 ... 0x10FFFF {
guard let scalar = Unicode.Scalar(i) else {
continue
}
expectEqual(scalar.properties.numericType, numericTypes[scalar])
expectEqual(scalar.properties.numericValue, numericValues[scalar])
}
}
}
//===----------------------------------------------------------------------===//
// Scalar Mappings
//===----------------------------------------------------------------------===//
if #available(SwiftStdlib 6.1, *) {
UnicodeScalarPropertiesTest.test("Scalar Mappings") {
for i in 0x0 ... 0x10FFFF {
guard let scalar = Unicode.Scalar(i) else {
continue
}
if let upper = mappings[scalar]?["upper"] {
expectEqual(scalar.properties.uppercaseMapping, upper)
}
if let lower = mappings[scalar]?["lower"] {
expectEqual(scalar.properties.lowercaseMapping, lower)
}
if let title = mappings[scalar]?["title"] {
expectEqual(scalar.properties.titlecaseMapping, title)
}
}
}
}
//===----------------------------------------------------------------------===//
// Scalar Age
//===----------------------------------------------------------------------===//
if #available(SwiftStdlib 6.1, *) {
UnicodeScalarPropertiesTest.test("Scalar Age") {
for i in 0x0 ... 0x10FFFF {
guard let scalar = Unicode.Scalar(i) else {
continue
}
expectEqual(scalar.properties.age?.major, ages[scalar]?.major)
expectEqual(scalar.properties.age?.minor, ages[scalar]?.minor)
}
}
}
//===----------------------------------------------------------------------===//
// Scalar General Category
//===----------------------------------------------------------------------===//
if #available(SwiftStdlib 6.1, *) {
UnicodeScalarPropertiesTest.test("Scalar General Category") {
for i in 0x0 ... 0x10FFFF {
guard let scalar = Unicode.Scalar(i) else {
continue
}
expectEqual(scalar.properties.generalCategory, generalCategories[scalar])
}
}
}
//===----------------------------------------------------------------------===//
// Scalar Name Alias
//===----------------------------------------------------------------------===//
if #available(SwiftStdlib 6.1, *) {
UnicodeScalarPropertiesTest.test("Scalar Name Alias") {
for i in 0x0 ... 0x10FFFF {
guard let scalar = Unicode.Scalar(i) else {
continue
}
expectEqual(scalar.properties.nameAlias, nameAliases[scalar])
}
}
}
//===----------------------------------------------------------------------===//
// Scalar Name
//===----------------------------------------------------------------------===//
if #available(SwiftStdlib 6.1, *) {
UnicodeScalarPropertiesTest.test("Scalar Name") {
for i in 0x0 ... 0x10FFFF {
guard let scalar = Unicode.Scalar(i) else {
continue
}
expectEqual(scalar.properties.name, names[scalar])
}
}
}
//===----------------------------------------------------------------------===//
// Case Folded
//===----------------------------------------------------------------------===//
if #available(SwiftStdlib 6.1, *) {
UnicodeScalarPropertiesTest.test("Scalar Case Folding") {
for i in 0x0 ... 0x10FFFF {
guard let scalar = Unicode.Scalar(i) else {
continue
}
if let mapping = caseFolding[scalar] {
expectEqual(scalar.properties._caseFolded, mapping)
} else {
expectEqual(scalar.properties._caseFolded, String(scalar))
}
}
}
}
//===----------------------------------------------------------------------===//
// Script/Script Extensions
//===----------------------------------------------------------------------===//
if #available(SwiftStdlib 6.1, *) {
UnicodeScalarPropertiesTest.test("Scalar Scripts") {
for i in 0x0 ... 0x10FFFF {
guard let scalar = Unicode.Scalar(i) else {
continue
}
let script = unsafeBitCast(
scalar.properties._script,
to: Unicode.Script.self
)
if let parsedScript = scripts[scalar] {
expectEqual(script, parsedScript)
} else {
expectEqual(script, .unknown)
}
}
}
UnicodeScalarPropertiesTest.test("Scalar Script Extensions") {
for i in 0x0 ... 0x10FFFF {
guard let scalar = Unicode.Scalar(i) else {
continue
}
let extensions = scalar.properties._scriptExtensions.map {
unsafeBitCast($0, to: Unicode.Script.self)
}
let script = unsafeBitCast(
scalar.properties._script,
to: Unicode.Script.self
)
if let parsedExtensions = scriptExtensions[scalar] {
expectEqual(extensions, parsedExtensions, "Scalar: \(String(scalar.value, radix: 16))")
} else {
expectEqual(extensions, [script], "Scalar: \(String(scalar.value, radix: 16))")
}
}
}
}
runAllTests()