2016-07-19 13:52:03 -07:00
# There is an automatic 'using namespace system' which is
# tested by this test, so don't uncomment the following:
#using namespace System
using namespace System . Threading
using namespace System . Timers
2016-07-19 17:21:32 -07:00
using namespace System . Diagnostics
2016-07-19 13:52:03 -07:00
# Test parsing more than one using statement on one line
using namespace System . Diagnostics ; using namespace System . Runtime . CompilerServices
using namespace System . Collections . Generic
Import-Module $PSScriptRoot \..\ LanguageTestSupport . psm1
function ShouldBeErrorId
{
param ([ Parameter ( ValueFromPipeline , Mandatory )]
[ ScriptBlock ]
$sb ,
[ Parameter ( Mandatory , Position = 0 )]
[ string ]
$FullyQualifiedErrorId )
try
{
& $sb
throw "Unexpected"
}
catch
{
$_ . FullyQualifiedErrorId | Should Be $FullyQualifiedErrorId
}
}
# Flags is System.FlagsAttribute
# This tests our implicit 'using namespace System'
# despite having other explicit using namespace statements.
[ Flags ()]
enum E1
{
E1 = 0x01
E2 = 0x02
E4 = 0x04
}
# Test attributes that won't be found w/o using, but w/o implicit Attribute suffix
[ CompilerGenerated ()]
class C1
{
[ Thread ][ CompilerGenerated ()] $Thread
[ Int32 ][ CompilerGenerated ()] $Int
2016-07-19 17:21:32 -07:00
#[ElapsedEventHandler][CompilerGenerated()]$EventHandler
2016-07-19 13:52:03 -07:00
}
# Test attributes that won't be found w/o using, but w/ implicit Attribute suffix
[ CompilerGeneratedAttribute ()]
class C2
{
[ Thread ][ CompilerGeneratedAttribute ()] $Thread
[ Int32 ][ CompilerGeneratedAttribute ()] $Int
2016-07-19 17:21:32 -07:00
#[ElapsedEventHandler][CompilerGeneratedAttribute()]$EventHandler
2016-07-19 13:52:03 -07:00
}
Describe "Using Namespace" -Tags "DRT" {
It "Type literals w/ using namespace" {
[ Thread ]. FullName | Should Be System . Threading . Thread
[ Int32 ]. FullName | Should Be System . Int32
2016-07-19 17:21:32 -07:00
#[ElapsedEventHandler].FullName | Should Be System.Timers.ElapsedEventHandler
2016-07-19 13:52:03 -07:00
[ C1 ]. GetProperty ( "Thread" ). PropertyType . FullName | Should Be System . Threading . Thread
[ C1 ]. GetProperty ( "Int" ). PropertyType . FullName | Should Be System . Int32
2016-07-19 17:21:32 -07:00
# [C1].GetProperty("EventHandler").PropertyType.FullName | Should Be System.Timers.ElapsedEventHandler
2016-07-19 13:52:03 -07:00
}
It "Covert string to Type w/ using namespace" {
( "Thread" -as [ Type ]). FullName | Should Be System . Threading . Thread
( "Int32" -as [ Type ]). FullName | Should Be System . Int32
2016-07-19 17:21:32 -07:00
# ("ElapsedEventHandler" -as [Type]).FullName | Should Be System.Timers.ElapsedEventHandler
2016-07-19 13:52:03 -07:00
New-Object Int32 | Should Be 0
New-Object CompilerGeneratedAttribute | Should Be System . Runtime . CompilerServices . CompilerGeneratedAttribute
}
2016-07-19 17:21:32 -07:00
It "Attributes w/ using namespace" -pending {
2016-07-19 13:52:03 -07:00
function foo
{
[ DebuggerStepThrough ()]
param (
[ CompilerGeneratedAttribute ()]
$a ,
[ CompilerGenerated ()]
$b
)
"OK"
}
foo | Should Be OK
$cmdInfo = gcm foo
$cmdInfo . ScriptBlock . Attributes [ 0 ] | Should Be System . Diagnostics . DebuggerStepThroughAttribute
$cmdInfo . Parameters [ 'a' ]. Attributes [ 1 ] | Should Be System . Runtime . CompilerServices . CompilerGeneratedAttribute
$cmdInfo . Parameters [ 'b' ]. Attributes [ 1 ] | Should Be System . Runtime . CompilerServices . CompilerGeneratedAttribute
[ C1 ]. GetProperty ( "Thread" ). GetCustomAttributesData ()[ 0 ]. AttributeType . FullName | Should Be System . Runtime . CompilerServices . CompilerGeneratedAttribute
[ C1 ]. GetProperty ( "Int" ). GetCustomAttributesData ()[ 0 ]. AttributeType . FullName | Should Be System . Runtime . CompilerServices . CompilerGeneratedAttribute
2016-07-19 17:21:32 -07:00
# [C1].GetProperty("EventHandler").GetCustomAttributesData()[0].AttributeType.FullName | Should Be System.Runtime.CompilerServices.CompilerGeneratedAttribute
2016-07-19 13:52:03 -07:00
[ C2 ]. GetProperty ( "Thread" ). GetCustomAttributesData ()[ 0 ]. AttributeType . FullName | Should Be System . Runtime . CompilerServices . CompilerGeneratedAttribute
[ C2 ]. GetProperty ( "Int" ). GetCustomAttributesData ()[ 0 ]. AttributeType . FullName | Should Be System . Runtime . CompilerServices . CompilerGeneratedAttribute
2016-07-19 17:21:32 -07:00
# [C2].GetProperty("EventHandler").GetCustomAttributesData()[0].AttributeType.FullName | Should Be System.Runtime.CompilerServices.CompilerGeneratedAttribute
2016-07-19 13:52:03 -07:00
[ C1 ]. GetCustomAttributesData ()[ 0 ]. AttributeType . FullName | Should Be System . Runtime . CompilerServices . CompilerGeneratedAttribute
[ C2 ]. GetCustomAttributesData ()[ 0 ]. AttributeType . FullName | Should Be System . Runtime . CompilerServices . CompilerGeneratedAttribute
[ E1 ]. GetCustomAttributesData ()[ 0 ]. AttributeType . FullName | Should Be System . FlagsAttribute
}
It "Ambiguous type reference" {
2016-07-19 17:21:32 -07:00
{ [ ThreadState ] } | ShouldBeErrorId AmbiguousTypeReference
2016-07-19 13:52:03 -07:00
}
It "Parameters" {
function foo([Thread]$t = $null ) { 42 }
foo | Should Be 42
$mod = New-Module -Name UsingNamespaceModule -ScriptBlock {
function Set-Thread([Thread]$t = $null )
{
44
}
}
Import-Module $mod
Set-Thread | Should Be 44
Remove-Module $mod
}
It "Generics" {
function foo([List[string]]$l )
{
$l | Should Be "a string"
}
$l = [ List[string] ]:: new ()
$l . Add ( "a string" )
foo $l
}
ShouldBeParseError "1; using namespace System" UsingMustBeAtStartOfScript 3
ShouldBeParseError "using namespace Foo = System" UsingStatementNotSupported 0
# TODO: add diagnostic (low pri)
# ShouldBeParseError "using namespace System; using namespace System" UsingNamespaceAlreadySpecified 24
}