143 lines
4.1 KiB
PowerShell
143 lines
4.1 KiB
PowerShell
# Copyright (c) Microsoft Corporation.
|
|
# Licensed under the MIT License.
|
|
|
|
$baseTypes = @{
|
|
[SByte] = 'sbyte'; [Byte] = 'byte'
|
|
[Int16] = 'short'; [UInt16] = 'ushort'
|
|
[Int32] = 'int'; [UInt32] = 'uint'
|
|
[Int64] = 'long'; [UInt64] = 'ulong'
|
|
}
|
|
|
|
$ns = [Guid]::NewGuid() -replace '-',''
|
|
|
|
$typeDefinition = "namespace ns_$ns`n{"
|
|
|
|
$enumTypeNames = foreach ($baseType in $baseTypes.Keys)
|
|
{
|
|
$baseTypeName = $baseTypes[$baseType]
|
|
$typeDefinition += @"
|
|
public enum E_$baseTypeName : $baseTypeName
|
|
{
|
|
Min = $($baseType::MinValue),
|
|
MinPlus1 = $($baseType::MinValue + 1),
|
|
MaxMinus1 = $($baseType::MaxValue - 1),
|
|
Max = $($baseType::MaxValue)
|
|
}
|
|
"@
|
|
|
|
"ns_$ns.E_$baseTypeName"
|
|
}
|
|
|
|
$typeDefinition += "`n}"
|
|
|
|
Write-Verbose $typeDefinition
|
|
Add-Type $typeDefinition
|
|
|
|
Describe "bnot on enums" -Tags "CI" {
|
|
foreach ($enumType in [type[]]$enumTypeNames)
|
|
{
|
|
Context $enumType.Name {
|
|
It "max - 1" {
|
|
$res = -bnot $enumType::MaxMinus1
|
|
$res | Should -Be $enumType::MinPlus1
|
|
$res | Should -BeOfType $enumType
|
|
}
|
|
|
|
It "min + 1" {
|
|
$res = -bnot $enumType::MinPlus1
|
|
$res | Should -Be $enumType::MaxMinus1
|
|
$res | Should -BeOfType $enumType
|
|
}
|
|
|
|
It "Max" {
|
|
$res = -bnot $enumType::Max
|
|
$res | Should -Be $enumType::Min
|
|
$res | Should -BeOfType $enumType
|
|
}
|
|
|
|
It "Min" {
|
|
$res = -bnot $enumType::Min
|
|
$res | Should -Be $enumType::Max
|
|
$res | Should -BeOfType $enumType
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Describe "bnot on integral types" -Tags "CI" {
|
|
foreach ($baseType in $baseTypes.Keys)
|
|
{
|
|
Context $baseType.Name {
|
|
|
|
$max = $baseType::MaxValue
|
|
$maxMinus1 = $max - 1
|
|
$min = $baseType::MinValue
|
|
$minPlus1 = $min + 1
|
|
|
|
if ([System.Runtime.InteropServices.Marshal]::SizeOf([type]$baseType) -lt 4)
|
|
{
|
|
$expectedResultType = [int]
|
|
}
|
|
else
|
|
{
|
|
$expectedResultType = $baseType
|
|
}
|
|
|
|
if ($baseType -eq [byte] -or $baseType -eq [uint16])
|
|
{
|
|
# Because of type promotion rules, unsigned types smaller than int
|
|
# don't quite follow the pattern of "flip all the bits", so our
|
|
# tests are a little different.
|
|
It "max - 1" {
|
|
$res = -bnot $maxMinus1
|
|
$res | Should -Be (-bnot [int]$maxMinus1)
|
|
$res | Should -BeOfType $expectedResultType
|
|
}
|
|
|
|
It "min + 1" {
|
|
$res = -bnot $minPlus1
|
|
$res | Should -Be (-bnot [int]$minPlus1)
|
|
$res | Should -BeOfType $expectedResultType
|
|
}
|
|
|
|
It "max" {
|
|
$res = -bnot $max
|
|
$res | Should -Be (-bnot [int]$max)
|
|
$res | Should -BeOfType $expectedResultType
|
|
}
|
|
|
|
It "min" {
|
|
$res = -bnot $min
|
|
$res | Should -Be (-bnot [int]$min)
|
|
$res | Should -BeOfType $expectedResultType
|
|
}
|
|
return
|
|
}
|
|
|
|
It "max - 1" {
|
|
$res = -bnot $maxMinus1
|
|
$res | Should -Be $minPlus1
|
|
$res | Should -BeOfType $expectedResultType
|
|
}
|
|
|
|
It "min + 1" {
|
|
$res = -bnot $minPlus1
|
|
$res | Should -Be $maxMinus1
|
|
$res | Should -BeOfType $expectedResultType
|
|
}
|
|
|
|
It "max" {
|
|
$res = -bnot $max
|
|
$res | Should -Be $min
|
|
$res | Should -BeOfType $expectedResultType
|
|
}
|
|
|
|
It "min" {
|
|
$res = -bnot $min
|
|
$res | Should -Be $max
|
|
$res | Should -BeOfType $expectedResultType
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|