From 16f6601229486582ac00b012c864e830a91b869f Mon Sep 17 00:00:00 2001 From: Tadas Date: Thu, 15 Feb 2024 12:11:40 +0000 Subject: [PATCH 1/2] Add PSObject unwrapping for all Settings types --- Engine/Settings.cs | 12 +++++++----- Tests/Engine/Settings.tests.ps1 | 30 ++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Engine/Settings.cs b/Engine/Settings.cs index a4931978c..ca3c3bd2c 100644 --- a/Engine/Settings.cs +++ b/Engine/Settings.cs @@ -497,6 +497,13 @@ private static bool IsBuiltinSettingPreset(object settingPreset) internal static SettingsMode FindSettingsMode(object settings, string path, out object settingsFound) { var settingsMode = SettingsMode.None; + + // if the provided settings argument is wrapped in an expressions then PowerShell resolves it but it will be of type PSObject and we have to operate then on the BaseObject + if (settings is PSObject) + { + settings = ((PSObject)settings).BaseObject; + } + settingsFound = settings; if (settingsFound == null) { @@ -532,11 +539,6 @@ internal static SettingsMode FindSettingsMode(object settings, string path, out { settingsMode = SettingsMode.Hashtable; } - // if the provided argument is wrapped in an expressions then PowerShell resolves it but it will be of type PSObject and we have to operate then on the BaseObject - else if (settingsFound is PSObject settingsFoundPSObject) - { - TryResolveSettingForStringType(settingsFoundPSObject.BaseObject, ref settingsMode, ref settingsFound); - } } } diff --git a/Tests/Engine/Settings.tests.ps1 b/Tests/Engine/Settings.tests.ps1 index 2e95bdd04..917b4ed8e 100644 --- a/Tests/Engine/Settings.tests.ps1 +++ b/Tests/Engine/Settings.tests.ps1 @@ -377,4 +377,34 @@ Describe "Settings Class" { @{ Expr = ';)' } ) } + + Context "FindSettingsMode" { + BeforeAll { + $findSettingsMode = ($settingsTypeName -as [type]).GetMethod( + 'FindSettingsMode', + [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Static) + + $outputObject = [System.Object]::new() + } + + It "Should detect hashtable" { + $settings = @{} + $findSettingsMode.Invoke($null, @($settings, $null, [ref]$outputObject)) | Should -Be "Hashtable" + } + + It "Should detect hashtable wrapped by a PSObject" { + $settings = [PSObject]@{} # Force the settings hashtable to be wrapped + $findSettingsMode.Invoke($null, @($settings, $null, [ref]$outputObject)) | Should -Be "Hashtable" + } + + It "Should detect string" { + $settings = "" + $findSettingsMode.Invoke($null, @($settings, $null, [ref]$outputObject)) | Should -Be "File" + } + + It "Should detect string wrapped by a PSObject" { + $settings = [PSObject]"" # Force the settings string to be wrapped + $findSettingsMode.Invoke($null, @($settings, $null, [ref]$outputObject)) | Should -Be "File" + } + } } From 26d38cc67f7b7d598453ce70f0c8c55639a43397 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 20 Feb 2025 14:32:07 -0800 Subject: [PATCH 2/2] Update Engine/Settings.cs --- Engine/Settings.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Engine/Settings.cs b/Engine/Settings.cs index ca3c3bd2c..b0c424c64 100644 --- a/Engine/Settings.cs +++ b/Engine/Settings.cs @@ -499,9 +499,9 @@ internal static SettingsMode FindSettingsMode(object settings, string path, out var settingsMode = SettingsMode.None; // if the provided settings argument is wrapped in an expressions then PowerShell resolves it but it will be of type PSObject and we have to operate then on the BaseObject - if (settings is PSObject) + if (settings is PSObject settingsFoundPSObject) { - settings = ((PSObject)settings).BaseObject; + settings = settingsFoundPSObject.BaseObject; } settingsFound = settings;