edb292face
DeserializedMethods, DeserializedTypeConversion, DynamicParameters, Generics, Indexer, LindEndings, MyInvocation, OrderedAttributeForHashTable.
273 lines
8.3 KiB
PowerShell
273 lines
8.3 KiB
PowerShell
Describe "Tests conversion of deserialized types to original type using object properties." -Tags "CI" {
|
|
BeforeAll {
|
|
# Create new types and test functions.
|
|
$type1,$type2,$type3,$type4 = Add-Type -PassThru -TypeDefinition @'
|
|
public class test1
|
|
{
|
|
public string name;
|
|
public int port;
|
|
public string scriptText;
|
|
}
|
|
|
|
public class test2
|
|
{
|
|
private string name;
|
|
private int port;
|
|
private string scriptText;
|
|
|
|
public string Name
|
|
{
|
|
get { return name; }
|
|
set { name = value; }
|
|
}
|
|
|
|
public int Port
|
|
{
|
|
get { return port; }
|
|
set { port = value; }
|
|
}
|
|
|
|
public string ScriptText
|
|
{
|
|
get { return scriptText; }
|
|
set { scriptText = value; }
|
|
}
|
|
}
|
|
|
|
public class test3
|
|
{
|
|
private string name = "default";
|
|
private int port = 80;
|
|
private string scriptText = "1..6";
|
|
|
|
public string Name
|
|
{
|
|
get { return name; }
|
|
set { name = value; }
|
|
}
|
|
|
|
public int Port
|
|
{
|
|
get { return port; }
|
|
set { port = value; }
|
|
}
|
|
|
|
public string ScriptText
|
|
{
|
|
get { return scriptText; }
|
|
}
|
|
}
|
|
|
|
public class test4
|
|
{
|
|
private string name = "default";
|
|
private int port = 80;
|
|
private string scriptText = "1..6";
|
|
|
|
public string Name
|
|
{
|
|
get { return name; }
|
|
set { name = value; }
|
|
}
|
|
|
|
public int Port
|
|
{
|
|
get { return port; }
|
|
set { port = value; }
|
|
}
|
|
|
|
internal void Compute()
|
|
{
|
|
scriptText = scriptText + " Computed";
|
|
}
|
|
}
|
|
'@
|
|
}
|
|
|
|
Context 'Type conversion and parameter binding of deserialized Type case 1: type definition contains public fields' {
|
|
BeforeAll {
|
|
$t1 = new-object test1 -Property @{name="TestName1";port=80;scriptText="1..5"}
|
|
$s = [System.Management.Automation.PSSerializer]::Serialize($t1)
|
|
$dst1 = [System.Management.Automation.PSSerializer]::Deserialize($s)
|
|
}
|
|
|
|
It 'Type casts should succeed.' {
|
|
{ $tc1 = [test1]$dst1 }| Should not Throw
|
|
}
|
|
|
|
It 'Parameter bindings should succeed.' {
|
|
|
|
function test-1
|
|
{
|
|
param(
|
|
[parameter(position=0, mandatory=1)]
|
|
[test1] $test
|
|
)
|
|
|
|
$test | Format-List | Out-String
|
|
}
|
|
{ test-1 $dst1 } | Should Not Throw
|
|
}
|
|
}
|
|
|
|
Context 'Type conversion and parameter binding of deserialized Type case 2: type definition contains public properties' {
|
|
BeforeAll {
|
|
$t2 = new-object test2 -Property @{Name="TestName2";Port=80;ScriptText="1..5"}
|
|
$s = [System.Management.Automation.PSSerializer]::Serialize($t2)
|
|
$dst2 = [System.Management.Automation.PSSerializer]::Deserialize($s)
|
|
}
|
|
It 'Type casts should succeed.' {
|
|
{ $tc2 = [test2]$dst2 } | Should Not Throw
|
|
}
|
|
|
|
It 'Parameter bindings should succeed.' {
|
|
function test-2
|
|
{
|
|
param(
|
|
[parameter(position=0, mandatory=1)]
|
|
[test2] $test
|
|
)
|
|
|
|
$test | Format-List | Out-String
|
|
}
|
|
{ test-2 $dst2 } | Should Not Throw
|
|
}
|
|
}
|
|
|
|
Context 'Type conversion and parameter binding of deserialized Type case 1: type definition contains 2 public properties and 1 read only property' {
|
|
BeforeAll {
|
|
$t3 = new-object test3 -Property @{Name="TestName3";Port=80}
|
|
$s = [System.Management.Automation.PSSerializer]::Serialize($t3)
|
|
$dst3 = [System.Management.Automation.PSSerializer]::Deserialize($s)
|
|
}
|
|
|
|
It 'Type casts should fail.' {
|
|
|
|
try
|
|
{
|
|
$tc3 = [test3]$dst3
|
|
Throw "Exception expected, execution should not have reached here"
|
|
}
|
|
catch {
|
|
$_.FullyQualifiedErrorId | Should Be 'InvalidCastConstructorException'
|
|
}
|
|
}
|
|
|
|
It 'Parameter bindings should fail.' {
|
|
|
|
function test-3
|
|
{
|
|
param(
|
|
[parameter(position=0, mandatory=1)]
|
|
[test3] $test
|
|
)
|
|
|
|
$test | Format-List | Out-String
|
|
}
|
|
|
|
try
|
|
{
|
|
test-3 $dst3
|
|
Throw "Exception expected, execution should not have reached here"
|
|
}
|
|
catch {
|
|
$_.FullyQualifiedErrorId | Should Be 'ParameterArgumentTransformationError,test-3'
|
|
}
|
|
}
|
|
}
|
|
|
|
Context 'Type conversion and parameter binding of deserialized Type case 1: type definition contains 2 public properties' {
|
|
BeforeAll {
|
|
$t4 = new-object test4 -Property @{Name="TestName4";Port=80}
|
|
$s = [System.Management.Automation.PSSerializer]::Serialize($t4)
|
|
$dst4 = [System.Management.Automation.PSSerializer]::Deserialize($s)
|
|
}
|
|
|
|
It 'Type casts should succeed.' {
|
|
{ $tc4 = [test4]$dst4 } | Should Not Throw
|
|
}
|
|
|
|
It 'Parameter bindings should succeed.' {
|
|
function test-4
|
|
{
|
|
param(
|
|
[parameter(position=0, mandatory=1)]
|
|
[test4] $test
|
|
)
|
|
|
|
$test | Format-List | Out-String
|
|
}
|
|
{ test-4 $dst4 } | Should Not Throw
|
|
}
|
|
}
|
|
|
|
Context 'Type conversion and parameter binding of deserialized Powershell class with default constructor' {
|
|
BeforeAll {
|
|
class PSClass1 {
|
|
[string] $name = "PSClassName1"
|
|
[int] $port = 80
|
|
[string] $scriptText = "1..6"
|
|
}
|
|
|
|
$t5 = [PSClass1]::new()
|
|
$s = [System.Management.Automation.PSSerializer]::Serialize($t5)
|
|
$dst5 = [System.Management.Automation.PSSerializer]::Deserialize($s)
|
|
}
|
|
|
|
It 'Type casts should succeed.' {
|
|
|
|
{ $tc5 = [PSClass1]$dst5 } | Should Not Throw
|
|
}
|
|
|
|
It 'Parameter bindings should succeed.' {
|
|
function test-PSClass1
|
|
{
|
|
param(
|
|
[parameter(position=0, mandatory=1)]
|
|
[PSClass1] $test
|
|
)
|
|
|
|
$test | Format-List | Out-String
|
|
}
|
|
{ test-PSClass1 $dst5 } | Should Not Throw
|
|
}
|
|
}
|
|
|
|
Context 'Type conversion and parameter binding of deserialized Powershell class with a defualt constructor and a constructor' {
|
|
BeforeAll {
|
|
class PSClass2 {
|
|
[string] $name = "default"
|
|
[int] $port = 80
|
|
[string] $scriptText = "1..6"
|
|
PSClass2() {}
|
|
PSClass2([string] $name1, [int] $port1, [string] $scriptText1)
|
|
{
|
|
$this.name = $name1
|
|
$this.port = $port1
|
|
$this.scriptText = $scriptText1
|
|
}
|
|
}
|
|
$t6 = [PSClass2]::new("PSClassName2", 80, "1..5")
|
|
$s = [System.Management.Automation.PSSerializer]::Serialize($t6)
|
|
$dst6 = [System.Management.Automation.PSSerializer]::Deserialize($s)
|
|
}
|
|
|
|
It 'Type casts should succeed.' {
|
|
{ $tc6 = [PSClass2]$dst6 } | Should Not Throw
|
|
}
|
|
|
|
It 'Parameter bindings should succeed.' {
|
|
function test-PSClass2
|
|
{
|
|
param(
|
|
[parameter(position=0, mandatory=1)]
|
|
[PSClass2] $test
|
|
)
|
|
|
|
$test | Format-List | Out-String
|
|
}
|
|
{ test-PSClass2 $dst6 } | Should Not Throw
|
|
}
|
|
}
|
|
}
|