PowerShell/test/powershell/Language/Parser/BNotOperator.Tests.ps1

144 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
}
}
}
}