blob: d5417c361051f007ceeb443c695c91a5d2edbf21 [file] [log] [blame]
//===--- NSNumberBridging.swift - Test bridging through NSNumber ----------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
// RUN: rm -rf %t && mkdir -p %t
// RUN: %gyb %s -o %t/NSValueBridging.swift
// RUN: %target-build-swift -g -module-name a %t/NSValueBridging.swift -o %t.out
// RUN: %target-run %t.out
// REQUIRES: executable_test
// REQUIRES: objc_interop
import StdlibUnittest
import Foundation
import CoreGraphics
var nsNumberBridging = TestSuite("NSNumberBridging")
func expectBridgeToNSNumber<T>(_ value: T,
nsNumberInitializer: (T) -> NSNumber,
nsNumberGetter: (NSNumber) -> T,
equal: (T, T) -> Bool) {
let object = value as AnyObject
let nsNumber = object as! NSNumber
expectEqual(nsNumberInitializer(value), nsNumber)
expectTrue(equal(value, nsNumberGetter(nsNumber)))
expectTrue(equal(value, nsNumberGetter(nsNumberInitializer(value))))
expectTrue(equal(value, object as! T))
}
%{
bridgedFixedPointTypes = [
#Type accessor signed
("Int", "int", True),
("Int64", "int64", True),
("Int32", "int32", True),
("Int16", "int16", True),
("Int8", "int8", True),
("UInt", "uint", False),
("UInt64", "uint64", False),
("UInt32", "uint32", False),
("UInt16", "uint16", False),
("UInt8", "uint8", False),
]
}%
extension Int64 {
init(truncatingBitPattern: UInt64) {
self = Int64(bitPattern: truncatingBitPattern)
}
}
extension UInt64 {
init(truncatingBitPattern: UInt64) {
self = truncatingBitPattern
}
}
% for Type, accessor, isSigned in bridgedFixedPointTypes:
nsNumberBridging.test("${Type}") {
for value in [
0, 1, ${Type}.min, ${Type}.max,
${Type}(truncatingBitPattern: 0x1122_3344_5566_7788 as UInt64),
% if isSigned:
-1,
-${Type}(truncatingBitPattern: 0x1122_3344_5566_7788 as UInt64),
% end
] {
expectBridgeToNSNumber(value,
nsNumberInitializer: { NSNumber(value: $0) },
nsNumberGetter: { $0.${accessor}Value },
equal: (==))
}
}
% end
func floatsAreEquivalent(_ x: Float, _ y: Float) -> Bool {
return x.bitPattern == y.bitPattern
}
func floatsAreEquivalent(_ x: Double, _ y: Double) -> Bool {
return x.bitPattern == y.bitPattern
}
%{
bridgedFloatTypes = [
#Type accessor
("Float", "float"),
("Double", "double"),
]
}%
% for Type, accessor in bridgedFloatTypes:
nsNumberBridging.test("${Type}") {
for value in [
0, -0, 1, -1,
${Type}.leastNonzeroMagnitude,
${Type}.leastNormalMagnitude,
${Type}.greatestFiniteMagnitude,
${Type}.infinity,
-${Type}.leastNonzeroMagnitude,
-${Type}.leastNormalMagnitude,
-${Type}.greatestFiniteMagnitude,
-${Type}.infinity,
${Type}.nan,
] {
expectBridgeToNSNumber(value,
nsNumberInitializer: { NSNumber(value: $0) },
nsNumberGetter: { $0.${accessor}Value },
equal: floatsAreEquivalent)
}
}
% end
%{
allBridgedTypes = [type_name for type_name, _, _ in bridgedFixedPointTypes] + \
[type_name for type_name, _ in bridgedFloatTypes]
}%
% for AType in allBridgedTypes:
nsNumberBridging.test("${AType} bridged casting") {
let original: ${AType} = 17
let originalAny = original as Any
let bridgedAny = original as AnyObject as Any
expectEqual(original, bridgedAny as! ${AType})
expectEqual(.some(original), bridgedAny as? ${AType})
expectEqual(original, originalAny as! ${AType})
expectEqual(.some(original), originalAny as? ${AType})
let nsNumber = NSNumber(value: original)
expectEqual(nsNumber, bridgedAny as! NSNumber)
expectEqual(.some(nsNumber), bridgedAny as? NSNumber)
expectEqual(nsNumber, originalAny as! NSNumber)
expectEqual(.some(nsNumber), originalAny as? NSNumber)
}
% for BType in allBridgedTypes:
% if AType != BType:
nsNumberBridging.test("${AType} to ${BType} casting fails") {
let original: ${AType} = 0
let bridged = original as AnyObject as Any
expectEqual(.none, bridged as? ${BType})
expectCrashLater()
_ = bridged as! ${BType}
}
% end
% end
% end
runAllTests()