diff --git a/test/powershell/Update-FormatData.Tests.ps1 b/test/powershell/Update-FormatData.Tests.ps1 index 7cfe71d424..c0bd62d857 100644 --- a/test/powershell/Update-FormatData.Tests.ps1 +++ b/test/powershell/Update-FormatData.Tests.ps1 @@ -1,15 +1,50 @@ -Describe "Update-FormatData" { - - Context "Validate Update-FormatData update correctly" { - - It "Should not throw upon reloading previous formatting file" { - { Update-FormatData } | Should Not throw - } - - It "Should validly load formatting data" { - { Get-FormatData -typename System.Diagnostics.Process | Export-FormatData -Path "outputfile.ps1xml" } - { Update-FormatData -prependPath "outputfile.ps1xml" | Should Not throw } - { Remove-Item "outputfile.ps1xml" -ErrorAction SilentlyContinue } - } - } -} +Describe "Update-FormatData" { + + Context "Validate Update-FormatData update correctly" { + + It "Should not throw upon reloading previous formatting file" { + { Update-FormatData } | Should Not throw + } + + It "Should validly load formatting data" { + { Get-FormatData -typename System.Diagnostics.Process | Export-FormatData -Path "outputfile.ps1xml" } + { Update-FormatData -prependPath "outputfile.ps1xml" | Should Not throw } + { Remove-Item "outputfile.ps1xml" -ErrorAction SilentlyContinue } + } + } +} + +Describe "Update-FormatData basic functionality" -Tags DRT{ + $tmpDirectory = $TestDrive + $testfilename = "testfile.ps1xml" + $testfile = Join-Path -Path $tmpDirectory -ChildPath $testfilename + + It "Update-FormatData with WhatIf should work"{ + $xmlContent=@" + + + AnyName + + + PropertySetName + + FirstName + LastName + + + + + +"@ + $xmlContent>$testfile + try + { + {Update-FormatData -Append $testfile -WhatIf} | Should Not Throw + {Update-FormatData -Prepend $testfile -WhatIf} | Should Not Throw + } + finally + { + rm $testfile + } + } +} \ No newline at end of file diff --git a/test/powershell/Update-TypeData.Tests.ps1 b/test/powershell/Update-TypeData.Tests.ps1 index e9eb11b45d..1076883ec5 100644 --- a/test/powershell/Update-TypeData.Tests.ps1 +++ b/test/powershell/Update-TypeData.Tests.ps1 @@ -1,15 +1,344 @@ -Describe "Update-TypeData" { - - Context "Validate Update-Type updates correctly" { - - It "Should not throw upon reloading previous formatting file" { - { Update-TypeData } | Should Not throw - } - - It "Should validly load formatting data" { - { Get-TypeData -typename System.Diagnostics.Process | Export-TypeData -Path "outputfile.ps1xml" } - { Update-TypeData -prependPath "outputfile.ps1xml" | Should Not throw } - { Remove-Item "outputfile.ps1xml" -ErrorAction SilentlyContinue } - } - } -} +Describe "Update-TypeData" { + + Context "Validate Update-Type updates correctly" { + + It "Should not throw upon reloading previous formatting file" { + { Update-TypeData } | Should Not throw + } + + It "Should validly load formatting data" { + { Get-TypeData -typename System.Diagnostics.Process | Export-TypeData -Path "outputfile.ps1xml" } + { Update-TypeData -prependPath "outputfile.ps1xml" | Should Not throw } + { Remove-Item "outputfile.ps1xml" -ErrorAction SilentlyContinue } + } + } +} + +Describe "Update-TypeData basic functionality" -Tags DRT{ + $tmpDirectory = $TestDrive + $testfilename = "testfile.ps1xml" + $testfile = Join-Path -Path $tmpDirectory -ChildPath $testfilename + $invalidFileExtensionFile = Join-Path -Path $tmpDirectory -ChildPath "notmshxml" + $filelist = Join-Path -Path $tmpDirectory -ChildPath "fileList.ps1xml" + + #Pester bug:https://github.com/PowerShell/psl-pester/issues/6 + It "Update-TypeData with Invalid TypesXml should throw Exception" -Pending{ + $xmlContent=@" + + + AnyName + + + PropertySetName + + FirstName + LastName + + + + + + PropertySetName + + FirstName + LastName + + + + + +"@ + $xmlContent>$testfile + try + { + Update-TypeData -PrependPath $testfile -EA Stop + Throw "Execution OK" + } + catch + { + $error[0] | Should Match "Error: The node MembersTypo2 is not allowed." + $_.CategoryInfo | Should Match "RuntimeException" + $_.FullyQualifiedErrorId | Should be "TypesXmlUpdateException,Microsoft.PowerShell.Commands.UpdateTypeDataCommand" + } + finally + { + Remove-TypeData -Path $testfile + rm $testfile + } + } + + It "Update-TypeData with Invalid File Extension should throw Exception"{ + $xmlContent="not really an xml file, but we will not use it" + $xmlContent>$invalidFileExtensionFile + try + { + Update-TypeData -PrependPath $invalidFileExtensionFile -EA Stop + Throw "Execution OK" + } + catch + { + $error[0] | Should Match "because it does not have the file name extension" + $_.CategoryInfo | Should Match "PSInvalidOperationException" + $_.FullyQualifiedErrorId | Should be "WrongExtension,Microsoft.PowerShell.Commands.UpdateTypeDataCommand" + } + finally + { + rm $invalidFileExtensionFile + } + } + + It "Update-TypeData with Invalid File List Extension should throw Exception"{ + $xmlContent="not really an xml file, but we will not use it" + $xmlContent>$invalidFileExtensionFile + $filelistContent = "" + $invalidFileExtensionFile + "" + $filelistContent>$filelist + try + { + Update-TypeData -AppendPath $filelist -EA Stop + Throw "Execution OK" + } + catch + { + $error[0] | Should Match "ps1xml" + $_.CategoryInfo | Should Match "RuntimeException" + $_.FullyQualifiedErrorId | Should be "TypesXmlUpdateException,Microsoft.PowerShell.Commands.UpdateTypeDataCommand" + } + finally + { + Remove-TypeData -Path $filelist + rm $invalidFileExtensionFile + rm $filelist + } + } + + It "Update-TypeData with Valid Dynamic Type NoteProperty with Force should work"{ + Update-TypeData -MemberType NoteProperty -MemberName TestNote -Value 2 -TypeName System.String + "string".TestNote | Should Be 2 + Update-TypeData -MemberType NoteProperty -MemberName TestNote -Value "test" -TypeName System.String -Force + "string".TestNote | Should Be "test" + Update-TypeData -MemberType NoteProperty -MemberName TestNote -Value $null -TypeName System.String -Force + "string".TestNote | Should BeNullOrEmpty + } + + It "Update-TypeData with Valid Dynamic Type AliasProperty with Force should work"{ + Update-TypeData -MemberType AliasProperty -MemberName TestAlias -Value "Length" -TypeName System.String + "string".TestAlias.GetType().Name | Should Be "Int32" + "string".TestAlias | Should Be 6 + Update-TypeData -MemberType AliasProperty -MemberName TestAlias -Value "Length" -SecondValue "string" -TypeName System.String -Force + "string".TestAlias.GetType().Name | Should Be "String" + "string".TestAlias | Should Be 6 + } + + It "Update-TypeData with Valid Dynamic Type ScriptMethod with Force should work"{ + $script1={"script method"} + Update-TypeData -MemberType ScriptMethod -MemberName TestScriptMethod -Value $script1 -TypeName System.String + "string".TestScriptMethod() | Should Be "script method" + $script2={"new script method"} + Update-TypeData -MemberType ScriptMethod -MemberName TestScriptMethod -Value $script2 -TypeName System.String -Force + "string".TestScriptMethod() | Should Be "new script method" + } + + It "Update-TypeData with Valid Dynamic Type Accept TypeData Object should work"{ + Add-Type -TypeDefinition "public class TypeDataTest{}" + Update-TypeData -TypeName TypeDataTest -MemberType NoteProperty -MemberName TestNote1 -Value "Hello" + Update-TypeData -MemberType NoteProperty -MemberName TestNote -Value 2 -TypeName TypeDataTest + $result=new-object TypeDataTest + $result.TestNote1 | Should Be "Hello" + $result.TestNote | Should Be 2 + } + + It "Update-TypeData with Invalid DynamicType Null Value For AliasProperty should throw Exception"{ + try + { + Update-TypeData -MemberType AliasProperty -MemberName TestAlias -Value $null -TypeName System.String -EA Stop + Throw "Execution OK" + } + catch + { + $error[0] | Should Match 'The Value parameter should not be null or an empty string for a member of type "AliasProperty". Specify a non-null value for the Value parameter when updating this member type.' + $_.CategoryInfo | Should Match "InvalidOperationException" + $_.FullyQualifiedErrorId | Should be "ValueShouldBeSpecified,Microsoft.PowerShell.Commands.UpdateTypeDataCommand" + } + } + + It "Update-TypeData with Invalid DynamicType with No MemberName should throw Exception"{ + try + { + Update-TypeData -MemberType NoteProperty -Value "Error" -TypeName System.String -EA Stop + Throw "Execution OK" + } + catch + { + $error[0] | Should Match 'The MemberName parameter is required for the type "NoteProperty". Please specify the MemberName parameter.' + $_.CategoryInfo | Should Match "InvalidOperationException" + $_.FullyQualifiedErrorId | Should be "MemberNameShouldBeSpecified,Microsoft.PowerShell.Commands.UpdateTypeDataCommand" + } + } + + It "Update-TypeData with Invalid DynamicType with No Value should throw Exception"{ + try + { + Update-TypeData -MemberType NoteProperty -MemberName TestNote -TypeName System.String -EA Stop + Throw "Execution OK" + } + catch + { + $error[0] | Should Match 'The Value parameter is required for the type "NoteProperty". Please specify the Value parameter.' + $_.CategoryInfo | Should Match "InvalidOperationException" + $_.FullyQualifiedErrorId | Should be "ValueShouldBeSpecified,Microsoft.PowerShell.Commands.UpdateTypeDataCommand" + } + } + + It "Update-TypeData with Invalid DynamicType with Empty TypeData should throw Exception"{ + try + { + Update-TypeData -TypeName System.String -EA Stop + Throw "Execution OK" + } + catch + { + $error[0] | Should Match 'No member is specified for the update on type "System.String".' + $_.CategoryInfo | Should Match "InvalidOperationException" + $_.FullyQualifiedErrorId | Should be "TypeDataEmpty,Microsoft.PowerShell.Commands.UpdateTypeDataCommand" + } + } + + It "Update-TypeData with Valid Standard Members Serialization Method String should work"{ + try{ + Update-TypeData -SerializationMethod string -StringSerializationSource Length -TargetTypeForDeserialization string -TypeName System.String + "string".PSStandardMembers.SerializationMethod | Should Be "String" + "string".PSStandardMembers.StringSerializationSource | Should Be 6 + "string".PSStandardMembers.TargetTypeForDeserialization | Should Be "string" + } + finally + { + Remove-TypeData System.String + } + } + + It "Update-TypeData with Valid Standard Members Serialization Method SpecificProperties should work"{ + try{ + Update-TypeData -SerializationMethod SpecificProperties -StringSerializationSource Length -PropertySerializationSet Length -InheritPropertySerializationSet $true -SerializationDepth 2 -TypeName System.String + "string".PSStandardMembers.SerializationMethod | Should Be "SpecificProperties" + "string".PSStandardMembers.StringSerializationSource | Should Be 6 + "string".PSStandardMembers.SerializationDepth | Should Be 2 + "string".PSStandardMembers.InheritPropertySerializationSet | Should Be "True" + } + finally + { + Remove-TypeData System.String + } + } + + It "Update-TypeData with Valid Standard Members Serialization Method AllPublicProperties should work"{ + try{ + Update-TypeData -SerializationMethod AllPublicProperties -StringSerializationSource Length -SerializationDepth 2 -TypeName System.String + "string".PSStandardMembers.SerializationMethod | Should Be "AllPublicProperties" + "string".PSStandardMembers.StringSerializationSource | Should Be 6 + "string".PSStandardMembers.SerializationDepth | Should Be 2 + } + finally + { + Remove-TypeData System.String + } + } + + It "Update-TypeData with Valid ISS UpdateType Command Test With DynamicType Set should work"{ + try{ + Update-TypeData -MemberType NoteProperty -MemberName "TestNote" -Value "test the note" -SerializationMethod SpecificProperties -SerializationDepth 5 -PropertySerializationSet Length -DefaultDisplayPropertySet Length -TypeName System.String + "string".TestNote | Should Be "test the note" + "string".PSStandardMembers.SerializationMethod | Should Be "SpecificProperties" + "string".PSStandardMembers.SerializationDepth | Should Be 5 + "string".PSStandardMembers.PropertySerializationSet.ReferencedPropertyNames[0] | Should Be "Length" + "string".PSStandardMembers.DefaultDisplayPropertySet.ReferencedPropertyNames[0] | Should Be "Length" + + Update-TypeData -MemberType NoteProperty -MemberName TestNote -Value "test the note again" -TargetTypeForDeserialization string -Force -TypeName System.String + "string".TestNote | Should Be "test the note again" + "string".PSStandardMembers.SerializationMethod | Should Be "SpecificProperties" + "string".PSStandardMembers.SerializationDepth | Should Be 5 + "string".PSStandardMembers.PropertySerializationSet.ReferencedPropertyNames[0] | Should Be "Length" + "string".PSStandardMembers.DefaultDisplayPropertySet.ReferencedPropertyNames[0] | Should Be "Length" + "string".PSStandardMembers.TargetTypeForDeserialization | Should Be "string" + } + finally + { + Remove-TypeData System.String + } + } + + It "Update-TypeData with Valid ISS UpdateType Command Test With StrongType Set should work"{ + try{ + Update-TypeData -TypeName System.Array -MemberType NoteProperty -MemberName TestNote -Value "TestNote" + Update-TypeData -TypeName System.Array -MemberType AliasProperty -MemberName TestAlias -Value "Length" + $script1={"script method"} + Update-TypeData -TypeName System.Array -MemberType ScriptMethod -MemberName TestScriptMethod -Value $script1 + $script2={$this.Length} + Update-TypeData -TypeName System.Array -MemberType ScriptProperty -MemberName TestScriptProperty -Value $script2 + Update-TypeData -TypeName System.Array -SerializationMethod AllPublicProperties -SerializationDepth 2 -StringSerializationSource Length -TargetTypeForDeserialization string + (1, 3).TestNote | Should Be "TestNote" + (1, 3).TestAlias | Should Be 2 + (1, 3).TestScriptMethod() | Should Be "script method" + (1, 3).TestScriptProperty | Should Be 2 + (1, 3).PSStandardMembers.SerializationMethod | Should Be "AllPublicProperties" + (1, 3).PSStandardMembers.SerializationDepth | Should Be 2 + (1, 3).PSStandardMembers.StringSerializationSource | Should Be 2 + (1, 3).PSStandardMembers.TargetTypeForDeserialization | Should Be "string" + } + finally + { + Remove-TypeData System.Array + } + } + + It "Update-TypeData with ISS Type Table API Test Add And Remove TypeData should work"{ + try{ + Update-TypeData -TypeName System.Object[] -MemberType NoteProperty -MemberName TestNote -Value "TestNote" + Update-TypeData -TypeName System.Object[] -MemberType AliasProperty -MemberName TestAlias -Value "Length" + $script1={"script method"} + Update-TypeData -TypeName System.Object[] -MemberType ScriptMethod -MemberName TestScriptMethod -Value $script1 + $script2={$this.Length} + Update-TypeData -TypeName System.Object[] -MemberType ScriptProperty -MemberName TestScriptProperty -Value $script2 + Update-TypeData -TypeName System.Object[] -SerializationMethod AllPublicProperties -SerializationDepth 2 -StringSerializationSource Length -TargetTypeForDeserialization string + (1, 3).TestNote | Should Be "TestNote" + (1, 3).TestAlias | Should Be 2 + (1, 3).TestScriptMethod() | Should Be "script method" + (1, 3).TestScriptProperty | Should Be 2 + (1, 3).PSStandardMembers.SerializationMethod | Should Be "AllPublicProperties" + (1, 3).PSStandardMembers.SerializationDepth | Should Be 2 + (1, 3).PSStandardMembers.StringSerializationSource | Should Be 2 + (1, 3).PSStandardMembers.TargetTypeForDeserialization | Should Be "string" + } + finally + { + Remove-TypeData System.Object[] + } + } + + It "Update-TypeData with Duplicate XML Files should work"{ + $xmlContent=@" + + + System.Array + + + Yada + Length + + + + +"@ + $xmlContent>$testfile + try + { + Update-TypeData -AppendPath $testfile + $a=1..3 + $a.Yada | Should Be 3 + } + finally + { + Remove-TypeData -Path $testfile + rm $testfile + } + } +} \ No newline at end of file