diff --git a/src/System.Management.Automation/FormatAndOutput/common/FormatXMLWriter.cs b/src/System.Management.Automation/FormatAndOutput/common/FormatXMLWriter.cs index f027c7fa9e..fa481d6732 100644 --- a/src/System.Management.Automation/FormatAndOutput/common/FormatXMLWriter.cs +++ b/src/System.Management.Automation/FormatAndOutput/common/FormatXMLWriter.cs @@ -41,7 +41,12 @@ namespace Microsoft.PowerShell.Commands try { - using (XmlWriter xmlWriter = XmlWriter.Create(streamWriter)) + var settings = new XmlWriterSettings(); + settings.Indent = true; + settings.IndentChars = " "; + settings.NewLineOnAttributes = true; + + using (XmlWriter xmlWriter = XmlWriter.Create(streamWriter, settings)) { var writer = new FormatXmlWriter { diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Export-FormatData.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Export-FormatData.Tests.ps1 index 2920a21f4c..447a8ae402 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Export-FormatData.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Export-FormatData.Tests.ps1 @@ -1,11 +1,68 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -Describe "Export-FormatData DRT Unit Tests" -Tags "CI" { - It "Test basic functionality" { +Describe "Export-FormatData" -Tags "CI" { + BeforeAll { $fd = Get-FormatData - $tempFile = Join-Path $TestDrive -ChildPath "exportFormatTest.txt" - $results = Export-FormatData -InputObject $fd[0] -Path $tempFile - $content = Get-Content $tempFile + $testOutput = Join-Path -Path $TestDrive -ChildPath "outputfile" + } + + AfterEach { + Remove-Item $testOutput -Force -ErrorAction SilentlyContinue + } + + It "Can export all types" { + try + { + $fd | Export-FormatData -path $TESTDRIVE\allformat.ps1xml -IncludeScriptBlock + + $sessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault() + $sessionState.Formats.Clear() + $sessionState.Types.Clear() + + $runspace = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace($sessionState) + $runspace.Open() + + $runspace.CreatePipeline("Update-FormatData -AppendPath $TESTDRIVE\allformat.ps1xml").Invoke() + $actualAllFormat = $runspace.CreatePipeline("Get-FormatData -TypeName *").Invoke() + + $fd.Count | Should -Be $actualAllFormat.Count + Compare-Object $fd $actualAllFormat | Should -Be $null + } + finally + { + $runspace.Close() + Remove-Item -Path $TESTDRIVE\allformat.ps1xml -Force -ErrorAction SilentlyContinue + } + } + + It "Works with literal path" { + $filename = 'TestDrive:\[formats.ps1xml' + $fd | Export-FormatData -LiteralPath $filename + (Test-Path -LiteralPath $filename) | Should -BeTrue + } + + It "Should overwrite the destination file" { + $filename = 'TestDrive:\ExportFormatDataWithForce.ps1xml' + $unexpected = "SHOULD BE OVERWRITTEN" + $unexpected | Out-File -FilePath $filename -Force + $file = Get-Item $filename + $file.IsReadOnly = $true + $fd | Export-FormatData -Path $filename -Force + + $actual = @(Get-Content $filename)[0] + $actual | Should -Not -Be $unexpected + } + + It "should not overwrite the destination file with NoClobber" { + $filename = "TestDrive:\ExportFormatDataWithNoClobber.ps1xml" + $fd | Export-FormatData -LiteralPath $filename + + { $fd | Export-FormatData -LiteralPath $filename -NoClobber } | Should -Throw -ErrorId 'NoClobber,Microsoft.PowerShell.Commands.ExportFormatDataCommand' + } + + It "Test basic functionality" { + Export-FormatData -InputObject $fd[0] -Path $testOutput + $content = Get-Content $testOutput -Raw $formatViewDefinition = $fd[0].FormatViewDefinition $typeName = $fd[0].TypeName $content.Contains($typeName) | Should -BeTrue @@ -14,33 +71,86 @@ Describe "Export-FormatData DRT Unit Tests" -Tags "CI" { $content.Contains($formatViewDefinition[$i].Name) | Should -BeTrue } } -} -Describe "Export-FormatData" -Tags "CI" { - - $testOutput = Join-Path -Path $TestDrive -ChildPath "outputfile" - - AfterEach { - Remove-Item $testOutput -Force -ErrorAction SilentlyContinue + It "Should have a valid xml tag at the start of the file" { + $fd | Export-FormatData -Path $testOutput + $piped = Get-Content $testOutput -Raw + $piped[0] | Should -BeExactly "<" } - Context "Check Export-FormatData can be called validly." { - It "Should be able to be called without error" { - { Get-FormatData | Export-FormatData -Path $testOutput } | Should -Not -Throw - } - } + It "Should pretty print xml output" { + $xmlContent=@" + + + + ExportFormatDataName + + ExportFormatDataTypeName + + + + + + + + Guid + + + + + + + + +"@ + $expected = @" + + + + + ExportFormatDataName + + ExportFormatDataTypeName + + + + + + + + Guid + + + + + + + + +"@ -replace "`r`n?|`n", "" + try + { + $testfilename = [guid]::NewGuid().ToString('N') + $testfile = Join-Path -Path $TestDrive -ChildPath "$testfilename.ps1xml" + Set-Content -Path $testfile -Value $xmlContent - Context "Check that the output is in the correct format" { - It "Should not return an empty xml file" { - Get-FormatData | Export-FormatData -Path $testOutput - $piped = Get-Content $testOutput - $piped | Should -Not -BeNullOrEmpty - } + $sessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault() + $sessionState.Formats.Clear() + $sessionState.Types.Clear() - It "Should have a valid xml tag at the start of the file" { - Get-FormatData | Export-FormatData -Path $testOutput - $piped = Get-Content $testOutput - $piped[0] | Should -BeExactly "<" - } + $runspace = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace($sessionState) + $runspace.Open() + + $runspace.CreatePipeline("Update-FormatData -prependPath $testfile").Invoke() + $runspace.CreatePipeline("Get-FormatData -TypeName 'ExportFormatDataTypeName' | Export-FormatData -Path $testOutput").Invoke() + + $content = (Get-Content $testOutput -Raw) -replace "`r`n?|`n", "" + + $content | Should -BeExactly $expected + } + finally + { + $runspace.Close() + } } } diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/formatdata.tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/formatdata.tests.ps1 deleted file mode 100644 index ea3a89bd96..0000000000 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/formatdata.tests.ps1 +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. -Describe "FormatData" -tags "Feature" { - - Context "Export" { - It "can export all types" { - try - { - $expectAllFormat = Get-FormatData -typename * - $expectAllFormat | Export-FormatData -path $TESTDRIVE\allformat.ps1xml -IncludeScriptBlock - - $sessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault() - $sessionState.Formats.Clear() - $sessionState.Types.Clear() - - $runspace = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace($sessionState) - $runspace.Open() - - $runspace.CreatePipeline("Update-FormatData -AppendPath $TESTDRIVE\allformat.ps1xml").Invoke() - $actualAllFormat = $runspace.CreatePipeline("Get-FormatData -TypeName *").Invoke() - - $expectAllFormat.Count | Should -Be $actualAllFormat.Count - Compare-Object $expectAllFormat $actualAllFormat | Should -Be $null - $runspace.Close() - } - finally - { - Remove-Item -Path $TESTDRIVE\allformat.ps1xml -Force -ErrorAction SilentlyContinue - } - } - - It "works with literal path" { - $filename = 'TestDrive:\[formats.ps1xml' - Get-FormatData -TypeName * | Export-FormatData -LiteralPath $filename - (Test-Path -LiteralPath $filename) | Should -BeTrue - } - - It "should overwrite the destination file" { - $filename = 'TestDrive:\ExportFormatDataWithForce.ps1xml' - $unexpected = "SHOULD BE OVERWRITTEN" - $unexpected | Out-File -FilePath $filename -Force - $file = Get-Item $filename - $file.IsReadOnly = $true - Get-FormatData -TypeName * | Export-FormatData -Path $filename -Force - - $actual = @(Get-Content $filename)[0] - $actual | Should -Not -Be $unexpected - } - - It "should not overwrite the destination file with NoClobber" { - $filename = "TestDrive:\ExportFormatDataWithNoClobber.ps1xml" - Get-FormatData -TypeName * | Export-FormatData -LiteralPath $filename - - { Get-FormatData -TypeName * | Export-FormatData -LiteralPath $filename -NoClobber } | Should -Throw -ErrorId 'NoClobber,Microsoft.PowerShell.Commands.ExportFormatDataCommand' - } - } -}