diff --git a/.github/workflows/Action-Test-outputs.yml b/.github/workflows/Action-Test-outputs.yml index 2b5b418..c80fd80 100644 --- a/.github/workflows/Action-Test-outputs.yml +++ b/.github/workflows/Action-Test-outputs.yml @@ -16,11 +16,18 @@ permissions: {} jobs: ActionTestOutputs: - name: Action-Test [outputs] - [${{ matrix.os }}] + name: Action-Test [outputs/${{ matrix.fixture.name }}] - [${{ matrix.os }}] strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] + fixture: + - name: PSModuleTest + workingDirectory: tests/outputTestRepo + coveragePercentTarget: 30 + - name: PSModuleEnumOnly + workingDirectory: tests/outputEnumOnlyTestRepo + coveragePercentTarget: 0 runs-on: ${{ matrix.os }} steps: - name: Checkout repo @@ -32,7 +39,7 @@ jobs: uses: ./ id: action-test with: - Name: PSModuleTest - WorkingDirectory: tests/outputTestRepo + Name: ${{ matrix.fixture.name }} + WorkingDirectory: ${{ matrix.fixture.workingDirectory }} Settings: Module - CodeCoverage_CoveragePercentTarget: 30 + CodeCoverage_CoveragePercentTarget: ${{ matrix.fixture.coveragePercentTarget }} diff --git a/src/tests/Module/PSModule/PSModule.Tests.ps1 b/src/tests/Module/PSModule/PSModule.Tests.ps1 index 12c6141..318e875 100644 --- a/src/tests/Module/PSModule/PSModule.Tests.ps1 +++ b/src/tests/Module/PSModule/PSModule.Tests.ps1 @@ -93,12 +93,12 @@ Describe 'PSModule - Module tests' { BeforeAll { Import-Module -Name $moduleManifestPath -Force } - It 'Should register public enum [<_>] as a type accelerator' -ForEach $expectedEnumNames { + It 'Should register public enum [<_>] as a type accelerator' -ForEach $expectedEnumNames -AllowNullOrEmptyForEach { $registered = [psobject].Assembly.GetType('System.Management.Automation.TypeAccelerators')::Get $registered.Keys | Should -Contain $_ -Because 'the framework registers public enums as type accelerators' } - It 'Should register public class [<_>] as a type accelerator' -ForEach $expectedClassNames { + It 'Should register public class [<_>] as a type accelerator' -ForEach $expectedClassNames -AllowNullOrEmptyForEach { $registered = [psobject].Assembly.GetType('System.Management.Automation.TypeAccelerators')::Get $registered.Keys | Should -Contain $_ -Because 'the framework registers public classes as type accelerators' } diff --git a/tests/outputEnumOnlyTestRepo/outputs/module/PSModuleEnumOnly/PSModuleEnumOnly.psd1 b/tests/outputEnumOnlyTestRepo/outputs/module/PSModuleEnumOnly/PSModuleEnumOnly.psd1 new file mode 100644 index 0000000..d968958 --- /dev/null +++ b/tests/outputEnumOnlyTestRepo/outputs/module/PSModuleEnumOnly/PSModuleEnumOnly.psd1 @@ -0,0 +1,36 @@ +@{ + RootModule = 'PSModuleEnumOnly.psm1' + ModuleVersion = '999.0.0' + CompatiblePSEditions = @( + 'Core' + 'Desktop' + ) + GUID = 'b1c8c046-2253-4f30-8e08-e98a222a954a' + Author = 'PSModule' + CompanyName = 'PSModule' + Copyright = '(c) 2024 PSModule. All rights reserved.' + Description = 'Fixture module with enum type accelerators and no class type accelerators.' + PowerShellVersion = '5.1' + ProcessorArchitecture = 'None' + FunctionsToExport = @() + CmdletsToExport = @() + VariablesToExport = @() + AliasesToExport = @() + FileList = @( + 'PSModuleEnumOnly.psd1' + 'PSModuleEnumOnly.psm1' + ) + PrivateData = @{ + PSData = @{ + Tags = @( + 'workflow' + 'powershell' + 'powershell-module' + 'PSEdition_Desktop' + 'PSEdition_Core' + ) + LicenseUri = 'https://github.com/PSModule/Test-PSModule/blob/main/LICENSE' + ProjectUri = 'https://github.com/PSModule/Test-PSModule' + } + } +} \ No newline at end of file diff --git a/tests/outputEnumOnlyTestRepo/outputs/module/PSModuleEnumOnly/PSModuleEnumOnly.psm1 b/tests/outputEnumOnlyTestRepo/outputs/module/PSModuleEnumOnly/PSModuleEnumOnly.psm1 new file mode 100644 index 0000000..3572478 --- /dev/null +++ b/tests/outputEnumOnlyTestRepo/outputs/module/PSModuleEnumOnly/PSModuleEnumOnly.psm1 @@ -0,0 +1,48 @@ +[CmdletBinding()] +param() + +enum ModuleLifecycle { + Loaded + Removed +} + +#region Class exporter +$TypeAcceleratorsClass = [psobject].Assembly.GetType( + 'System.Management.Automation.TypeAccelerators' +) +$ExistingTypeAccelerators = $TypeAcceleratorsClass::Get +$ExportableEnums = @( + [ModuleLifecycle] +) +$ExportableEnums | ForEach-Object { Write-Verbose "Exporting enum '$($_.FullName)'." } +foreach ($Type in $ExportableEnums) { + if ($Type.FullName -in $ExistingTypeAccelerators.Keys) { + Write-Verbose "Enum already exists [$($Type.FullName)]. Skipping." + } else { + Write-Verbose "Importing enum '$Type'." + $TypeAcceleratorsClass::Add($Type.FullName, $Type) + } +} +$ExportableClasses = @( +) +$ExportableClasses | ForEach-Object { Write-Verbose "Exporting class '$($_.FullName)'." } +foreach ($Type in $ExportableClasses) { + if ($Type.FullName -in $ExistingTypeAccelerators.Keys) { + Write-Verbose "Class already exists [$($Type.FullName)]. Skipping." + } else { + Write-Verbose "Importing class '$Type'." + $TypeAcceleratorsClass::Add($Type.FullName, $Type) + } +} + +$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = { + $CurrentTypeAccelerators = $TypeAcceleratorsClass::Get + foreach ($Type in ($ExportableEnums + $ExportableClasses)) { + if ($CurrentTypeAccelerators[$Type.FullName] -eq $Type) { + $null = $TypeAcceleratorsClass::Remove($Type.FullName) + } + } +}.GetNewClosure() +#endregion Class exporter + +Export-ModuleMember -Function @() -Alias @() -Variable @() \ No newline at end of file diff --git a/tests/outputEnumOnlyTestRepo/tests/.gitkeep b/tests/outputEnumOnlyTestRepo/tests/.gitkeep new file mode 100644 index 0000000..9317287 --- /dev/null +++ b/tests/outputEnumOnlyTestRepo/tests/.gitkeep @@ -0,0 +1 @@ +Tracks the fixture tests directory required by the action setup step. \ No newline at end of file