mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Int->Int Failable Initializer Tests
This commit is contained in:
122
validation-test/stdlib/FixedPointConversion.swift.gyb
Normal file
122
validation-test/stdlib/FixedPointConversion.swift.gyb
Normal file
@@ -0,0 +1,122 @@
|
||||
// RUN: rm -rf %t
|
||||
// RUN: mkdir -p %t
|
||||
// RUN: %S/../../utils/gyb %s -o %t/FixedPointConversion.swift
|
||||
// RUN: %S/../../utils/line-directive %t/FixedPointConversion.swift -- %target-build-swift %t/FixedPointConversion.swift -o %t/a.out_Debug
|
||||
// RUN: %S/../../utils/line-directive %t/FixedPointConversion.swift -- %target-build-swift %t/FixedPointConversion.swift -o %t/a.out_Release -O
|
||||
//
|
||||
// RUN: %S/../../utils/line-directive %t/FixedPointConversion.swift -- %target-run %t/a.out_Debug
|
||||
// RUN: %S/../../utils/line-directive %t/FixedPointConversion.swift -- %target-run %t/a.out_Release
|
||||
// REQUIRES: executable_test
|
||||
|
||||
%{
|
||||
import gyb
|
||||
}%
|
||||
|
||||
import StdlibUnittest
|
||||
|
||||
var FixedPointConversionTraps = TestSuite("FixedPointToFixedPointConversionTraps")
|
||||
var FixedPointConversionFailure = TestSuite("FixedPointToFixedPointConversionFailures")
|
||||
|
||||
%{
|
||||
|
||||
int_to_int_conversion_template = gyb.parse_template("int_to_int_conversion",
|
||||
"""
|
||||
%{
|
||||
from SwiftIntTypes import all_integer_types
|
||||
|
||||
def intMax(bits, signed):
|
||||
bits = bits - 1 if signed else bits
|
||||
return (1 << bits) - 1
|
||||
|
||||
def intMin(bits, signed):
|
||||
return -1 * intMax(bits, signed) - 1 if signed else 0
|
||||
|
||||
}%
|
||||
|
||||
% for self_ty in all_integer_types(word_bits):
|
||||
% selfBits = self_ty.bits
|
||||
% selfSigned = self_ty.is_signed
|
||||
% selfMin = intMin(selfBits, selfSigned)
|
||||
% selfMax = intMax(selfBits, selfSigned)
|
||||
% Self = self_ty.stdlib_name
|
||||
|
||||
% for other_ty in all_integer_types(word_bits):
|
||||
% otherBits = other_ty.bits
|
||||
% otherSigned = other_ty.is_signed
|
||||
% otherMin = intMin(otherBits, otherSigned)
|
||||
% otherMax = intMax(otherBits, otherSigned)
|
||||
% Other = other_ty.stdlib_name
|
||||
|
||||
% for testValue in [selfMin, selfMax, selfMin - 1, selfMax + 1, otherMin, otherMax]:
|
||||
|
||||
% if testValue < otherMin or testValue > otherMax:
|
||||
% # Can't construct `other` value, do nothing and continue.
|
||||
|
||||
% elif testValue >= selfMin and testValue <= selfMax:
|
||||
|
||||
/// Always-safe conversion from ${Other}(${testValue}) to ${Self}.
|
||||
FixedPointConversionTraps.test("${Other}To${Self}Conversion/dest=${testValue}") {
|
||||
// Test that nothing interesting happens and we end up with the same result after converting.
|
||||
let input = get${Other}(${testValue})
|
||||
let result = ${Self}(input)
|
||||
expectEqual(${testValue}, result)
|
||||
_blackHole(result)
|
||||
}
|
||||
|
||||
/// Never-nil failable conversion from ${Other}(${testValue}) to ${Self}.
|
||||
FixedPointConversionFailure.test("${Other}To${Self}FailableConversion/dest=${testValue}") {
|
||||
// Test that nothing interesting happens and we end up with a non-nil, identical result.
|
||||
let input = get${Other}(${testValue})
|
||||
var result = ${Self}(exactly: input)
|
||||
expectNotEqual(result, nil)
|
||||
expectEqual(${testValue}, result)
|
||||
_blackHole(result)
|
||||
}
|
||||
|
||||
% else:
|
||||
|
||||
/// Always-failing conversion from ${Other}(${testValue}) to ${Self}.
|
||||
FixedPointConversionTraps.test("${Other}To${Self}Conversion/dest=${testValue}") {
|
||||
// Test that we check if we fail and crash when an integer would be truncated in conversion.
|
||||
let input = get${Other}(${testValue})
|
||||
expectCrashLater()
|
||||
var result = ${Self}(input)
|
||||
_blackHole(result)
|
||||
}
|
||||
|
||||
/// Always-nil failable conversion from ${Other}(${testValue}) to ${Self}.
|
||||
FixedPointConversionFailure.test("${Other}To${Self}Conversion/dest=${testValue}") {
|
||||
// Test that we check if we return nil when an integer would be truncated in conversion.
|
||||
let input = get${Other}(${testValue})
|
||||
var result = ${Self}(exactly: input)
|
||||
expectEqual(nil, result)
|
||||
_blackHole(result)
|
||||
}
|
||||
% end
|
||||
|
||||
% end # for testValue in ...
|
||||
% end # for in all_integer_types (Other)
|
||||
% end # for in all_integer_types (Self)
|
||||
""")
|
||||
|
||||
}%
|
||||
|
||||
#if arch(i386) || arch(arm)
|
||||
|
||||
${gyb.execute_template(
|
||||
int_to_int_conversion_template,
|
||||
word_bits=32)}
|
||||
|
||||
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
|
||||
|
||||
${gyb.execute_template(
|
||||
int_to_int_conversion_template,
|
||||
word_bits=64)}
|
||||
|
||||
#else
|
||||
|
||||
_UnimplementedError()
|
||||
|
||||
#endif
|
||||
|
||||
runAllTests()
|
||||
Reference in New Issue
Block a user